Frage OpenGL 3.3 multitexture: GL_TEXTURE1 und folgende sind immer schwarz (Nur GL_TEXTURE0 funktioniert gut)


Jede Textur nach GL_TEXTURE0 (Textur auf Slot 0) ist schwarz.

Fragment Shader (Beispielcode, um verschiedene Texturen durch Gewichtsänderungen zu überprüfen):

#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);
}

Ich lade Texturen so hoch (Auszug!):

::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);

Ich habe versucht, Textur-Slots zu ändern und verschiedene Texturen hochzuladen, aber ich bekomme immer einen schwarzen Bildschirm, bis ich Texturen auf GL_TEXTURE0 verwende.


5
2018-03-13 20:05


Ursprung


Antworten:


::glBindSampler(GL_TEXTURE0, SamplerHandle);

Das ist falsch. glBindSampler nimmt die Texturbildeinheit Index, kein enum. Das sollte sein 0nicht GL_TEXTURE0.

Der beste Weg, um damit umzugehen, ist wie folgt:

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

6
2018-03-14 00:47