【发布时间】:2010-10-27 10:38:24
【问题描述】:
我正在寻找一种从着色器访问 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),处理会更快吗?
【问题讨论】:
-
简短说明:你可以写 texel *= gl_Color;作为一个向量运算而不是 4 个标量运算。
-
谢谢,它是硬件加速的吗?这不是一个函数调用和 4 个标量操作 vs 4 个标量操作吗?
-
它是加速的(如果你没有在软件中运行所有着色器,在这种情况下你是 int seconds-per-frame 领域),但没有额外的函数调用。诚然,它仍然是 4 个标量操作(在现代 GPU 上),我只是将其视为向量操作,但以这种方式跟踪和调试代码也容易得多。 (GLSL 编译器非常内联,以避免函数调用开销。)
-
这确实是一个向量运算(=所有 4 个乘法都是并行计算的),如果可能,您应该始终尝试对标量运算进行分组。 GLSL 编译器可能会将 4 个单独的操作优化为一个,但我不会指望它。
标签: opengl shader glsl texturing