【问题标题】:Java Opengl: Discarding Texture Background with ShadersJava Opengl:使用着色器丢弃纹理背景
【发布时间】:2015-10-15 12:54:33
【问题描述】:

我正在尝试按照本教程使用着色器移除纹理的背景颜色。 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”转换为“4-component vector of float”

我用我的纹理和 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);

【问题讨论】:

  • 您的目标是哪个 OpenGL 版本?基本上必须在 sampler2D 前面添加一个“制服”。
  • @BDL:That tutorial targets ARB_shading_language_100。尽管即使在ARB_shading_language_100 中,采样器也需要uniform,但也许教程作者使用的是非常 许可的“GLSL”编译器。
  • 哇,那是一个非常古老的版本:)
  • @BDL:是的。那一个关键字修复了所有错误。我不明白 /how/ 但我会接受它的本质。把它放在答案中,我会接受。
  • 一个问题是着色器似乎适用于一切,我不能通过使用 glUseProgram(0) 来“停止使用着色器”,这显然是应该起作用的。有没有办法在着色图像后停止着色器?

标签: opengl textures shader lwjgl color-key


【解决方案1】:

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

uniform sampler2D myTexture;

【讨论】:

  • 您不会碰巧知道如何在图像渲染后停止着色器?推/弹出矩阵似乎没有做到这一点,而 glUseProgram(0) 使它根本没有阴影。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-07
  • 1970-01-01
  • 2016-01-10
  • 1970-01-01
  • 1970-01-01
  • 2022-11-18
相关资源
最近更新 更多