【问题标题】:OPENGL: Square Class Using VBOOPENGL:使用 VBO 的方形类
【发布时间】:2015-10-08 00:00:50
【问题描述】:

所以,我正在尝试创建一个基本的“可绘制”类,它在后台为我处理大量绘图,并且我想使用现代 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;
}

【问题讨论】:

  • 你必须在调用glBindVertexArray(vaoID);之前调用glEnableClientState(GL_VERTEX_ARRAY);,在glBindVertexArray(0);之后调用glDisableClientState(GL_VERTEX_ARRAY);
  • 感谢您的回复!我刚刚添加了它,但它似乎没有效果。那究竟是做什么的?我在绑定顶点数组的两个地方都需要它吗?
  • 我只是快速查看了您的代码,发现缺少此内容。它基本上启用/禁用参数中指定的功能。尝试将glEnableVertexAttribArray(0); glEnableVertexAttribArray(1); 放在那里。并且不要忘记再次禁用它。
  • 仍然没有运气...只是一个空白屏幕。我想知道这是否与我在 VBO 中交错颜色和顶点信息这一事实有关。
  • 你在使用着色器吗?您的代码正在使用只能与着色器一起使用的通用顶点属性。此外,索引类型不匹配。您使用GLushort 来计算大小,但GL_UNSIGNED_INT 作为glDrawElements() 的参数。

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


【解决方案1】:

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

【讨论】:

  • 除了cmets中提到的问题? cmets中已经提到了这个确切的问题。
  • 是的,我改变了它,但它不起作用。那是我后来尝试用来解决问题的更改。我认为这是我的顶点数组或启用的问题。知道吗? VArrays 是否只是在绑定时重复所有存储的启用/绑定?
  • 呃..所以我的着色器代码缺少分号以及这个问题。万分感谢! 觉得自己很蠢
  • @guitar80:当事情无法编译/链接时,让你的shader loader 尖叫血腥谋杀,有助于防止那种令人头疼的事情:)
  • @RetoKoradi 抱歉,没有注意到您的评论,可能是因为它没有被扩展
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多