2015-03-05 4 views
1

Я некоторое время пытаюсь следовать учебнику OpenGL-3.3, но кажется, что я могу привязывать текстуру только к GL_TEXTURE0, иначе я получаю черный квадрат.OpenGL 3.3 - Я могу привязываться только к GL_TEXTURE0

Пример:

Это работает

glClearColor(0.2f, 0.3f, 0.3f, 1.0f); 
    glClear(GL_COLOR_BUFFER_BIT); 

    glActiveTexture(GL_TEXTURE0 + 0); 
    glBindTexture(GL_TEXTURE_2D, texture1); 
    glUniform1i(glGetUniformLocation(shader.program, "our_texture1"), 0); 

    shader.bind(); 

    glBindVertexArray(vertex_array); 
    glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0); 
    glBindVertexArray(0); 

Это не

glClearColor(0.2f, 0.3f, 0.3f, 1.0f); 
    glClear(GL_COLOR_BUFFER_BIT); 

    glActiveTexture(GL_TEXTURE0 + 1); 
    glBindTexture(GL_TEXTURE_2D, texture1); 
    glUniform1i(glGetUniformLocation(shader.program, "our_texture1"), 1); 

    shader.bind(); 

    glBindVertexArray(vertex_array); 
    glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0); 
    glBindVertexArray(0); 

Детали:

shader.bind просто вызывает glUseProgram

Vertex Shader:

 #version 330 core 

    layout (location = 0) in vec3 position; 
    layout (location = 1) in vec3 color; 
    layout (location = 2) in vec2 tex_coords; 
    out vec4 our_color; 
    out vec2 our_tex_coords; 

    void main() 
    { 
     gl_Position = vec4(position, 1.0f); 
     our_color = vec4(color, 1.0f); 
     our_tex_coords = tex_coords; 
    } 

Фрагмент Shader:

#version 330 core 

    out vec4 color; 
    in vec4 our_color; 
    in vec2 our_tex_coords; 

    uniform sampler2D our_texture1; 

    void main() 
    { 
     color = texture(our_texture1, our_tex_coords); 
    } 

Создание текстуры:

GLuint texture1; 

    glGenTextures(1, &texture1); 
    glBindTexture(GL_TEXTURE_2D, texture1); 

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 

    sf::Image image1; 
    if (!image1.loadFromFile("../Assets/container.jpg")) 
    { 
     error(); 
    } 

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, image1.getSize().x, image1.getSize().y, 0, GL_RGBA, GL_UNSIGNED_BYTE, image1.getPixelsPtr()); 
    glGenerateMipmap(GL_TEXTURE_2D); 

    glBindTexture(GL_TEXTURE_2D, 0); 

Из того, что я могу проверить файл загружен правильно. Любая идея о том, что может быть неправильным?

ответ

2

Ранее ответ говорит вам, как изменить код, чтобы заставить его работать, но дает неверное объяснение. В этой последовательности:

glActiveTexture(GL_TEXTURE0 + 1); 
glBindTexture(GL_TEXTURE_2D, texture1); 
glUniform1i(glGetUniformLocation(shader.program, "our_texture1"), 1); 

shader.bind(); 

с shader.bind() вызова glUseProgram(), действительно существует проблема с последовательностью. Но это не имеет никакого отношения к glActiveTexture(), который полностью не связан с текущей программой.

Вызов glUniform1i() задает равномерное значение для текущей связанной программы. Таким образом, вы звоните glUseProgram()доglUniform*(). Например, следующая работа будет работать:

glActiveTexture(GL_TEXTURE0 + 1); 
glBindTexture(GL_TEXTURE_2D, texture1); 

shader.bind(); 
glUniform1i(glGetUniformLocation(shader.program, "our_texture1"), 1); 
+0

Это имеет смысл. Я действительно подозрительно относился к этому звонку, но был омрачен тем фактом, что мы используем член программы шейдера в функции GetUniform. Это, возможно, не является хорошей практикой. Спасибо за правильный ответ! – Veritas

1

Ваш код выглядит хорошо. Но я думаю, что shader.bind() следует вызывать перед glActiveTexture в целом.

Дальнейший намек: если вы хотите, чтобы ваша текстура была сглаженной при использовании мини-кодировки, возьмите GL_LINEAR_MIPMAP_LINEAR вместо GL_LINEAR. Это должно работать из коробки, поскольку вы уже создали MIPMaps.

С наилучшими пожеланиями, Крис

+0

Chris благодарит за вашу помощь! Даже если ваш ответ был неправильным, вы помогли мне решить проблему. – Veritas

Смежные вопросы