gpt4 book ai didi

c++ - 为什么 glDrawElements 不渲染我的三角形?

转载 作者:行者123 更新时间:2023-11-30 03:43:06 25 4
gpt4 key购买 nike

我一直在关注 YouTube 上 theBennyBox 的 3D 游戏引擎教程系列。该系列是用 Java 完成的,我喜欢 C++,因为计算速度的原因,我一直按照教程一直到 #15,他开始使用 glDrawElements 而不是 glDrawArrays。到目前为止,在教程中,我一直很好地将他的 Java 代码转换为 C++,但现在我可以绘制任何东西,而且 OpenGL 没有给我任何错误。我几乎可以肯定问题是为 opengl 缓冲数据或告诉 opengl 数据是如何缓冲的。这是我的代码。

主游戏.cpp:

初始化:

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();

游戏循环:

    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 仍未渲染/绘制任何内容。

绘制场景:

shader.bind();
shader.setUniform("translation", transform.getTransformation());
mesh.draw();
SDL_GL_SwapWindow(_window);

这是我认为我没有发送正确信息的网格类函数。

网格.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 就会假设它们是紧密打包的(它们是)

关于c++ - 为什么 glDrawElements 不渲染我的三角形?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36344560/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com