【问题标题】:Simple VBO doesn't display简单的 VBO 不显示
【发布时间】:2012-10-10 00:08:10
【问题描述】:

我正在使用一个顶点,其中三个浮点数作为位置 (XYZ),另外三个浮点数作为颜色 (RGB):

XYZ RGB XYZ RGB ...

我目前正在尝试绘制一个红色三角形。不幸的是,我最终得到了一个白色的窗口。我认为步幅有问题,但我无法弄清楚。我尝试了许多步幅和大小的值,但它似乎没有显示任何内容。

//main.cpp
#include "data.h"
GLuint ID;
int size,el_size;

void init(){
vector<float>data_vector(18);

data_vector[0]=0; //x
data_vector[1]=0; //y
data_vector[2]=0; //z
data_vector[3]=1;
data_vector[4]=0;
data_vector[5]=0;
data_vector[6]=1; //x
data_vector[7]=0; //y
data_vector[8]=0; //z
data_vector[9]=1;
data_vector[10]=0;
data_vector[11]=0;
data_vector[12]=0; //x
data_vector[13]=1; //y
data_vector[14]=0; //z
data_vector[15]=1;
data_vector[16]=0;
data_vector[17]=0;

size=data_vector.size();


// Init GLEW
if ( glewInit() != GLEW_OK ){
    cerr << "Failed to initialize GLEW." << endl;
    exit(-1);
}   

if ( !glewIsSupported("GL_VERSION_1_5") && !glewIsSupported( "GL_ARB_vertex_buffer_object" ) ){
    cerr << "ARB_vertex_buffer_object not supported!" << endl;
    exit(-2);
}
glOrtho(-1, 1,1,-1, -5.0f, 5.0f);

glClearColor(1.0f, 1.0f, 1.0f, 0.0f);
glShadeModel(GL_SMOOTH);
glEnableClientState(GL_VERTEX_ARRAY);
glGenBuffers(1,&ID);
glBindBuffer(GL_ARRAY_BUFFER, ID);
glBufferData(GL_ARRAY_BUFFER,size*sizeof(float), &data_vector[0], GL_STATIC_DRAW);

el_size=3*sizeof(data_vector[0]);
}

void reshape(int w, int h){
cout<<"reshape"<<endl;
glViewport(0,0, (GLsizei) w, (GLsizei) h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0f, (GLdouble) w, 0.0f, (GLdouble) h);
}

void display(){

cout<<"display"<<endl;
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glBindBuffer(GL_ARRAY_BUFFER, ID);
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, el_size, 0);

glEnableClientState(GL_COLOR_ARRAY);
glColorPointer(3,GL_FLOAT, el_size,(void*)(el_size));

glDrawArrays(GL_TRIANGLES,0,size/6);

glFlush();  
}

int main(int argc, char **argv){
cout<<"main"<<endl;
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(500,500);
glutInitWindowPosition(300,300);
glutCreateWindow(argv[0]);
init();
glutDisplayFunc(display);
 // glutReshapeFunc(reshape);
glutMainLoop();


return 0;
}

【问题讨论】:

    标签: c++ opengl vbo


    【解决方案1】:

    您似乎使用了不正确的步幅。步幅应该是从一个顶点的起点到下一个顶点的起点的距离,或者在您的情况下为 6 个浮点数。

    您已将步幅设置为el_size,即只有 3 个浮点数。

    还要注意你的 resize 函数使用的是从 0 到屏幕宽度的正交矩阵,而你的 init 函数将它设置为从 -1 到 1。如果 resize 被调用,你的场景将变得完全不同。

    【讨论】:

    • 我已将步幅更改为以下内容:el_size=6*sizeof(float); 我得到以下三角形。 dl.dropbox.com/u/17050698/result.png整个表面应该是红色的(而不是绿色和黑色)。
    • 那是因为您的颜色参数offset 不正确。 stride 应该是 6 个浮点数,offset 应该是 3 个浮点数。他们不是同一个意思。 @arnaud13
    • 现在可以使用了。非常感谢。我会考虑您的 glOrtho 建议。
    【解决方案2】:

    我看到的一个问题是在 init 函数中调用 glOrtho。无论您打算做什么,这肯定不会做您想要的。作为一般规则,将所有与绘图状态相关的命令只放入显示功能中,不要放在其他地方。应该在那里设置转换矩阵(和视口)。这样做可以省去很多麻烦。

    另一个问题是,您定义的步幅太短。步幅是交错数组中顶点到顶点的距离,而不是单个属性的长度。 el_size 计算错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-29
      相关资源
      最近更新 更多