gpt4 book ai didi

opengl - GLSL:启用/禁用纹理+着色器

转载 作者:行者123 更新时间:2023-12-02 02:37:56 25 4
gpt4 key购买 nike

我正在寻找一种从着色器访问 OpenGL 状态的方法。 GLSL Quick Reference Guide ,一个很棒的资源,但在这方面并不能真正帮助我。

在我正在处理的示例中,我有以下两个着色器:

顶点:

void    main()
{
gl_FrontColor = gl_Color;
gl_TexCoord[0] = gl_MultiTexCoord0;
gl_Position = ftransform();
}

片段:

uniform sampler2D   tex;
uniform float flattening;

void main( void )
{
vec4 texel;
texel = texture2D(tex, gl_TexCoord[0].st);
texel.r *= gl_Color.r;
texel.g *= gl_Color.g;
texel.b *= gl_Color.b;
texel.a *= gl_Color.a;
gl_FragColor = texel;
}

当我渲染没有纹理的多边形时,它们的 Alpha 值是正确的,但它们被指定为黑色。

1,我可以设置什么条件检查,以便在 GL_TEXTURE_2D 时将变量“texel”设置为 vec4(1.0, 1.0, 1.0, 1.0) 而不是从纹理中采样 被禁用?

2,如果我为不同的纹理模式编写不同的着色器并在它们之间切换,我将使用 glEnable/glDisable(GL_TEXTURE_2D)?

最佳答案

抱歉,您无法从 GLSL 访问这种状态,就这样。

事实上,在未来的 GLSL 中,你必须自己发送所有 unforms/attributes,即没有自动的 gl_ModelViewMatrix、gl_LightPosition、gl_Normal 等。只有像 gl_Position 和 gl_FragColor 这样的基本内容可用。

这样就解决了你的第二个问题,但如果你发现这比为不同纹理模式编写单独的着色器更方便,你总是可以使用 #ifdef 来启用/禁用着色器中的部分。

相关,请注意,分支通常相当慢,因此如果您需要速度,请尽可能避免它。 (这对于不规则的动态分支尤其重要,因为片段在 SIMD block 中处理,并且 block 中的所有片段必须计算相同的指令,即使它们仅适用于一个或几个片段。)

关于opengl - GLSL:启用/禁用纹理+着色器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/884607/

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