簡體   English   中英

OpenGL 緩沖區問題

[英]OpenGL buffer woes

我最近在過渡到 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 沒有骰子。

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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM