繁体   English   中英

在OpenGL中绑定零纹理

[英]Binding a zero texture in OpenGL

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM