OpenGL缓冲区问题

哈尔吉

在过渡到linux之后,我最近又回到了OpenGL。出于某种原因或其他,诸如此类glGenBuffersglBindBuffer等等,不存在与正常GL头,并导致我的程序中使用GLEW崩溃。为了解决这个问题,我一直在使用GLES2。

现在的问题是:

#include <SFML/Graphics.hpp>
#include <GLES2/gl2.h>
#include <GL/gl.h>

int main() {
  sf::RenderWindow window(sf::VideoMode(640, 480), "OpenGL Tests");

  glOrtho(0, 640, 0, 480, -1, 1);
  glEnable(GL_TEXTURE_2D);
  glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  glEnable(GL_BLEND);
  glClearColor(0, 0, 0, 0);

  //x, y, r, g, b
  GLfloat triangleVertices[15] = {
    10, 10, 1, 0, 0,
    110, 10, 0, 1, 0,
    60, 96.6f, 0, 0, 1
  };
  GLuint triangleBuf;

  glGenBuffers(1, &triangleBuf);
  glBindBuffer(GL_VERTEX_ARRAY, triangleBuf);
  glBufferData(GL_VERTEX_ARRAY, sizeof(triangleVertices), triangleVertices, GL_STATIC_DRAW);
  glBindBuffer(GL_VERTEX_ARRAY, 0);

  while(window.isOpen()) {
    sf::Event event;

    while(window.pollEvent(event)) {
      if(event.type == sf::Event::Closed) window.close();
    }

    glClear(GL_COLOR_BUFFER_BIT);

    glBindBuffer(GL_VERTEX_ARRAY, triangleBuf);
    glEnableClientState(GL_VERTEX_ARRAY);
    glVertexPointer(2, GL_FLOAT, 3, 0);
    glEnableClientState(GL_COLOR_ARRAY);
    glColorPointer(3, GL_FLOAT, 2, (GLfloat*) 2);
    glDrawArrays(GL_TRIANGLES, 0, 3);

    window.display();
    sf::sleep(sf::milliseconds(50));
  }

  glDeleteBuffers(1, &triangleBuf);
}

这就是我记得使用缓冲区的方式,尽管老实说我不相信自己的记忆。似乎有充分的理由,因为这在窗口打开后立即崩溃。

我尝试将最后一个参数更改glDrawArrays为1而不是3。我还尝试将缓冲区绑定两次,第一次是GL_VERTEX_ARRAY,然后是glVertexPointer,第二次是GL_COLOR_ARRAY,然后是glColorPointer没有骰子。

拉比德76

的第三个参数glVertexPointer分别glColorPointer是连续(步长)之间的字节偏移。如果绑定了命名缓冲区对象,则第4个参数也将被视为字节偏移量。
stride参数必须为5 * sizeof(GLfloat),因为每个属性元组都包含5(GLfloat)个分量(X,Y,R,G,B)。顶点坐标的偏移为0,因为它们在开始处。颜色的偏移量是2 * sizeof(GLfloat),因为颜色位于顶点坐标的2个分量之后。

此外GL_VERTEX_ARRAY,不是有效的缓冲区目标。顶点属性的缓冲区目标为GL_ARRAY_BUFFER错误的用法GL_VERTEX_ARRAY将导致INVALID_ENUM错误。错误信息可以通过获取glGetError

进行以下更改:

glGenBuffers(1, &triangleBuf);
glBindBuffer(GL_ARRAY_BUFFER, triangleBuf);
glBufferData(GL_ARRAY_BUFFER, sizeof(triangleVertices), triangleVertices, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ARRAY_BUFFER, triangleBuf);

glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(2, GL_FLOAT, 5*sizeof(GLfloat), 0);

glEnableClientState(GL_COLOR_ARRAY);
glColorPointer(3, GL_FLOAT, 5*sizeof(GLfloat), (GLfloat*)(2*sizeof(GLfloat)));

由于您不绑定纹理,并且您甚至已经指定了纹理坐标网,因此请勿启用二维纹理:

glEnable(GL_TEXTURE_2D);

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

OpenGL中的缓冲区绘图

来自分类Dev

Android OpenSLES缓冲区饥饿问题

来自分类Dev

OpenGL复制顶点缓冲区对象

来自分类Dev

为什么我的opengl场景有深度缓冲区问题?

来自分类Dev

使用OpenCL获取OpenGL缓冲区

来自分类Dev

如何增加OpenGL缓冲区?

来自分类Dev

OpenGL:glLoadMatrix和深度缓冲区

来自分类Dev

Python,Macports和缓冲区问题

来自分类Dev

在OpenGL中更新模具缓冲区时的问题

来自分类Dev

OpenGL glMultiDrawElementsIndirect与交错缓冲区

来自分类Dev

JavaFX 8 Z缓冲区问题

来自分类Dev

OpenGL帧缓冲区+ LibGDX

来自分类Dev

libGDX帧缓冲区Alpha问题

来自分类Dev

不能混合使用OpenGL缓冲区和CPU缓冲区

来自分类Dev

在openGL中多次绑定缓冲区

来自分类Dev

Java LWGJL opengl缓冲区数据

来自分类Dev

OpenGL 16位模板缓冲区?

来自分类Dev

OpenGL的缓冲区如何工作?

来自分类Dev

深度+模板帧缓冲区问题

来自分类Dev

OpenGL缓冲区,gLFlush和glutSwapBuffers()

来自分类Dev

在OpenGL中查看深度缓冲区

来自分类Dev

OpenGL快速回读缓冲区

来自分类Dev

OpenGL绘制顶点缓冲区对象

来自分类Dev

OpenGL帧缓冲区绑定目标

来自分类Dev

C基本环形缓冲区问题

来自分类Dev

关于Vi / Vim缓冲区的问题

来自分类Dev

libGDX帧缓冲区Alpha问题

来自分类Dev

缓冲区溢出问题

来自分类Dev

GetProcessImageFileNameA 问题,缓冲区大小不足