Я уже несколько часов стучаю головой об этом, я уверен, что это что-то простое, но я просто не могу получить результат. Мне пришлось немного изменить этот код, потому что я создал небольшую библиотеку для инкапсуляции вызовов 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, и треугольник обращается к Полноэкранный. Тем не менее, это выглядит следующим образом:
Это произошло для меня проблема может быть связана с моими текстурными координатами. Итак, я вынес следующее изображение с помощью S, как «красный» компонент, и т как «зеленый» компонент:
координаты текстуры отображаются правильно, но я до сих пор получающего черный треугольник дум. Что я делаю не так?
Я не думаю, что это имеет значение. Если они не установлены, будут использоваться значения по умолчанию –
Вы, сэр, бог среди мужчин! @VJovic Я думал точно так же :). –
Ничего себе это исправило проблему для меня также. Кажется, что 'GL_TEXTURE_MIN_FILTER' специально не имеет правильного значения по умолчанию. – Henk