0

位置 (XYZ) に 3 つの浮動小数点数、色 (RGB) に他の 3 つの浮動小数点数を持つ頂点を使用しています。

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;
}
4

2 に答える 2

1

あなたは間違ったストライドを使用しているようです。ストライドは、1 つの頂点の開始点から次の頂点の開始点までの距離、またはあなたの場合は 6 フロートである必要があります。

ストライドを に設定しましたがel_size、これはフロート 3 つだけです。

また、サイズ変更関数が 0 から画面幅までのオルソ マトリックスを使用していること、および init 関数がそれを -1 から 1 に設定していることにも注意してください。サイズ変更が呼び出されると、シーンは根本的に異なります。

于 2012-10-10T00:16:18.413 に答える
0

glOrtho私が目にする 1 つの問題は、init 関数での呼び出しです。あなたが何をしようとしても、これは確かにあなたが望むことをしません。原則として、描画状態に関連するすべてのコマンドは表示関数にのみ配置し、それ以外の場所には配置しません。変換マトリックス (およびビューポート) の設定はそこで行われます。そうすることで、後で多くの頭痛の種を救うことができます。

もう 1 つの問題は、定義したストライドが短すぎることです。ストライドは、1 つの属性の長さではなく、インターレース配列内の頂点から頂点までの距離です。el_size計算が間違っています。

于 2012-10-10T00:18:49.763 に答える