为什么glDrawElements不渲染我的三角形
Why wont glDrawElements render my triangles?
我一直在关注youtube上BennyBox的3D游戏引擎教程系列。这个系列是用java完成的,由于计算速度的原因,我喜欢c++,我一直遵循教程直到第15节,他开始使用glDrawElements而不是glDrawArrays。到目前为止,在教程中,我一直很好地将他的java代码转换为c++,但现在我可以绘制任何东西,而且opengl没有给我任何错误。我几乎可以肯定,问题是为opengl缓冲数据,或者告诉opengl如何缓冲数据。这是我的密码。
mainGame.cpp:
init:
glClearColor(0.1f, 0.0f, 0.5f, 0.0f);
glFrontFace(GL_CW);
glCullFace(GL_BACK);
glEnable(GL_CULL_FACE);
glEnable(GL_DEPTH_TEST);
glEnable(GL_FRAMEBUFFER_SRGB);
vector<Vertex> vertices;
vertices.push_back(glm::vec3(-1, 1, 0));
vertices.push_back(glm::vec3(0, -0.5f, 0));
vertices.push_back(glm::vec3(-1, -1, 0));
vertices.push_back(glm::vec3(1, 1, 0));
vertices.push_back(glm::vec3(1, -1, 0));
vertices.push_back(glm::vec3(0, 0.5, 0));
vector<unsigned short> indices;
indices.push_back(0);
indices.push_back(1);
indices.push_back(2);
indices.push_back(3);
indices.push_back(4);
indices.push_back(5);
mesh.meshInit();
mesh.addVerticies(vertices, indices);
mesh.draw();
gameRoop:
while (_gameState != GameState::EXIT) {
processInput();
updateScene();
drawScene();
if (_TEST)
{
GLenum err;
while ((err = glGetError()) != GL_NO_ERROR) {
cout << "OpenGL error: " << err << endl;
}
}
}
processInput()目前与opengl绘图无关,updateScene()只会清除屏幕并更新变换对象,但这不是问题所在。我之所以知道,是因为我试着把那个部分注释掉了,opengl仍然没有渲染/绘制任何东西。
drawScene:
shader.bind();
shader.setUniform("translation", transform.getTransformation());
mesh.draw();
SDL_GL_SwapWindow(_window);
以下是mesh类的函数,我认为我没有发送正确的信息。
mesh.cpp:
void Mesh::meshInit()
{
glGenVertexArrays(1, &VAO);
glBindVertexArray(VAO);
glGenBuffers(1, &IBO);
glGenBuffers(1, &VBO);
}
void Mesh::addVerticies(vector<Vertex> vertices, vector<unsigned short> indices)
{
_indices = &indices[0];
_vSize = vertices.size() * sizeof(float);
_iSize = indices.size() * sizeof(unsigned short);
if (_TEST) {
cout << "size of verticies: " << _vSize << endl;
cout << "size of indices: " << _iSize << endl;
cout << "number of verticies: " << vertices.size() << endl;
cout << "number of indices: " << indices.size() << endl;
for (int i = 0; i < vertices.size() ; i++)
{
cout << vertices[i].getPos().x << " ";
cout << vertices[i].getPos().y << " ";
cout << vertices[i].getPos().z << " ";
cout << "n";
}
}
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, _vSize, &vertices[0], GL_STATIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IBO);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, _iSize, &indices[0], GL_STATIC_DRAW);
}
int vertexAtribStride = Vertex::SIZE * sizeof(float);
void Mesh::draw()
{
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, vertexAtribStride, 0);
glEnableVertexAttribArray(0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IBO);
glDrawElements(GL_TRIANGLES, _iSize, GL_INT, _indices);
glDisableVertexAttribArray(0);
}
glDrawElements的第三个参数应该是GL_UNSIGNED_SHORT,最后一个参数应该为0,因为它是从GL_ELEMENT_ARRAY_BUFFER开始的偏移量。除此之外,我不知道Vertex::SIZE是什么,但由于您只有一个属性,您可以将glVertexAttribPointer的步幅设置为0,这样OpenGL就可以假设它们是紧密分组的(事实上)
相关文章:
- 我的神经网络不起作用 [XOR 问题]
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 我的字符计数代码计算错误.为什么
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- cmake在我的项目中所需的所有静态库都不成功
- 为什么我的代码在输出中增加了93天
- 我的简单if-else语句是如何无法访问的代码
- 为什么我的for循环不能正确获取argv
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- 0-1背包代码中的错误.我的代码中有什么错误
- 为我的 c++ 类介绍制作一个三角形分类器.我有几个问题
- 我试图弄清楚如何使用给定数字反转我创建的三角形
- 我如何对此代码进行添加以使用我的 arduino 打印一个完整的三角形
- 为什么我的三角形对象没有被绘制?
- 我的程序C++找到三角形的类型,我的if-else语句遇到问题
- 为什么glDrawElements不渲染我的三角形
- 为什么我的三角形是白色的
- 用Modern OpenGL渲染我的第一个三角形
- 我无法让我的 OpenGL 程序渲染三角形
- DirectX 9.0(世界坐标移动我的对象(三角形)动画