gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 09:48:19 25 4
gpt4 key购买 nike

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

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

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

谢谢,杰夫

最佳答案

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

如果您没有使用顶点着色器,而只是使用固定功能的顶点处理,那么可以肯定的是片段着色器只被赋予了颜色。请记住,片段着色器会覆盖所有 per-fragment 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);
}

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

关于Java OpenGL 将片段着色器应用于部分透明纹理映射四边形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6312610/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com