放置在要使用OpenGL渲染的类中的对象

时间:2015-03-05 18:20:49

标签: c++ class opengl c++11 opengl-3

一周前我开始学习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,所有这些代码都是来自thisopen.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的建议更改了代码段,但似乎无法正常工作

1 个答案:

答案 0 :(得分:2)

您有两个问题立即浮现在脑海中:

  1. this->triangles.size() * sizeof(GLfloat)

    此问题不会影响任何内容,因为GLfloatGLuint具有相同的大小,但如果这不是拼写错误,则表明您可能认为索引缓冲区错误。

    • 使此triangles.size () * sizeof (GLuint)保持一致。

  2. glDrawElements(GL_TRIANGLES, this->vertices.size(), GL_UNSIGNED_INT, 0);

    您的班级中有两个单独的列表,verticestriangles,此调用仅关注其中一个列表的大小。

    • triangles是一个包含三角形列表的索引数组(每个三角形有3个索引)。

    绘制元素数组时,传递该列表中的元素数,而不是网格中的顶点数。


  3. 虽然技术上不是问题,但我认为在编写代码时使用this->有点过分。

    当你在一个范围内的变量与你的类中的成员具有相同的名称时,这是很有用的(可以认为这可以构建一个描述名称不充分的情况),但在函数中完全没有必要mesh::~mesh()。它会使你的代码更难阅读(对我来说无论如何),因为这些行更长。

    遵循名称不充分的主题,通过调用索引数组&#34; triangles&#34;你无意中将这个网格类限制为绘制三角形。对于构建三角形网格的专用构造函数而言,这可能是一个很好的变量名,但对于类成员而言则不是那么多。如果您改为使用indices,则可以摆脱名称冲突,并且需要使用this->限定所有内容。