OpenGL 索引缓冲区对象元素顺序绘制不正确
OpenGL Index Buffer Object element order incorrectly drawn
请注意我的程序是如何绘制单个三角形的,但我试图在代码中表达的是绘制一个正方形。我相信我的 tri_indicies
索引缓冲区对象正确地对这些元素进行了排序,以便绘制一个正方形,但是在执行程序时,我在 tri_indicies
中定义的绘制顺序没有反映在 window.不确定错误是否源于 tri_indicies
,尽管我对元素顺序的更改不会影响我的渲染输出我想相信它在这里,但它很可能在其他地方。
我的程序使用抽象,特别是 VertexBuffer、VertexArray 和 IndexBuffer,详见下文。
const int buffer_object_size = 8;
const int index_buffer_object_size = 6;
float tri_verticies[buffer_object_size] = {
-0.7f, -0.7f, // 0
0.7f, -0.7f, // 1
0.7f, 0.7f, // 2
-0.7f, 0.7f // 3
};
unsigned int tri_indicies[index_buffer_object_size] = {
0, 1, 2,
2, 3, 0
};
VertexArray vertexArray;
VertexBuffer vertexBuffer(tri_verticies, buffer_object_size * sizeof(float)); // no call vertexBuffer.bind() constructor does it
VertexBufferLayout vertexBufferLayout;
vertexBufferLayout.push<float>(3);
vertexArray.add_buffer(vertexBuffer, vertexBufferLayout);
IndexBuffer indexBuffer(tri_indicies, index_buffer_object_size);
ShaderManager shaderManager;
ShaderSource shaderSource = shaderManager.parse_shader("BasicUniform.shader"); // ensure debug working dir is relative to $(ProjectDir)
unsigned int shader = shaderManager.create_shader(shaderSource.vertex_source, shaderSource.fragment_source);
MyGLCall(glUseProgram(shader));
稍后在 main 中我有一个循环,它应该将我的正方形绘制到屏幕上并淡化 1.0f
和 0.0f
之间的蓝色值。
while (!glfwWindowShouldClose(window))
{
MyGLCall(glClear(GL_COLOR_BUFFER_BIT));
vertexArray.bind();
indexBuffer.bind();
MyGLCall(glDrawElements(GL_TRIANGLES, index_buffer_object_size, GL_UNSIGNED_INT, nullptr)); // nullptr since we bind buffers using glGenBuffers
if (blue > 1.0f) {
increment_color = -0.05f;
}
else if (blue < 0.0f) {
increment_color = 0.05f;
}
blue += increment_color;
glfwSwapBuffers(window);
glfwPollEvents();
}
数组 tri_verticies
由具有 2 个分量的顶点坐标组成 (x, y)
。因此,通用顶点属性数据数组规范的元组大小必须为 2 而不是 3:
vertexBufferLayout.push<float>(3);
vertexBufferLayout.push<float>(2);
您实际做的是指定一个具有以下坐标的数组:
-0.7, -0.7, 0.7 // 0
-0.7, 0.7, 0.7 // 1
???, ???, ??? // 2
???, ???, ??? // 3
通常对缓冲区对象的越界访问会产生未定义的结果。
参见 OpenGL 4.6 API Core Profile Specification - 6.4 Effects of Accessing Outside Buffer Bounds, page 79
请注意我的程序是如何绘制单个三角形的,但我试图在代码中表达的是绘制一个正方形。我相信我的 tri_indicies
索引缓冲区对象正确地对这些元素进行了排序,以便绘制一个正方形,但是在执行程序时,我在 tri_indicies
中定义的绘制顺序没有反映在 window.不确定错误是否源于 tri_indicies
,尽管我对元素顺序的更改不会影响我的渲染输出我想相信它在这里,但它很可能在其他地方。
我的程序使用抽象,特别是 VertexBuffer、VertexArray 和 IndexBuffer,详见下文。
const int buffer_object_size = 8;
const int index_buffer_object_size = 6;
float tri_verticies[buffer_object_size] = {
-0.7f, -0.7f, // 0
0.7f, -0.7f, // 1
0.7f, 0.7f, // 2
-0.7f, 0.7f // 3
};
unsigned int tri_indicies[index_buffer_object_size] = {
0, 1, 2,
2, 3, 0
};
VertexArray vertexArray;
VertexBuffer vertexBuffer(tri_verticies, buffer_object_size * sizeof(float)); // no call vertexBuffer.bind() constructor does it
VertexBufferLayout vertexBufferLayout;
vertexBufferLayout.push<float>(3);
vertexArray.add_buffer(vertexBuffer, vertexBufferLayout);
IndexBuffer indexBuffer(tri_indicies, index_buffer_object_size);
ShaderManager shaderManager;
ShaderSource shaderSource = shaderManager.parse_shader("BasicUniform.shader"); // ensure debug working dir is relative to $(ProjectDir)
unsigned int shader = shaderManager.create_shader(shaderSource.vertex_source, shaderSource.fragment_source);
MyGLCall(glUseProgram(shader));
稍后在 main 中我有一个循环,它应该将我的正方形绘制到屏幕上并淡化 1.0f
和 0.0f
之间的蓝色值。
while (!glfwWindowShouldClose(window))
{
MyGLCall(glClear(GL_COLOR_BUFFER_BIT));
vertexArray.bind();
indexBuffer.bind();
MyGLCall(glDrawElements(GL_TRIANGLES, index_buffer_object_size, GL_UNSIGNED_INT, nullptr)); // nullptr since we bind buffers using glGenBuffers
if (blue > 1.0f) {
increment_color = -0.05f;
}
else if (blue < 0.0f) {
increment_color = 0.05f;
}
blue += increment_color;
glfwSwapBuffers(window);
glfwPollEvents();
}
数组 tri_verticies
由具有 2 个分量的顶点坐标组成 (x, y)
。因此,通用顶点属性数据数组规范的元组大小必须为 2 而不是 3:
vertexBufferLayout.push<float>(3);
vertexBufferLayout.push<float>(2);
您实际做的是指定一个具有以下坐标的数组:
-0.7, -0.7, 0.7 // 0
-0.7, 0.7, 0.7 // 1
???, ???, ??? // 2
???, ???, ??? // 3
通常对缓冲区对象的越界访问会产生未定义的结果。
参见 OpenGL 4.6 API Core Profile Specification - 6.4 Effects of Accessing Outside Buffer Bounds, page 79