Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl GLSL:启用/禁用纹理+;着色器_Opengl_Shader_Glsl_Texturing - Fatal编程技术网

Opengl GLSL:启用/禁用纹理+;着色器

Opengl GLSL:启用/禁用纹理+;着色器,opengl,shader,glsl,texturing,Opengl,Shader,Glsl,Texturing,我正在寻找一种从着色器访问OpenGL状态的方法。这个,一个很棒的资源,在这个问题上真的帮不了我 在我正在处理的示例中,我有以下两个着色器: 顶点: void main() { gl_FrontColor = gl_Color; gl_TexCoord[0] = gl_MultiTexCoord0; gl_Position = ftransform(); } 片段: uniform sampler2D tex; uniform float flatteni

我正在寻找一种从着色器访问OpenGL状态的方法。这个,一个很棒的资源,在这个问题上真的帮不了我

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

顶点:

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\u texture\u 2D
时,我可以设置什么条件检查,以便将变量“texel”设置为
vec4(1.0、1.0、1.0、1.0)
而不是从纹理采样


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

对不起,您不能从GLSL访问这种状态,句号

事实上,在未来的GLSL中,您必须自己发送所有未格式化/属性,即没有automagic gl_ModelViewMatrix、gl_LightPosition、gl_Normal等。只有像gl_Position和gl_FragColor这样的基本资料可用

这样就没有第二个问题了,但如果您发现启用/禁用着色器中的部分比为不同纹理模式编写单独的着色器更方便,则始终可以使用#ifdef启用/禁用着色器中的部分


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

我见过的一种方法是将1x1纹理与(1.0、1.0、1.0、1.0)的单个纹理绑定渲染没有纹理的多边形时。纹理开关应该比着色器开关便宜,1x1纹理将完全适合纹理缓存。

简短说明:您可以编写texel*=gl\u Color;作为一个矢量运算而不是4个标量运算。谢谢,它是硬件加速的吗?这不是一个函数调用和4个标量操作对4个标量操作吗?它是加速的(如果您没有在软件中运行所有着色器,在这种情况下,您的每帧区域为int秒),但没有额外的函数调用。的确,它仍然是4个标量运算(在现代GPU上),我只是把它看作是一个向量运算,但这样做也更容易理解和调试代码。(GLSL编译器大量内联操作,以避免函数调用开销。)这确实是一个向量运算(=所有4个乘法都是并行计算的),如果可能的话,您应该始终尝试对标量操作进行分组。GLSL编译器可能会将4个独立的操作优化为一个,但我不会指望它。感谢您的深入回答。我刚刚意识到(除此之外,我遇到了思维墙),我可以为启用/禁用声明一个统一的bool,并将相关调用路由到该bool。这是可行的,但不会很快。