Простой VBO не отображается

Я использую вершину с тремя поплавками для позиции (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;
}

0

Решение

Вы, кажется, используете неправильный шаг. Шаг должен быть расстоянием от начала одной вершины до начала следующей вершины, или в вашем случае 6 плавает.

Вы установили шаг как el_size, что составляет всего 3 поплавка.

Также позаботьтесь о том, чтобы ваша функция изменения размера использовала орто-матрицу от 0 до ширины экрана, а ваша функция инициализации — от -1 до 1. Если когда-либо будет вызвано изменение размера, ваша сцена станет радикально другой.

1

Другие решения

Я вижу одну проблему в том, что glOrtho в функции инициализации. Что бы вы ни собирались делать, это, безусловно, не делает то, что вы хотите. Как правило, все команды, связанные с состоянием чертежа, помещайте только в функцию отображения, нигде больше. Установка матриц преобразования (и области просмотра) должна происходить там. Это спасет от многих головных болей позже.

Другая проблема заключается в том, что определенный вами шаг — короткий. Шаг — это расстояние от вершины до вершины в чересстрочном массиве, а не длина одного атрибута. el_size рассчитывается неправильно.

0

По вопросам рекламы [email protected]