OpenGL 3.3 多纹理 : GL_TEXTURE1 and following are always black (Only GL_TEXTURE0 works fine)

标签 opengl glsl textures texture2d multitexturing

GL_TEXTURE0 之后的每个纹理(插槽 0 上的纹理)都是黑色的。

片段着色器(通过改变权重来检查不同纹理的示例代码):

#version 330

uniform sampler2D g_ColorTex;
uniform sampler2D g_DepthTex;
uniform sampler2D g_DofNearBlurTex;
uniform sampler2D g_DofDownBlurTex;

in vec4 g_VertexPosition;
in vec2 g_ScreenCoords;

layout (location = 0) out vec4  FragColor;

void main() 
{
    // Changing weights to check textures
    FragColor  = 1.00001f * vec4(texture(g_ColorTex      , g_ScreenCoords).rgb, 1.0f);
    FragColor += 0.00001f * vec4(texture(g_DepthTex      , g_ScreenCoords).rgb, 1.0f);
    FragColor += 0.00001f * vec4(texture(g_DofNearBlurTex, g_ScreenCoords).rgb, 1.0f);
    FragColor += 0.00001f * vec4(texture(g_DofDownBlurTex, g_ScreenCoords).rgb, 1.0f);
}

我上传这样的纹理(摘录!):
::glUseProgram(ShaderHandle);

unsigned int TextureIndex;


TextureIndex = ::glGetUniformLocation(ShaderHandle, "g_ColorTex");

::glUniform1i(TextureIndex, 0);

::glActiveTexture(GL_TEXTURE0);

::glBindTexture(GL_TEXTURE_2D, TextureHandle);

::glBindSampler(GL_TEXTURE0, SamplerHandle);


TextureIndex = ::glGetUniformLocation(ShaderHandle, "g_DepthTex");

::glUniform1i(TextureIndex, 1);

::glActiveTexture(GL_TEXTURE1);

::glBindTexture(GL_TEXTURE_2D, TextureHandle);

::glBindSampler(GL_TEXTURE1, SamplerHandle);


TextureIndex = ::glGetUniformLocation(ShaderHandle, "g_DofNearBlurTex");

::glUniform1i(TextureIndex, 2);

::glActiveTexture(GL_TEXTURE2);

::glBindTexture(GL_TEXTURE_2D, TextureHandle);

::glBindSampler(GL_TEXTURE2, SamplerHandle);


TextureIndex = ::glGetUniformLocation(ShaderHandle, "g_DofDownBlurTex");

::glUniform1i(TextureIndex, 3);

::glActiveTexture(GL_TEXTURE3);

::glBindTexture(GL_TEXTURE_2D, TextureHandle);

::glBindSampler(GL_TEXTURE3, SamplerHandle);

//...

::glDrawElements(GL_TRIANGLES, Mesh->m_Indices.size() * 3, GL_UNSIGNED_INT, 0);

我尝试更改纹理插槽并上传不同的纹理,但在我在 GL_TEXTURE0 上使用纹理之前,我总是得到黑屏。

最佳答案

::glBindSampler(GL_TEXTURE0, SamplerHandle);

那是错误的。 glBindSampler 采用纹理图像单元索引,而不是枚举。那应该是 0 ,不是 GL_TEXTURE0 .

处理此问题的最佳方法如下:
glUniform1i(TextureIndex, index);
glActiveTexture(GL_TEXTURE0 + index);
glBindTexture(GL_TEXTURE_2D, TextureHandle);
glBindSampler(index, SamplerHandle);

关于OpenGL 3.3 多纹理 : GL_TEXTURE1 and following are always black (Only GL_TEXTURE0 works fine),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15395382/

相关文章:

c++ - 在 C++ 中具有单个 openGL 上下文的多个 QGLWidgets

opengl - 使用 pyglet 滚动窗口的最佳方式

delphi - OpenGl 星图

c++ - 着色器将 uint8 转换为 float ,并将其重新解释回 uint

c++ - 来自 SDL Surface 的 openGL 纹理

c++ - glTexImage2D 'target is not valid'

java - 第一人称相机胶卷

opengl-es - 遵循 Nvidia GPU Gems 第 1 章设置 GLSL 海洋水着色器

c++ - OpenGL 转换无法按预期在 z 轴上工作

OpenGL:精确的纹理可能吗?