【发布时间】:2018-01-05 20:36:54
【问题描述】:
我正在构建一个渲染器,它接收许多对象并将它们批量渲染到屏幕上。完整的渲染器代码 -> https://github.com/rob-DEV/OpenGL-Model-Viewer/tree/master/OpenGL-Model-Viewer/src/graphics/renderer
在每次帧调用时将对象(所有都是包含索引顶点 (8) 和 36 个索引的立方体)推送到渲染器。 //加载模型 for (int j = 0; j
renderer.begin();
for (int i = 0; i < models.size(); i++)
{
//add to render call
renderer.submit(models[i]);
}
renderer.end();
renderer.flush();
渲染初始化()
// Enable depth test
glEnable(GL_DEPTH_TEST);
// Accept fragment if it closer to the camera than the former one
glDepthFunc(GL_LESS);
glGenVertexArrays(1, &m_VAO);
glGenBuffers(1, &m_VBO);
glBindVertexArray(m_VAO);
glBindBuffer(GL_ARRAY_BUFFER, m_VBO);
glBufferData(GL_ARRAY_BUFFER, RENDERER_BUFFER_SIZE, NULL, GL_STATIC_DRAW);
glEnableVertexAttribArray(SHADER_VERTEX_INDEX);
glEnableVertexAttribArray(SHADER_COLOR_INDEX);
glVertexAttribPointer(SHADER_VERTEX_INDEX, 3, GL_FLOAT, GL_FALSE, RENDERER_VERTEX_SIZE, (const GLvoid*)0);
glVertexAttribPointer(SHADER_COLOR_INDEX, 4, GL_UNSIGNED_BYTE, GL_TRUE, RENDERER_VERTEX_SIZE, (const GLvoid*)(offsetof(VertexData, VertexData::colour)));
glBindBuffer(GL_ARRAY_BUFFER, 0);
//setup element
glGenBuffers(1, &m_IBO);
glBindVertexArray(0);
提交对象
void Renderer::submit(ObjModel& object)
{
//a vector of vec3 vertices // these are indexed all objects are cubes so 8 verts per object
std::vector<glm::vec3> vertices = object.get_vertices();
std::vector<unsigned int> indices = object.get_indices();
std::vector<unsigned int> colours = object.get_colours();
//adjust the postion and give each picture a random colour & add to buffer
for (unsigned int i = 0; i < vertices.size(); i++)
{
vertices[i] += object.position;
m_VertexBuffer->vertex = vertices[i];
m_VertexBuffer->colour = colours[i];
m_VertexBuffer++;
m_VertexDataCount++;
}
m_IndiceCount += indices.size();
indiceData.insert(indiceData.end(), indices.begin(), indices.end());
}
如您所见,我将每个顶点(添加在世界中的位置)和颜色放入一个简单的结构 (VertexData*) 中,然后将索引添加到向量中。
这是实际的抽奖
void Renderer::flush()
{
glBindVertexArray(m_VBO);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_IBO);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, m_IndiceCount * sizeof(unsigned int), &indiceData[0], GL_STATIC_DRAW);
// Draw the triangles !
glDrawElements(
GL_TRIANGLES, // mode
m_IndiceCount, // count
GL_UNSIGNED_INT, // type
(void*)0 // element array buffer offset
);
indiceData.clear();
m_IndiceCount = 0;
m_VertexDataCount = 0;
}
我知道长度,但我的问题是,为什么这个位置只适用于第一个立方体(要么是在彼此之上绘制,要么只有第一个立方体绘制)我无法弄清楚。有没有更好的方法让我摆脱想法:)
【问题讨论】:
-
在您致电
glm::vec3(i * 5, i, j * 5)时,您的i价值在哪里? -
嵌套 for 循环抱歉,希望将问题保持在最低限度,请参阅 github。