我正在绘制纹理贴图四边形,其纹理上有一些透明像素。所以,我加载纹理,然后绘制它
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);
}
}
在这种情况下,所有像素都应该为红色,而不仅仅是非透明像素。有人可以解释如何使用着色器为非透明像素着色吗?
感谢, 杰夫
答案 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);
}
您还必须将程序统一的值设置为您正在使用的纹理单元。你不得不看那个。