首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GLSL:启用/禁用纹理+着色器

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

Stack Overflow用户
提问于 2009-05-19 19:31:17
回答 2查看 6.7K关注 0票数 4

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

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

顶点:

代码语言:javascript
复制
void    main()
{
    gl_FrontColor = gl_Color;
    gl_TexCoord[0] = gl_MultiTexCoord0;
    gl_Position = ftransform();
}

片段:

代码语言:javascript
复制
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)?的情况下在它们之间切换,处理速度会更快吗

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-05-19 19:59:06

很抱歉,您不能从GLSL访问这种状态,句号。

事实上,在未来的GLSL中,你必须自己发送所有的unform/属性,即没有自动的gl_ModelViewMatrix、gl_LightPosition、gl_Normal或类似的东西。只有像gl_Position和gl_FragColor这样的基本功能才是可用的。

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

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

票数 8
EN

Stack Overflow用户

发布于 2012-02-04 02:38:11

我见过的一种方法是在渲染没有纹理的多边形时,将1x1纹理与(1.0,1.0,1.0,1.0)的单个纹理像素绑定。纹理切换应该比材质球切换更便宜,并且1x1纹理将完全适合纹理缓存。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/884607

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档