如何在使用索引时为UV添加vec2进行纹理映射



我正试图将纹理映射应用到我的立方体,但不确定如何进行。目前,我使用索引来避免重复vec3s来创建一个立方体和顶点数组的点和它们的法线,如下所示:

// Cube data as our basic building block
unsigned int indices[] = {
10, 8, 0, 2, 10, 0, 12, 10, 2, 4, 12, 2,
14, 12, 4, 6, 14, 4, 8, 14, 6, 0, 8, 6,
12, 14, 8, 10, 12, 8, 2, 0, 6, 4, 2, 6
};

vec3 vertexArray[] = {
vec3(-0.5f, -0.5f, -0.5f),  vec3(-0.408248, -0.816497, -0.408248),
vec3(0.5f, -0.5f, -0.5f),    vec3(0.666667, -0.333333, -0.666667),
vec3(0.5f, 0.5f, -0.5f),    vec3(0.408248, 0.816497, -0.408248),
vec3(-0.5f, 0.5f, -0.5f),   vec3(-0.666667, 0.333333, -0.666667),
vec3(-0.5f, -0.5f, 0.5f),    vec3(-0.666667, -0.333333, 0.666667),
vec3(0.5f, -0.5f, 0.5f),     vec3(0.666667, -0.666667, 0.333333),
vec3(0.5f, 0.5f, 0.5f),     vec3(0.408248, 0.408248, 0.816497),
vec3(-0.5f, 0.5f, 0.5f),    vec3(-0.408248, 0.816497, 0.408248),
};
// convert arrays to vectors
std::vector<vec3> vertexArrayVector;
vertexArrayVector.insert(vertexArrayVector.begin(), std::begin(vertexArray), std::end(vertexArray));
std::vector<unsigned int> indicesVector;
indicesVector.insert(indicesVector.begin(), std::begin(indices), std::end(indices));

我现在想将纹理应用到立方体,但我不确定如何在使用索引时为UV添加vec2的使用。我创建的vbo和vao是这样的,如果有帮助的话:

GLuint vertexBufferObject;
GLuint indexBufferObject;
GLuint vertexArrayObject;
glGenVertexArrays(1, &vertexArrayObject);
glGenBuffers(1, &indexBufferObject);
glGenBuffers(1, &vertexBufferObject);
glBindVertexArray(vertexArrayObject);

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBufferObject);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(vertexIndicesArray[0]) * vertexIndicesArray.size(), &vertexIndicesArray[0], GL_STATIC_DRAW);
// Upload Vertex Buffer to the GPU, keep a reference to it (vertexBufferObject)
glBindBuffer(GL_ARRAY_BUFFER, vertexBufferObject);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertexPointsArray[0]) * vertexPointsArray.size(), &vertexPointsArray[0], GL_STATIC_DRAW);
// Teach GPU how to read position data from vertexBufferObject
glVertexAttribPointer(0,                   // attribute 0 matches aPos in Vertex Shader
3,                   // size
GL_FLOAT,            // type
GL_FALSE,            // normalized?
0,                   // 0 stride
(void*)0              // array buffer offset
);
glEnableVertexAttribArray(0);
// Teach GPU how to read normals data from vertexBufferObject
glVertexAttribPointer(1,                            // attribute 1 matches normals in Vertex Shader
3,
GL_FLOAT,
GL_FALSE,
0,
(void*)sizeof(glm::vec3)      // normal is offseted a vec3 (comes after position)
);
glEnableVertexAttribArray(1);

具有5个组件(x, y, z, u, v)的元组的顶点坐标和纹理坐标。如果你有一个与人脸共享的顶点坐标,但与不同的纹理坐标相关联,你需要复制顶点坐标。你必须为网格中需要的每个顶点坐标和纹理坐标组合指定一个属性元组。
不能为顶点坐标和纹理坐标指定不同的索引。参见渲染多索引网格和为什么OpenGL不支持多索引缓冲。

最新更新