【问题标题】:Java OpenGL apply fragment shader to partially transparent texture mapped quadJava OpenGL 将片段着色器应用于部分透明的纹理映射四边形
【发布时间】:2011-06-10 22:16:24
【问题描述】:

我正在绘制一个纹理映射四边形,其纹理上有一些透明像素。所以,我加载纹理然后绘制它

    gl.glEnable(GL.GL_ALPHA_TEST);
    gl.glAlphaFunc(GL.GL_GREATER,0);
    gl.glBindTexture(GL.GL_TEXTURE_2D, texture);
    gl.glTexImage2D(GL.GL_TEXTURE_2D, 0, GL.GL_RGBA, width, height, 0, GL.GL_RGBA, GL.GL_UNSIGNED_BYTE, buff);
    gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MIN_FILTER, GL.GL_LINEAR);
    gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MAG_FILTER, GL.GL_LINEAR);
    gl.glTexEnvi(GL.GL_TEXTURE_ENV, GL.GL_TEXTURE_ENV_MODE, GL.GL_REPLACE);
    gl.glColor4i(1,1,1,1);
    gl.glBegin(GL.GL_QUADS);
    // draw my quad here
    gl.glEnd():

当我画这个时,透明像素没有按预期显示。但是,我想应用片段着色器。在这种情况下,我将测试一些简单的东西:

void main() {
  gl_FragColor = vec4(0.0);
  if ( gl_Color.a > 0.0 ) { 
    gl_FragColor = vec4(1.0,0,0,1.0); 
  }
}

在这种情况下,所有像素都应显示为红色,而不仅仅是不透明的像素。有人能解释一下如何使用着色器为不透明的像素上色吗?

谢谢, 杰夫

【问题讨论】:

    标签: java opengl shader jogl texture-mapping


    【解决方案1】:

    gl_Color 是顶点着色器输出的颜色。除非您的顶点着色器为您提取纹理,否则您的顶点着色器可能会通过 gl_FrontColor 将颜色属性直接传递给片段着色器。

    如果您不使用顶点着色器,而只是使用固定功能的顶点处理,那么可以确定片段着色器只被赋予了颜色。请记住,片段着色器会覆盖 all 每个片段的 glTexEnv 操作,包括获取纹理。

    如果你想测试纹理的不透明度,那么你需要自己从纹理中获取。这需要使用sampler2D 对象和texture2D 函数(假设您使用的是GLSL 1.20 版。如果您使用的是更高版本,则需要texture 函数)。我已经有一段时间没有使用 OpenGL 的内置输入和输出做任何事情了,但是着色器看起来像这样:

    #version 120
    uniform sampler2D myTexture;
    
    void main()
    {
        gl_FragColor = vec4(0.0);
        vec4 texColor = texture2D(myTexture, gl_TexCoord[0]); //Assuming you're using texture coordinate 0.
        if(texColor.a < 1.0)
            gl_FragColor = vec4(1.0,0,0,1.0);
    }
    

    您还必须将程序统一的值设置为您正在使用的纹理单元。不过,您必须查一下。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多