2012-01-11 3 views
4

Я уже несколько часов стучаю головой об этом, я уверен, что это что-то простое, но я просто не могу получить результат. Мне пришлось немного изменить этот код, потому что я создал небольшую библиотеку для инкапсуляции вызовов OpenGL, но следующее - точное описание состояния дел.OpenGL, Shader Model 3.3 Текстурирование: черные текстуры?

Я использую следующий вершинный шейдер:

#version 330 
in vec4 position; 
in vec2 uv; 
out vec2 varying_uv; 
void main(void) 
{ 
    gl_Position = position; 
    varying_uv = uv; 
} 

И следующий фрагмент шейдера:

#version 330 
in vec2 varying_uv; 
uniform sampler2D base_texture; 
out vec4 fragment_colour; 
void main(void) 
{ 
    fragment_colour = texture2D(base_texture, varying_uv); 
} 

Оба шейдера компилировать и программные ссылки без вопроса.

В моей инициализации секции, я загрузить одну текстуру, как так:

// Check for errors. 
kt::kits::open_gl::Core<QString>::throw_on_error(); 

// Load an image. 
QImage image("G:/test_image.png"); 
image = image.convertToFormat(QImage::Format_RGB888); 

if(!image.isNull()) 
{ 
    // Load up a single texture. 
    glGenTextures(1, &Texture); 
    glBindTexture(GL_TEXTURE_2D, Texture); 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, image.width(), image.height(), 0, GL_RGB, GL_UNSIGNED_BYTE, image.constBits()); 
    glBindTexture(GL_TEXTURE_2D, 0); 
} 

// Check for errors. 
kt::kits::open_gl::Core<QString>::throw_on_error(); 

Вы заметить, что я использую Qt, чтобы загрузить текстуру. Вызовы :: throw_on_error() проверяют наличие ошибок в OpenGL (путем вызова Error()) и генерируют исключение, если оно встречается. В этом коде нет ошибок OpenGL, и изображение, загруженное с использованием Qt, действительно.

Чертеж выполняется следующим образом:

// Clear previous. 
glClear(GL_COLOR_BUFFER_BIT | 
    GL_DEPTH_BUFFER_BIT | 
    GL_STENCIL_BUFFER_BIT); 

// Use our program. 
glUseProgram(GLProgram); 

// Bind the vertex array. 
glBindVertexArray(GLVertexArray); 

/* ------------------ Setting active texture here ------------------- */ 

// Tell the shader which textures are which. 
kt::kits::open_gl::gl_int tAddr = glGetUniformLocation(GLProgram, "base_texture"); 
glUniform1i(tAddr, 0); 

// Activate the texture Texture(0) as texture 0. 
glActiveTexture(GL_TEXTURE0 + 0); 
glBindTexture(GL_TEXTURE_2D, Texture); 

/* ------------------------------------------------------------------ */ 

// Draw vertex array as triangles. 
glDrawArrays(GL_TRIANGLES, 0, 4); 
glBindVertexArray(0); 
glUseProgram(0); 

// Detect errors. 
kt::kits::open_gl::Core<QString>::throw_on_error(); 

Аналогичным образом, не возникает никаких ошибок OpenGL, и треугольник обращается к Полноэкранный. Тем не менее, это выглядит следующим образом:

Texturing, not as expected.

Это произошло для меня проблема может быть связана с моими текстурными координатами. Итак, я вынес следующее изображение с помощью S, как «красный» компонент, и т как «зеленый» компонент:

Coloring using st coordinates.

координаты текстуры отображаются правильно, но я до сих пор получающего черный треугольник дум. Что я делаю не так?

ответ

9

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

Попробуйте инициализировать текстуры MIN и MAG фильтр

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 

Кроме того, я хотел бы предложить, чтобы проверить размер текстуры. Если это не сила 2, то вы должны установить режим оборачивания в CLAMP_TO_EDGE

glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP_TO_EDGE); 
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP_TO_EDGE); 

Черные текстуры часто из-за этого вопроса, очень распространенная проблема вокруг.

Ciao

+0

Я не думаю, что это имеет значение. Если они не установлены, будут использоваться значения по умолчанию –

+0

Вы, сэр, бог среди мужчин! @VJovic Я думал точно так же :). –

+0

Ничего себе это исправило проблему для меня также. Кажется, что 'GL_TEXTURE_MIN_FILTER' специально не имеет правильного значения по умолчанию. – Henk

2

В вашем пиксельном шейдере вы пишете для себя определенных целей

fragment_colour = texture2D(base_texture, varying_uv); 

Если это не будет gl_FragColor или gl_FragData[…], вы правильно установить обозначенное место фрагмента данные?

+0

Ну, gl_FragColor устарел, поэтому gl_FragData. Сообщение 1.2 (я думаю) вам нужно использовать и привязывать к буферам. Учитывая, что я могу сделать все остальное хорошо, я не думаю, что это проблема. –

+0

@ LiamM: Действительно, но мне было интересно, может быть, вы случайно пропустили это. – datenwolf

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