Java OpenGL将片段着色器应用于部分透明纹理映射四元组

时间:2011-06-10 22:16:25

标签: java opengl shader jogl texture-mapping

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

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

在这种情况下,所有像素都应该为红色,而不仅仅是非透明像素。有人可以解释如何使用着色器为非透明像素着色吗?

感谢, 杰夫

1 个答案:

答案 0 :(得分:2)

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

如果你没有使用顶点着色器,只使用固定函数顶点处理,那么可以确定片段着色器只有颜色。请记住,片段着色器会覆盖所有每片段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);
}

您还必须将程序统一的值设置为您正在使用的纹理单元。你不得不看那个。