【问题标题】:OpenGL 3.3 multitexture: GL_TEXTURE1 and following are always black (Only GL_TEXTURE0 works fine)OpenGL 3.3 多纹理:GL_TEXTURE1 及以下始终为黑色(只有 GL_TEXTURE0 可以正常工作)
【发布时间】:2013-03-13 20:05:25
【问题描述】:

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 上使用纹理。

【问题讨论】:

  • 仅供参考:您不必在每个函数前加上 ::

标签: opengl glsl textures texture2d multitexturing


【解决方案1】:
::glBindSampler(GL_TEXTURE0, SamplerHandle);

错了。 glBindSampler 采用纹理图像单元 index,而不是枚举。那应该是0,而不是GL_TEXTURE0

最好的处理方法如下:

glUniform1i(TextureIndex, index);
glActiveTexture(GL_TEXTURE0 + index);
glBindTexture(GL_TEXTURE_2D, TextureHandle);
glBindSampler(index, SamplerHandle);

【讨论】:

    猜你喜欢
    • 2012-02-07
    • 1970-01-01
    • 2015-05-07
    • 1970-01-01
    • 2014-05-05
    • 1970-01-01
    • 2013-09-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多