Я следую руководству in2gpu.com по OpenGL, и я застрял на шейдерной части. Я читал на форумах об ошибке, но нахожу только случаи, когда люди использовали vec3 как vec4, отсюда и ошибка, но я не думаю, что сделал эту ошибку, по крайней мере, не то, что мне удалось увидеть:
Вершинный шейдер:
#version 430
void main(void) {
vec4 vertices[3];
vertices[0] = vec4( 0.25, -0.25, 0.5, 1.0);
vertices[1] = vec4(-0.25, -0.25, 0.5, 1.0);
vertices[2] = vec4( 0.25, 0.25, 0.5, 1.0);
gl_Position = vertices[gl_VertexID];
}
Фрагментный шейдер:
#version 430
out vec3 color;
void main(void) {
color = vec4(0.0, 1.0, 0.0, 1.0);
}
Ошибка:
Vertex shader failed to compile with the following errors:
ERROR: 0:6: error(#160) Cannot convert from: "const highp 4-component vector of vec4" to: "default out highp 3-component vector of vec3"
ERROR: error(#273) 1 compilation errors. No code generated
Could not compile shader!
Я пробовал преобразовать данные вершины вот так:
gl_Position = vec4(vertices[gl_VertexID]);
glPosition = vec3(vertices[glVertexID].xyz); (Incase gl_Position was actually a vec3)
но безуспешно.
Любая помощь приветствуется!
РЕДАКТИРОВАТЬ: загрузчик шейдеров -
public class ShaderLoader {
public static int createShader(String vertexShaderSource, String fragmentShaderSource) {
int vertex_shader = loadShader(vertexShaderSource, GL20.GL_VERTEX_SHADER);
int fragment_shader = loadShader(fragmentShaderSource, GL20.GL_FRAGMENT_SHADER);
int link_result = 0;
int programID = GL20.glCreateProgram();
GL20.glAttachShader(programID, vertex_shader);
GL20.glAttachShader(programID, fragment_shader);
GL20.glLinkProgram(programID);
GL20.glValidateProgram(programID);
GL20.glGetProgrami(programID, link_result);
if(link_result == GL11.GL_FALSE) {
System.out.println("Could not link program!");
System.exit(0);
}
return programID;
}
public static int loadShader(String filename, int type) {
StringBuilder builder = new StringBuilder();
try {
BufferedReader reader = new BufferedReader(new FileReader("src/shaders/" + filename));
String line;
while((line = reader.readLine()) != null) {
builder.append(line).append("\n");
}
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
int shaderID = GL20.glCreateShader(type);
GL20.glShaderSource(shaderID, builder);
GL20.glCompileShader(shaderID);
if(GL20.glGetShaderi(shaderID, GL20.GL_COMPILE_STATUS) == GL11.GL_FALSE) {
System.out.println(GL20.glGetShaderInfoLog(shaderID, 500));
System.out.println("Could not compile shader!");
System.exit(0);
}
return shaderID;
}
}
И в моем основном классе я использую это для его инициализации:
int shaderProgram = ShaderLoader.createShader("vertexShader.txt", "fragmentShader.txt");
РЕДАКТИРОВАТЬ2:
Чтобы проверить, поменялись ли шейдеры местами, я добавил это в myloadShader()
:
if(type == GL20.GL_VERTEX_SHADER) {
System.out.println("Vertex: \n" + builder);
} else if(type == GL20.GL_FRAGMENT_SHADER) {
System.out.println("Fragment: \n" + builder);
}
Вывод:
Vertex:
#version 430
void main(void) {
vec4 vertices[3];
vertices[0] = vec4( 0.25, -0.25, 0.5, 1.0);
vertices[1] = vec4(-0.25, -0.25, 0.5, 1.0);
vertices[2] = vec4( 0.25, 0.25, 0.5, 1.0);
gl_Position = vertices[gl_VertexID];
}
Fragment:
#version 430
out vec4 color;
void main(void) {
color = vec4(0.0, 1.0, 0.0, 1.0);
}
glValidateProgram
без проверки результата бесполезно. Я также сомневаюсь, что он делает то, что вы ожидаете:glValidateProgram
проверяет, возможна ли команда рисования с текущим состоянием. Это, например, также приведет к ошибке, если VAO отсутствует, связанные сэмплеры не соответствуют программе и так далее. Он НЕ проверяет, успешно ли скомпилирована / скомпилирована программа. - person BDL   schedule 28.11.2017