Я хочу нарисовать простой прямоугольник в OpenGL 3.0 с текстурой на нем. В качестве отправной точки я использую пример из https://learnopengl.com/code_viewer_gh.php?code=src/1.getting_started/4.2.textures_combined/textures_combined.cpp, но с некоторыми изменениями:
- все сделано для GLSL 1.3
- нет цветов в массиве вершин
- только одна текстура вместо двух перекрывающихся
Поэтому я изменил этот код следующим образом. Вершинный шейдер:
#version 130
in vec3 aPos;
in vec2 aTexCoord;
out vec2 TexCoord;
uniform mat4 inputTransform;
void main()
{
TexCoord=vec2(aTexCoord.x, aTexCoord.y);
gl_Position = inputTransform * vec4(aPos.x, aPos.y, aPos.z, 1.0);
}
Фрагмент шейдера:
#version 130
out vec4 FragColor;
in vec2 TexCoord;
uniform sampler2D texture1;
void main()
{
FragColor=texture(texture1, TexCoord);
}
-> они оба компилируются без ошибок
Мои координаты вершин расположены в одном массиве с использованием x, y, z, u, v:
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void*)0);
glEnableVertexAttribArray(0);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void*)(3 * sizeof(float)));
glEnableVertexAttribArray(1);
Прямоугольник на основе GL_TRIANGLE_STRIP (без UV-координат и без текстурного материала) работает хорошо и имеет правильный размер, но как только я применяю к нему текстурные координаты и вызовы функций, ничего, кроме очень маленького треугольника, не получается. нарисован.
Так что я думаю, что что-то не так с координатами в моем массиве вершин. Но ... что именно здесь может быть не так?
Обновление: мои настройки VBO / VAO (упрощено, поэтому код обработки ошибок не отображается):
gl3Element->shaderProgram=glCreateProgram();
glAttachShader(gl3Element->shaderProgram, m_gl3TexVertexShader);
glAttachShader(gl3Element->shaderProgram,m_gl3TexFragmentShader);
glLinkProgram(gl3Element->shaderProgram);
glDeleteShader(m_gl3TexFragmentShader);
glDeleteShader(m_gl3DynColourFragmentShader);
glUseProgram(gl3Element->shaderProgram);
glGenVertexArrays(1, &gl3Element->VAO);
glGenBuffers(1, &gl3Element->VBO);
... и специфичные для текстуры вещи, чтобы подать на них в суд:
glGenTextures(1, &imgEntity->m_glTexture);
glBindTexture(GL_TEXTURE_2D, imgEntity->m_glTexture);
glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,transImage->GetWidth(),transImage->GetHeight(),0,GL_RGB,GL_UNSIGNED_BYTE,transImage->GetData());
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glGenerateMipmap(GL_TEXTURE_2D);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, imgEntity->m_glTexture);