c++ - OPENGL:使用 VBO 的方形类

标签 c++ opengl vbo vertex-buffer vertex-array

因此,我正在尝试制作一个基本的“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 430\r\n

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 片段着色器:

#version 430\r\n

in vec4 outVertexColor;
out vec4 outFragmentcolor;

void main()
{
    outFragmentcolor = outVertexColor;
}

最佳答案

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

关于c++ - OPENGL:使用 VBO 的方形类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33004415/

相关文章:

c++ - Arduino 中 'StandardCplusplus' 库的问题

OpenGL翻转或镜像绘图对象

c - 用于tilemap的VBO(绘制顺序和倾斜的2D航空)

c++ - 我的着色器初始化代码有什么问题?

android - 通过 MappedByteBuffer 将原始 VBO 数据加载到 OpenGL(不工作)

c# - 在 C# 中使用交错顶点的 VBO

c++ - 使用顶点缓冲区用 OpenGL 显示规则网格的最快方法是什么?

c++ - 将静态 unordered_map 放入 XCode 中的不同编译单元时被删除

c++ - 智能指针管理数组中的智能指针

opengl - 如果程序退出时无法删除顶点缓冲区对象,会发生什么情况?