Координаты текстуры OpenGL не имеют никакого эффекта - PullRequest
1 голос
/ 13 июня 2019

Я не могу получить координаты текстуры, чтобы иметь какое-либо влияние на то, что отображается на экране. Моя текстура постоянно рендерилась от 0,0 до 1,1.

Метод, который я использую для отправки следующего макета буфера: x, y, u, v (xy: положение вершины и u, v текстурные координаты).

Однако изменение значений u & v не влияет на визуализированную текстуру.

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


Вершинный шейдер:

#version 330 core

layout(location = 0) in vec2 position;
layout(location = 1) in vec2 mytextpos;

out vec2 v_TexCoord;

uniform mat4 u_Model;

void main()
{
gl_Position = u_Model * vec4(position, 0.0f, 1.0f);
v_TexCoord = mytextpos;
}



Фрагмент шейдера:

#version 330 core

layout(location = 0) out vec4 color;

in vec2 v_TexCoord;

uniform sampler2D u_Texture;

void main()
{
color = texture(u_Texture, v_TexCoord);
}



Конструктор класса Мой прямоугольник:

// GENERATE BUFFERS
glGenVertexArrays(1, &VertexArrayObject);
glGenBuffers(1, &VertexBufferId);
glGenBuffers(1, &IndexBufferObjectId);


Indices = {
    0, 1, 2,
    2, 3, 0
};

unsigned int numberOfVertices = Vertices.size();
unsigned int numberOfIndices = Indices.size();

glBindVertexArray(VertexArrayObject);
glBindBuffer(GL_ARRAY_BUFFER, VertexBufferId);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IndexBufferObjectId);

Vertices = {
    0.2f, 0.0f, 0.0f, 0.5f,
    1.0f, 0.0f, 1.5f, 0.5f,
    1.0f, 1.0f, 1.5f, 1.0f,
    0.0f, 1.0f, 0.0f, 1.0f
};


// ADD BUFFER DATA
glBufferData( GL_ARRAY_BUFFER, Vertices.size() * sizeof(float), Vertices.data(), GL_STATIC_DRAW );


// ARRANGE ATTRIBUTES
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(float), nullptr);
glEnableVertexAttribArray(0);

glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(float), nullptr);
glEnableVertexAttribArray(1);

glBufferData( GL_ELEMENT_ARRAY_BUFFER, numberOfIndices * sizeof(unsigned int), Indices.data(), GL_STATIC_DRAW );`



Функция рендеринга:

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

GLint u_Texture = glGetUniformLocation( shader.getId(), "u_Texture" );
glUniform1i( u_Texture, 0 );

GLint u_Model = glGetUniformLocation( shader.getId(), "u_Model" );
glUniformMatrix4fv( u_Model, 1, GL_FALSE, glm::value_ptr( rect.TransformMatrix() ) );

glDrawElements(GL_TRIANGLES, rect.Indices.size(), GL_UNSIGNED_INT, nullptr);

// SWAP BUFFERS
glfwSwapBuffers( _window->WindowInstance );
glfwPollEvents();



Моя программа работает, но моя текстура отображается между 0,0 и 1,0, независимо от того, какая у меня позиция вершины или u, v. Я ожидал бы, что текстура будет интерполирована между координатами u, v для каждой вершины?

1 Ответ

1 голос
/ 13 июня 2019

Вы неправильно настроили атрибут:

glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(float), nullptr);

Это говорит OpenGL, что он должен присоединить первые два числа с плавающей точкой каждой вершины к атрибуту mytextpos. Но вы на самом деле хотите, чтобы он читал 3-й и 4-й поплавки. Таким образом, вы должны установить смещение таким образом, чтобы оно пропускало первые два числа с плавающей точкой:

glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(float), (void*)(2 * sizeof(float)));
...