Java Opengl:使用着色器丢弃纹理背景

Java Opengl: Discarding Texture Background with Shaders

我正在尝试按照本教程使用着色器去除纹理的背景颜色。 https://www.opengl.org/sdk/docs/tutorials/ClockworkCoders/discard.php

一切都运行正确,我直接从教程中复制了着色器代码,但是片段着色器抛出了几个错误。

sampler2D myTexture;
           varying vec2 vTexCoord;
void main (void) 
{  
   vec4 color = texture2D(myTexture, vTexCoord); 

    if (color.rgb == vec3(1.0,0.0,0.0))
      discard; 

   gl_FragColor = color;
}

错误:0:3:'sampler2D':采样器必须均匀
错误:0:7:'myTexture':未声明的标识符
错误:0:7:'vTexCoord':未声明的标识符
错误:0:7:'texture2D':未找到匹配的重载函数(使用隐式转换)
错误:0:7:“=”:无法从 'const float' 转换为“float 的 4 分量向量”

我用我的纹理和 Vec2 替换了未声明的标识符,但它们仍然无法识别。我猜他们必须以某种方式加载。

这可能就是引发“...没有匹配的重载...”错误的原因。另外两个我没看懂,代码直接来自教程,理论上应该不会出现这样的问题。

我的 lwjgl 版本是 2.9.1

相关来源如下:

    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(true){
            line = reader.readLine();

            if(line == null){
                break;
            }

            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");
    }

    System.out.println("Shader.frag Error Log\n" + glGetShaderInfoLog(fragmentShader, 1024));

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

Uniform variables in GLSL 必须以 uniform 关键字开头。所以要解决所有问题,请将第一行替换为

uniform sampler2D myTexture;