在我的程序中,我使用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)和赢得XP(GTX 260)的电脑上进行了测试。
所以我的问题是:使用带有0作为第二个参数的glBindTexture是正确的,以及如何使用新驱动程序实现相同的结果(0000纹理)?
答案 0 :(得分:7)
以下所有内容均指核心配置文件3.2,但通常适用于所有版本的GL。
名称0对应于默认纹理对象(每个纹理目标一个:1d,2d,...见3.8.14,最后一段)。
因此glBindtexture(2D, 0);
会为您提供默认纹理对象。它不意味着禁用纹理。现在,从默认对象进行纹理化会导致通常的操作,就在您自己没有创建的纹理对象上。初始纹理对象最初是不完整的,因此除非您修改它,否则它将遵循“不完整”规则。
现在规范说(3.9.2,纹理访问段落)从不完整纹理中采样将返回(0,0,0,1)。
所以你的老司机没有按照规范行事。