GLSL顶点着色器未编译

时间:2016-07-20 18:11:00

标签: java opengl glsl lwjgl

我使用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版本,但是我从教程中获得了实际的着色器代码,因此我不知道语法是否严格正确。

1 个答案:

答案 0 :(得分:2)

layout (location=0) in vec3 pos;此行将为您提供#version 150或更低版本的语法错误。在顶点着色器中尝试#version 330或更高版本。

此外,在顶点着色器中posposition是不同的符号,您无法为position提供定义。