Создание прямоугольника с текстурой не удалось - PullRequest
0 голосов
/ 31 октября 2018

Я хочу нарисовать простой прямоугольник в 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);
...