片段着色器无法编译

Fragment shader won't compile

我正在尝试使用本教程中的着色器: https://www.opengl.org/sdk/docs/tutorials/ClockworkCoders/discard.php

我将源代码复制到两个文件中,但都无法编译。

这是我的代码:

    shaderProgram = glCreateProgram();
    vertexShader  = glCreateShader(GL_VERTEX_SHADER);
    fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);

    StringBuilder vertexShaderSource   = new StringBuilder();
    StringBuilder fragmentShaderSource = new StringBuilder();

    try{
        BufferedReader reader = new BufferedReader(new FileReader("src/shader.vert"));
        String line;
        line = reader.readLine();

        while(line != null){
            line = reader.readLine();

            if(line != null){
                vertexShaderSource.append(line).append('\n');
            }
        }
        reader.close();


    } catch (IOException e) {
        System.err.println("Vertex no load.");
        Display.destroy();
        System.exit(1);
    }

    try{
        BufferedReader reader = new BufferedReader(new FileReader("src/shader.frag"));
        String line;
        line = reader.readLine();

        while(line != null){
            line = reader.readLine();

            if(line != null){
                fragmentShaderSource.append(line).append('\n');
            }
        }
        reader.close();


    } catch (IOException e) {
        System.err.println("Frag no load.");
        Display.destroy();
        System.exit(1);
    }
    System.out.println(fragmentShaderSource);


    glShaderSource(vertexShader, vertexShaderSource);
    glCompileShader(vertexShader);
    if(glGetShader(vertexShader, GL_COMPILE_STATUS) == GL_FALSE){
        System.err.println("Vertex no compile");
    }
    glShaderSource(fragmentShader, fragmentShaderSource);
    glCompileShader(fragmentShader);
    if(glGetShader(fragmentShader, GL_COMPILE_STATUS) == GL_FALSE){
        System.err.println("frag no compile");
    }


    glAttachShader(shaderProgram, vertexShader);
    glAttachShader(shaderProgram, fragmentShader);
    glLinkProgram(shaderProgram);
    glValidateProgram(shaderProgram);

我以前使用过着色器,所以它不是设置(据我所知),但是当我复制和粘贴时,两个文件都无法再编译。

是不是我的设置有问题?

编辑 >>>

我似乎无法导入 glGetShaderiv

我正在使用 LWJGL 并从那里导入所有内容。我可能缺少 JAR 文件吗?

编辑 >>>

相关问题:

您读取的源文件不正确。

line = reader.readLine();

while(line != null){
    line = reader.readLine();

    if(line != null){
        fragmentShaderSource.append(line).append('\n');
    }
}

在这里,您首先阅读文件的第一行。如果它不为空,则继续读取行并将它们附加到缓冲区。但是,您实际上并没有在循环外的 readLine() 语句之后附加该行,这意味着它被丢弃并且着色器编译器得到一个缺少第一行的源文件。因此它不知道 varying vec2 vTexCoord;sampler2D myTexture;,稍后在代码中使用它们时会引发编译器错误。

有几种方法可以解决此问题:

  1. line = reader.readLine();
    if (line != null) {
        fragmentShaderSource.append(line).append('\n');
    }
    
    while (line != null) {
        // ...
    }
    
  2. while (true) {
        line = reader.readLine();
    
        if (line == null) {
            break;
        }
    
        fragmentShaderSource.append(line).append('\n');
    }
    
  3. while ((line = reader.readLine()) != null) {
        fragmentShaderSource.append(line).append('\n');
    }
    

使用哪一个取决于您的喜好。 1 包含冗余代码,这几乎不是最佳解决方案。 2是常用的读取任意文件的方式;虽然 3 更短,但有些人不喜欢在循环控制语句中分配变量。