在我的程序中,我使用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 );
Shader for drawing:
.....
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)的屏幕是绿屏,新司机的屏幕是红屏。我在Win 7 (GeForce 210)和Win XP (GTX 260)的两台电脑上进行了测试。
所以我的问题是:使用glBindTexture与0作为第二个参数是正确的,以及我如何能够实现相同的结果(0000纹理)与一个新的驱动程序?
以下所有内容都是指核心配置文件3.2,但通常适用于所有版本的GL。
名称0对应于默认纹理对象(每个纹理目标一个:1d, 2d,…)参见3.8.14,最后一段)。
所以glBindtexture(2D, 0);
给你默认的纹理对象。不是表示禁用纹理。现在,从默认对象中进行纹理处理会导致通常的操作,只是在您没有自己创建的纹理对象上。初始纹理对象最初是不完整的,所以除非你修改它,否则它将遵循"不完整"规则。
现在规范说(3.9.2,纹理访问段落),从一个不完整的纹理采样将返回(0,0,0,1)。
所以你的旧驱动程序没有按照规范行事。