OpenGL, Shader Model 3.3. Текстурирование: черные текстуры? - PullRequest
6 голосов
/ 11 января 2012

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

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

#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 в качестве «красного» компонента и t в качестве «зеленого» компонента:

Coloring using st coordinates.

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

Ответы [ 2 ]

11 голосов
/ 11 января 2012

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

Попробуйте запустить текстуру 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);

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

2 голосов
/ 11 января 2012

В вашем фрагментном шейдере вы пишете в самоопределяемую цель

   fragment_colour = texture2D(base_texture, varying_uv);

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

...