2013-03-13 23 views
5

Każda tekstura po GL_TEXTURE0 (tekstura na gnieździe 0) jest czarna.Multitekstura OpenGL: GL_TEXTURE1 i następne są zawsze czarne (tylko GL_TEXTURE0 działa bez zarzutu)

Fragment shader (przykładowy kod, aby sprawdzić różne faktury przez zmieniających odważników):

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

przesyłać faktury jak ten (fragment!):

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

Próbowałem zmienić szczeliny tekstury i przesyłanie różne tekstury, ale zawsze mam czarny ekran, dopóki nie użyję tekstur na GL_TEXTURE0.

+2

FYI: Nie trzeba poprzedzić każdą funkcję z '' ::. –

Odpowiedz

6
::glBindSampler(GL_TEXTURE0, SamplerHandle); 

To źle. glBindSampler przyjmuje jednostkę obrazu tekstury indeks, a nie wyliczenie. To powinno być 0, a nie GL_TEXTURE0.

Najlepszym sposobem, aby obsłużyć to następująco:

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

Dziękuję. Wydaje się, że rozwiązuje to problem. –