使用VBO的正方形类

OPENGL: Square Class Using VBO

本文关键字:正方形 VBO 使用      更新时间:2023-10-16

所以,我试图做一个基本的"Drawable"类,在后台为我处理很多绘图,我想使用现代的OpenGL(没有开始和结束语句)。当我运行draw()时,我总是得到一个空白的屏幕。

我已经运行调试器并检查了,我的数组被正确初始化为3xFLOAT的位置和4xFLOAT的颜色。知道哪里出了问题吗?我对这个图书馆很陌生。我的例子试图在(+-0.5,+-0.5,0.0)处画一个红色立方体,所以indexData数组就是{0,1,2,3}。

#define DRAWABLE_VERTEX_DEPTH 3
#define SIZE_OF_VERTEX_ELEMENT sizeof(GLfloat)
#define VERTEX_SIZE (DRAWABLE_VERTEX_DEPTH * SIZE_OF_VERTEX_ELEMENT)
#define DRAWABLE_COLOR_DEPTH 4
#define SIZE_OF_COLOR_ELEMENT sizeof(GLfloat)
#define COLOR_SIZE (DRAWABLE_COLOR_DEPTH * SIZE_OF_COLOR_ELEMENT)
#define INDEX_SIZE sizeof(GLushort)
#define DRAWABLE_STRIDE (VERTEX_SIZE + COLOR_SIZE)
inline Drawable(/*Arguments omitted for brevity...*/)
    {
        //Standard initialization omitted....
        glGenBuffers(1, &vboID);
        glGenBuffers(1, &vioID);
        glGenVertexArrays(1, &vaoID);
        glBindBuffer(GL_ARRAY_BUFFER, vboID);
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vioID);
        glBufferData(GL_ARRAY_BUFFER, (VERTEX_SIZE + COLOR_SIZE) * vertexCount, vertexData, drawType);
        glBufferData(GL_ELEMENT_ARRAY_BUFFER, INDEX_SIZE * indexCount, indexData, drawType);
        glEnableVertexAttribArray(0);
        glEnableVertexAttribArray(1);
        glBindBuffer(GL_ARRAY_BUFFER, 0);
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
        //Generate Vertex Array
        glBindVertexArray(vaoID);
        glBindBuffer(GL_ARRAY_BUFFER, vboID);
        glEnableVertexAttribArray(0);
        glEnableVertexAttribArray(1);
        glVertexAttribPointer(0, DRAWABLE_VERTEX_DEPTH, GL_FLOAT, GL_FALSE, DRAWABLE_STRIDE, 0);
        glVertexAttribPointer(1, DRAWABLE_COLOR_DEPTH, GL_FLOAT, GL_FALSE, DRAWABLE_STRIDE, (GLbyte*)VERTEX_SIZE);
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vioID);
        glBindVertexArray(0);
    }
    inline void draw()
    {
        glBindVertexArray(vaoID);
        glDrawElements(drawMode, indexCount, GL_UNSIGNED_SHORT, NULL);
        glBindVertexArray(0);
    }

GLSL顶点着色器:

#version 430rn
in layout(location=0) vec3 inPosition;
in layout(location=1) vec4 inColor;
out vec4 outVertexColor;
void main()
{
    gl_Position = vec4(inPosition, 1.0);
    outVertexColor = inColor;
}

GLSL Fragment Shader:

#version 430rn
in vec4 outVertexColor;
out vec4 outFragmentcolor;
void main()
{
    outFragmentcolor = outVertexColor;
}

除了评论中提到的问题外,您的索引数组是GLushort (unsigned 16位),而您的draw调用指定GL_UNSIGNED_INT (unsigned 32位)。替换为GL_UNSIGNED_SHORT.