2013-04-18 4 views
3

Я сейчас работаю над простой 3D-сценой в OpenGL3.3, но при попытке текстуры объектов - все они текстурированы полностью черными. Однако, если я изменил версию контекста на 3.1; у него нет проблем с правильной обработкой текстур над моделями.Текстуры OpenGL все черные в 3.3 - но работают в 3.1

Я не уверен, что это говорит о том, что я использую устаревшие функции/методы, но я изо всех сил пытаюсь понять, где проблема.

Настройка текстуры

(load texture from file) 
... 
glGenTextures(1, &TexID);    // Create The Texture (CHANGE) 
glBindTexture(GL_TEXTURE_2D, TexID); 

glTexImage2D(GL_TEXTURE_2D, 0, texture_bpp/8, texture_width, texture_height, 0, texture_type, GL_UNSIGNED_BYTE, texture_imageData); 
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); 
... 

Привязка текстуры Отдавать

// mLocation is the layout location in the shader, from glGetUniformLocation 
// mTextureUnit is the specified texture unit to load into. Currently using 0. 
// mTextureID is the ID of the loaded texture, as generated above. 
glActiveTexture(GL_TEXTURE0 + mData.mTextureUnit); 
glBindTexture(GL_TEXTURE_2D, mData.mTextureID); 
glUniform1i(mLocation, mData.mTextureUnit); 

пиксельный шейдер

uniform sampler2D diffusemap; 
in vec2 passUV; 
out vec3 outColour; 
... 
outColour = texture(diffusemap, passUV).rgb; 

Все используемые текстуры имеют мощность 2, квадратные размеры.


Изображения, показывающие проблему.

GL3.1: http://i.imgur.com/NUgj6vA.png

GL3.3: http://i.imgur.com/oOc0jcd.png


вершинных шейдеров

#version 330 core 

uniform mat4 p; 
uniform mat4 v; 
uniform mat4 m; 

in vec3 vertex; 
in vec3 normal; 
in vec2 uv; 

out vec3 passVertex; 
out vec3 passNormal; 
out vec2 passUV; 

void main(void) 
{ 
    gl_Position = p * v * m * vec4(vertex, 1.0); 

    passVertex = vec3(m * vec4(vertex, 1.0)); 
    passNormal = vec3(m * vec4(normal, 1.0)); 
    passUV = uv; 
} 
+0

Как выглядит ваш вершинный шейдер? – scones

+0

Добавил его внизу для вас. Но что касается текстурирования, он просто передает данные UV в шейдер фрагмента без каких-либо преобразований. Просто для обеспечения правильной передачи UVs/не проблема - я быстро визуализировал UVs как цвет (красный, зеленый). Кажется, что UV-данные попадают в frag-шейдер без проблем: http://imgur.com/N4Zp0ir – Bilkokuya

ответ

3

Для полноты картины, internal format of a texture должен быть перечислителем. И один из нумерованных перечислителей, а не один из нестандартных. Пожалуйста, прекратите использование GL_RGB, если вы можете использовать GL_RGB8.

Ответ правильно определяет проблему, но было бы полезно объяснить, почему предыдущее предположение будет работать на 3.1, а не на 3.3.

Возможность использования номера в диапазоне [1, 4] устарела в OpenGL 3.0 и удалена в OpenGL 3.1. Однако, в то время, не было возможности сказать «дайте мне фактический основной профиль OpenGL версии 3.1»; WGL/GLX_CONTEXT_CORE_PROFILE_BIT_ARB s не было. Поэтому, когда вы получили контекст 3.1, было вполне законно для реализации экспортировать ARB_compatibility extension, что все еще допускало все удаленные функции.

В 3.2 к OpenGL добавлена ​​способность explicitly select a profile. В этот момент вы не получите кого-то, кто выставит ARB_compatibility в основном профиле. Вот почему ваш код работает, когда вы запрашиваете 3.1 (так как это бесплатно, чтобы предоставить вам совместимость 3.1), но не тогда, когда вы запрашиваете 3,3-х основных профилей.

5

В строке:

glTexImage2D(GL_TEXTURE_2D, 0, texture_bpp/8, texture_width, texture_height, 0, texture_type, GL_UNSIGNED_BYTE, texture_imageData); 

Предположение о том, что (texture_bpp/8) вернет правильный формат, неверно. Он должен быть одним из значений GLenum, определяющим внутренний формат, такой как GL_RGBA.

исправляющих его (или в зависимости от того формата соответствует внутреннему-формату файл текстуры) устраняет проблему полностью и работает как GL3.3 и GL3.1:

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, texture_width, texture_height, 0, texture_type, GL_UNSIGNED_BYTE, texture_imageData); 
+0

Ответ правильно идентифицирует проблему, но было бы полезно объяснить, почему предыдущее предположение будет работать на 3.1, а не на 3.3. – Bilkokuya

+2

Вероятно, 3.1 внутренне использует формат по умолчанию, и 3.3 в этом отношении более строг. Ник в любом случае. –

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