关于C#:glActiveTexture默认行为不符合预期

glActiveTexture default behavior not as anticipated

我只想澄清一下OpenGL的行为。据我了解,默认的活动纹理单位为0(GL_TEXTURE0),除非通过glActiveTexture进行显式更改,否则仍将保留。

我之所以这样问,是因为我的行为举止我无法解释且存在问题。加载纹理并将其绑定到GL_TEXTURE_2D之后(假设GL_TEXTURE0是活动的),在将活动纹理设置为GL_TEXTURE1之前,我无法显示它。甚至在加载后先绑定glActiveTexture(GL_TEXTUREX)之前显式调用它,然后在绘制过程中使用它时重复此调用也无济于事。仅当我在绑定并分配给着色器之前调用glActiveTexture(GL_TEXTURE1)时,纹理才会显示。

当我尝试使用更多纹理,而我不得不显式设置每个glActiveTexture(GL_TEXTURE...)时,将重复此过程,具体取决于我在绑定纹理并将其分配给着色器之前加载和首先绑定纹理的顺序。即使我未使用加载的第一个纹理进行绘图,我仍然必须调用glActiveTexture(GL_TEXTURE2) ...而不是GL_TEXTURE1,甚至更好的GL_TEXTURE0,因为我什至没有调用glActiveTexture(...)点。我认为后者是根据GL规范应该发生的事情。

https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glActiveTexture.xhtml

这是开车兜风吗?在此先感谢您的任何建议。

Dell Precision M6800,nV K2200M,GL 4.1


必须设置为纹理采样器统一的值是纹理单位的索引,而不是纹理对象的索引。

像这样更改您的代码:

1
2
3
4
5
6
7
gl_->glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, calibrationTexture_);

// this is wrong
//SetUniform("quadTexture", calibrationTexture_);

SetUniform("quadTexture", 1 ); // 1 because of GL_TEXTURE1

请参阅OpenGL 4.6 API兼容性配置文件规范; 7.10采样器第154页:

Samplers are special uniforms used in the OpenGL Shading Language to identify
the texture object used for each texture lookup. The value of a sampler indicates the texture image unit being accessed. Setting a samplera€?s value to i selects texture image unit number i.

注意,纹理对象的"名称"由

生成

1
glGenTextures(1, &calibrationTexture_);

此"名称"(整数)取决于硬件和驱动程序。
但是,由于您的代码中仅生成1个纹理对象,因此名称的值很有可能为1。

这意味着,当您设置

1
gl_->glActiveTexture(GL_TEXTURE1);

您的代码有效,因为calibrationTexture_的值为1。