Как я могу применить некоторые допустимые текстурные координаты к объекту, используя
только OpenGL 3.0 и GLSL 1.3?
Координаты текстуры обычно генерируются сторонней программой, такой как 3DS Max или Blender. 3D-художники используют эти программы для текстурирования своих моделей. Когда модель экспортируется, координаты текстуры также экспортируются в файл модели. Когда модель загружается для рендеринга, координаты текстуры для каждой вершины извлекаются, и затем мы можем передать эти координаты шейдеру с помощью атрибута шейдера.
Как назначить эти данные текстуры для модели?
Получение текстурированной геометрии в OpenGL может быть немного сложным процессом, поэтому я постараюсь разбить процесс в несколько шагов.
Получить координаты текстуры модели; может быть сгенерирован программно или загружен из модели.
Загрузить текстуру, чтобы она могла использоваться OpenGL
Настройте массив атрибутов, чтобы шейдер мог находить координаты текстуры.
Изменение вершинного шейдера и фрагментного шейдера для поддержки текстурированной геометрии
Похоже, у вас уже есть механизм для номера 2 (загрузка в текстуру).
Так что вы, кажется, просто пропустили последние два шага.
Чтобы получить координаты текстуры, связанные с данными вершины, вы можете указать атрибуты, связанные с данными вершины.
Согласно документации OpenGL:
Атрибуты вершины используются для связи извне с вершинным шейдером. В отличие от равномерных переменных, значения предоставляются для каждой вершины (а не глобально для всех вершин). Существуют встроенные атрибуты вершин, такие как нормаль или положение, или вы можете указать свой собственный атрибут вершины, например, тангенс или другое пользовательское значение. Атрибуты не могут быть определены в фрагментном шейдере.
Пример кода может выглядеть следующим образом:
//An easy way keep track of what locations are assigned for each attribute
enum Attribute_Location
{
AL_Vertices = 0,
AL_DiffuseTexCoords = 1,
AL_AlphaTexCoords = 2,
AL_Normals = 3,
};
GLuint uvBuffer;
glGenBuffers(1, &uvBuffer);
//Bind the buffer
glBindBuffer(
GL_ARRAY_BUFFER,
uvBuffer);
//Bind the data to the buffer
glBufferData(GL_ARRAY_BUFFER,
bufferSize, //size of the buffer you are uploading
&diffuseTexCoords[0], //array of texture coords
GL_STATIC_DRAW);
glEnableVertexAttribArray(AL_DiffuseTexCoords);
//Tells OpenGL how to assign data from the texture buffer to the shader
glVertexAttribPointer(AL_DiffuseTexCoords,
2,
GL_FLOAT,
GL_FALSE,
0,
0);
И вот пример того, как будет выглядеть вершинный шейдер и фрагментный шейдер, предоставлено http://www.opengl -tutorial.org / beginners-tutorials / tutorial-5-a-текстурированный-куб /
Textured.vs
#version 330 core
// Input vertex data, different for all executions of this shader.
layout(location = 0) in vec3 vertexPosition_modelspace;
layout(location = 1) in vec2 vertexUV;
// Output data ; will be interpolated for each fragment.
out vec2 UV;
// Values that stay constant for the whole mesh.
uniform mat4 MVP;
void main()
{
// Output position of the vertex, in clip space : MVP * position
gl_Position = MVP * vec4(vertexPosition_modelspace,1);
// UV of the vertex. No special space for this one.
UV = vertexUV;
}
Textured.fs
#version 330 core
// Interpolated values from the vertex shaders
in vec2 UV;
// Ouput data
out vec3 color;
// Values that stay constant for the whole mesh.
uniform sampler2D myTextureSampler;
void main()
{
// Output color = color of the texture at the specified UV
color = texture( myTextureSampler, UV ).rgb;
}
Обратите внимание, что расположение атрибутов вершин и координат текстуры, указанных в enum Attribute_Location, соответствует расположению макета в вершинном шейдере:
enum Attribute_Location
{
AL_Vertices = 0,
AL_DiffuseTexCoords = 1,
...
}
layout(location = 0) in vec3 vertexPosition_modelspace;
layout(location = 1) in vec2 vertexUV;