【问题标题】:Can't draw with Buffer Object无法使用缓冲区对象绘制
【发布时间】:2012-12-15 08:25:58
【问题描述】:

所以,我正在尝试研究 vbo 并仅做一些示例,但 opengl 正在杀死我。我已经尝试了四个小时来完成此代码工作,但我不知道为什么这不起作用。 我试图用不同的颜色绘制 4 个正方形。 但是如果我尝试使用GL_POINTS 进行绘制,我只会在屏幕上看到 4 个点,并且应该是 9 个点。如果我尝试使用GL_QUADS,它根本不会画任何东西。 有趣的是,当我改变这一行时:

glDrawElements(GL_POINTS, 16, GL_UNSIGNED_BYTE, BUFFER_OFFSET(0));

到这里:

glDrawElements(GL_POINTS, 64, GL_UNSIGNED_BYTE, BUFFER_OFFSET(0));

Opengl 绘制 9 个点,但仅此而已,GL_QUADS 不起作用。 拜托,有人给我一个关于这个问题的光,它正在杀死我! 完整代码在这里:

#define GL_GLEXT_PROTOTYPES
#include<GL/glut.h>
#include<iostream>
using namespace std;

#define BUFFER_OFFSET(offset) ((GLfloat*) NULL + offset)

#define VERTICES 0
#define INDICES 1
#define NUM_BUFFERS 2

void init_2(){

GLuint buffers[NUM_BUFFERS];

GLfloat vertices[][3]= { 
                {0.0, 0.0,  0.0},
                {0.0, 40.0, 0.0},
                {0.0, 80.0, 0.0},
                {40.0, 0.0, 0.0},
                {40.0, 40.0, 0.0},
                {40.0, 80.0, 0.0},
                {80.0, 0.0, 0.0},
                {80.0, 40.0, 0.0},
                {80.0, 80.0, 0.0}
              };

GLuint indices[][4] = {
              {0, 1, 4, 3}, 
              {1, 2, 5, 4}, 
              {3, 4, 7, 6}, 
              {4, 5, 8, 7}
            };    

glGenBuffers(NUM_BUFFERS, buffers);

glBindBuffer(GL_ARRAY_BUFFER, buffers[VERTICES]);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

glVertexPointer(3, GL_FLOAT, 0, BUFFER_OFFSET(0));

glEnableClientState(GL_VERTEX_ARRAY);

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffers[INDICES]);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
}

void display(void){  

glPushMatrix();         
glDrawElements(GL_POINTS, 16, GL_UNSIGNED_BYTE, BUFFER_OFFSET(0));
glPopMatrix();
glutSwapBuffers();
}

void init() 
{
  glClearColor(0.0, 0.0, 0.0, 0.0);
  gluOrtho2D((GLdouble) -1.0, (GLdouble) 90.0, (GLdouble) -1.0, (GLdouble) 90.0);  
  init2();
}

int main(int argv, char** argc) {

  glutInit(&argv, argc);
  glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
  glutInitWindowSize(500,500);
  glutInitWindowPosition(100,100); 
  glutCreateWindow("myCode.cpp");
  init();
  glutDisplayFunc(display);
  glutMainLoop();

  return 0;  
}

【问题讨论】:

    标签: c++ opengl graphics


    【解决方案1】:

    问题来了:

    GLuint indices[][4] = {
    ...
    glDrawElements(GL_POINTS, 16, GL_UNSIGNED_BYTE, BUFFER_OFFSET(0));
    

    您声明 GLuint 索引,然后告诉 glDrawElements 您正在给它字节。

    GLuint 是 32 位类型,因此每个有 4 个字节。由于您的索引数据非常小,每个 32 位值只有底部字节中的数据,其余为 0。

    所以在前 16 个字节中,也就是前 4 个GLuints,只有 4 个离散值,所以你看到 4 个点。如果您尝试 64(即 16 * 4),您将看到全部 9 个点。但是这些点与很多零混合在一起,因此当您尝试渲染为GL_QUADS 时,不会绘制任何内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多