4

在我的程序中,我使用 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 纹理)?

4

1 回答 1

8

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

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

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

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

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

于 2013-03-07T15:51:04.177 回答