我使用LWJGL尝试制作3D游戏,但我遇到了一个我无法自行解决的错误。每当我运行程序时,我都会收到错误:
java.lang.Exception:编译着色器代码时出错:2
我自己设置了这个错误以提醒我,如果着色器无法编译,它似乎每次都在做,我无法理解为什么。
public static String loadResource(String file) throws Exception{
BufferedReader reader = new BufferedReader(new FileReader(new File(file)));
String out = "";
String s = reader.readLine();
while (s != null){
out += s + "\n";
s = reader.readLine();
}
reader.close();
return out;
}
这是我用来加载着色器代码文本并将其放入字符串的方法。之后我已要求它打印出来,据我所知,它没有任何问题。
public void createVertexShader(String shaderCode) throws Exception{
vertexShaderId = createShader(shaderCode, GL_VERTEX_SHADER);
}
public void createFragmentShader(String shaderCode) throws Exception {
vertexShaderId = createShader(shaderCode, GL_FRAGMENT_SHADER);
}
上述两种方法使用以下方法创建顶点和片段着色器:
public int createShader(String shaderCode, int shaderType) throws Exception {
int shaderId = glCreateShader(shaderType);
if(shaderId == 0){
throw new Exception("Error creating shader code: " + shaderId);
}
glShaderSource(shaderId, shaderCode);
glCompileShader(shaderId);
if(glGetShaderi(shaderId, GL_COMPILE_STATUS) == 0){
throw new Exception("Error compiling shader code: " + shaderId);
}
glAttachShader(programId, shaderId);
return shaderId;
}
创建着色器时没有错误,但是当我检查它是否已正确编译时,它会抛出异常并停止我的程序。这是我的顶点和片段着色器:
vertex.vs
#version 150
layout (location=0) in vec3 pos;
void main()
{
gl_Position = vec4(position, 1.0);
}
fragment.fs
#version 150
out vec4 fragColor;
void main()
{
fragColor = vec4(0.0, 0.5, 0.5, 1.0);
}
我已经验证我在着色器中使用了正确的GLSL版本,但是我从教程中获得了实际的着色器代码,因此我不知道语法是否严格正确。
答案 0 :(得分:2)
layout (location=0) in vec3 pos;
此行将为您提供#version 150或更低版本的语法错误。在顶点着色器中尝试#version 330或更高版本。
此外,在顶点着色器中pos
和position
是不同的符号,您无法为position
提供定义。