【问题标题】:Binding a zero texture in OpenGL在 OpenGL 中绑定零纹理
【发布时间】:2013-02-22 19:09:05
【问题描述】:

在我的程序中,我使用了 2 个纹理:t0 和 t1。 t1 是额外的,仅在某些情况下需要:

.....
glActiveTexture ( GL_TEXTURE1 );
if ( mDisplayMode == EDM_DEFAULT ){
    glBindTexture( GL_TEXTURE_2D, 0 ); // In this case I don't need t1
}else{
    glBindTexture( GL_TEXTURE_2D, mglDegreeTexture ); // In this case t1 will overlap t0
}
shader->setUniformValue( "textureId1", 1 );

绘图着色器:

.....
vec4 c1 = texture( textureId0, uv );
vec4 c2 = texture( textureId1, gridUV );
float a = c2.a;
gl_FragColor = ( 1.0 - a )*c1 + a*c2;

效果很好:第二个纹理在需要时首先重叠。假设使用 glBindTexture( .. , 0 ) 返回零纹理 (0,0,0,0),但在将 NVidia 驱动程序更新到 314.07 后,我的代码会产生黑屏,例如 glBindTexture( .. , 0 ) 返回 (0,0 ,0,1) 纹理。

我进行了一些测试: 带着色器

....
vec4 c1 = texture( textureId0, uv );
vec4 c2 = texture( textureId1, gridUV );
float a = c2.a;
if (a == 1){
    gl_FragColor = vec4(1,0,0,0);
    return;
}
if ( a == 0){
    gl_FragColor = vec4(0,1,0,0);
    return;
}
gl_FragColor = ( 1.0 - a )*c1 + a*c2;

我在旧驱动程序(296、306)上显示绿屏,在新驱动程序上显示红屏。我在 2 台装有 Win 7 (GeForce 210) 和 win XP (GTX 260) 的计算机上对其进行了测试。

所以我的问题是:使用 0 作为第二个参数的 glBindTexture 是否正确,以及如何使用新驱动程序实现相同的结果( 0000 纹理)?

【问题讨论】:

    标签: opengl texturing


    【解决方案1】:

    以下所有内容均指核心配置文件 3.2,但通常适用于所有版本的 GL。

    名称 0 对应于默认纹理对象(每个纹理目标一个:1d、2d、...参见 3.8.14,最后一段)。

    所以glBindtexture(2D, 0); 为您获取默认纹理对象。它确实 not 意味着禁用纹理。现在,默认对象的纹理会产生通常的操作,只是在您自己没有创建的纹理对象上。初始纹理对象最初是不完整的,因此除非您对其进行修改,否则它将遵循“不完整”规则。

    现在规范说(3.9.2,纹理访问段落)从不完整的纹理中采样将返回 (0,0,0,1)。

    所以你的老司机没有按照规范行事。

    【讨论】:

    • 太棒了!使用 (0,0,0,0) 作为“零”纹理是如此合乎逻辑;(我不知道有没有办法定义默认纹理?
    • @Jeka:它和其他​​纹理一样,所以如果你将它设置为例如1x1 RGBA 纹理,其内容为具有 0,0,0,0 的单个纹素,它将满足您的需求。以这种方式使用它并不常见,因此您可能会混淆阅读您的代码的任何人(哦,可能会发现更多驱动程序错误)
    • 看起来很有趣 ;) 1x1 RGBA 纹理是我目前的解决方案,但我不尝试将其与 0 绑定
    猜你喜欢
    • 2011-07-13
    • 2013-09-07
    • 1970-01-01
    • 2015-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-21
    相关资源
    最近更新 更多