一周前我开始学习OpenGL,现在我想创建一个网格类。我即将展示的代码给了我一个黑色的屏幕(这是我用它填充的颜色)。
我基本上从我的main函数中剥离了代码并将其放在一个类中,它在main中工作。
mesh.cpp
#include "mesh.h"
mesh::mesh(std::vector<GLfloat> vertices, std::vector<GLuint> indices)
{
this->vertices = vertices;
this->indices = indices;
glGenVertexArrays(1, &vertexArrayObject);
glGenBuffers(1, &vertexBuffer);
glGenBuffers(1, &triangleBuffer);
glBindVertexArray(vertexArrayObject);
glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
glBufferData(GL_ARRAY_BUFFER, this->vertices.size() * sizeof(GLfloat), this->vertices.data(), GL_STATIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, triangleBuffer);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, this->indices.size() * sizeof(GLuint), this->indices.data(), GL_STATIC_DRAW);
glBindVertexArray(0);
}
mesh::~mesh()
{
glDeleteBuffers(1, &triangleBuffer);
glDeleteBuffers(1, &vertexBuffer);
glDeleteVertexArrays(1, &vertexArrayObject);
}
void mesh::update(){
glBindVertexArray(vertexArrayObject);
glDrawElements(GL_TRIANGLES, indices.size(), GL_UNSIGNED_INT, 0);
glBindVertexArray(0);
}
mesh.h
#ifndef MESH_H
#define MESH_H
#include <iostream>
#include <vector>
#include <GL/glew.h>
#include <glm/glm.hpp>
class mesh
{
public:
mesh(std::vector<GLfloat> vertices, std::vector<GLuint> triangles);
~mesh();
void update();
protected:
private:
GLuint vertexArrayObject, vertexBuffer, triangleBuffer;
std::vector<GLfloat> vertices;
std::vector<GLuint> indices;
};
#endif // MESH_H
根据this,这应该是正确的方法(?)。
BTW,所有这些代码都是来自this和open.gl网站的mashup,这里是我传递给构造函数的变量。
对于顶点:
std::vector<GLfloat> vertices = {
// Position Color Texcoords
-0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, // Top-left
0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, // Top-right
0.5f, -0.5f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, // Bottom-right
-0.5f, -0.5f, 0.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f // Bottom-left
};
和指数:
std::vector<GLuint> elements = {
0, 1, 2,
2, 3, 0
};
另请注意,我根据Anton的建议更改了代码段,但似乎无法正常工作
答案 0 :(得分:2)
this->triangles.size() * sizeof(GLfloat)
此问题不会影响任何内容,因为GLfloat
与GLuint
具有相同的大小,但如果这不是拼写错误,则表明您可能认为索引缓冲区错误。
triangles.size () * sizeof (GLuint)
保持一致。
glDrawElements(GL_TRIANGLES, this->vertices.size(), GL_UNSIGNED_INT, 0);
您的班级中有两个单独的列表,vertices
和triangles
,此调用仅关注其中一个列表的大小。
triangles
是一个包含三角形列表的索引数组(每个三角形有3个索引)。绘制元素数组时,传递该列表中的元素数,而不是网格中的顶点数。
虽然技术上不是问题,但我认为在编写代码时使用this->
有点过分。
当你在一个范围内的变量与你的类中的成员具有相同的名称时,这是很有用的(可以认为这可以构建一个描述名称不充分的情况),但在函数中完全没有必要mesh::~mesh()
。它会使你的代码更难阅读(对我来说无论如何),因为这些行更长。
遵循名称不充分的主题,通过调用索引数组&#34; triangles
&#34;你无意中将这个网格类限制为绘制三角形。对于构建三角形网格的专用构造函数而言,这可能是一个很好的变量名,但对于类成员而言则不是那么多。如果您改为使用indices
,则可以摆脱名称冲突,并且需要使用this->
限定所有内容。