0

私はopenglチュートリアルに従っていますが、何らかの理由でreshape関数を追加しました(ウィンドウのサイズを変更して比率を修正するため)。openglウィンドウには、オブジェクト(形状)はまったく表示されず、黒い画面だけが表示されます。スペルミスか何かをしたかどうかわかりません。

リシェイプ機能は物事を台無しにしていますか?

#include <GL/gl.h>
#include <GL/glut.h>

void renderScene(void);
void changeSize(int w, int h);

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

// init GLUT and create window
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
glutInitWindowPosition(100,100);
glutInitWindowSize(320,320);
glutCreateWindow("Testing");

// register callbacks
glutDisplayFunc(renderScene);

// animation in reshaping
glutReshapeFunc(changeSize);

// enter GLUT event processing cycle
glutMainLoop();

return 1;
}

void renderScene(void){

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glBegin(GL_TRIANGLES);
    glVertex3f(-0.5,-0.5,0.0);
    glVertex3f(0.5,0.0,0.0);
    glVertex3f(0.0,0.5,0.0);
glEnd();

glutSwapBuffers();
}

void changeSize(int w, int h){

if (h==0)
    h = 1;
float ratio = 1.0*w/h;

// use the projection matrix
glMatrixMode(GL_PROJECTION);

//reset matrix
glLoadIdentity();

// set the viewpoint to be the entire window
glViewport(0,0,w,h);

// set the correct perspective
gluPerspective(45, ratio, 1, 1000);

// get back to the modelview
glMatrixMode(GL_MODELVIEW);
}

助けてくれてありがとう!これは、Lighthouse3dチュートリアルからのものです。

PS:リシェイプ機能を外すと、三角形が表示されます(正常に動作します)。

4

2 に答える 2

4

三角形はそのままでは、gluPerspective で定義した射影行列からは見えません。

この行列は、-z 方向を指し、z=-1 に近い面、z=-1000 に遠い面を持つビュー コーンを定義します。

三角形は z=0 平面上にあるため、表示されません。

次のいずれかを実行できます。

  1. 三角形を z 方向にさらに後方に移動します ( glTranslate(0,0,-2)、または頂点を手動で移動します)。

  2. 次のように、カメラを (0,0,0) から遠ざけるビュー マトリックスを使用します。gluLookAt

  3. 次のように、z=0 平面を含む正投影行列を使用します。glOrtho(-1, 1, -1, 1, -1, 1)

于 2012-09-01T22:48:52.343 に答える
1

私が見ているように、黒い三角形をシーンにレンダリングしているか、ビューの外に (カメラの後ろなどに) レンダリングしているか、またはその両方を行っています。それを診断するには、まず照明に依存しない方法で三角形をレンダリングしてみてください。最初の呼び出しglColor3f(1.0,1.0,1.0);の前のどこかにステートメントを追加します。glVertex()白い三角形が表示されたら、問題は解決しました。それでも黒い場合は、これを上記のコードの前後に置きます。

glPushMatrix(); //save the modelview
glTranslatef(0.0,0.0,-10); //move the rendering coords

glBegin(GL_TRIANGLES);
  glColor3f(1.0,1.0,1.0);
  glVertex3f(-0.5,-0.5,0.0);
  glVertex3f(0.5,0.0,0.0);
  glVertex3f(0.0,0.5,0.0);
glEnd();

glPopMatrix();//restore the view matrix to the original

glTranslatefうまくいかない場合は、xyz パラメーターに別の値を代入してみてください (タイルごとに 1 つ、0、-10、0 など)。初期化ルーチンのどこかに入れてみることもglDrawBuffer(GL_FRONT_AND_BACK);できますが、とにかくこれがデフォルトである可能性があります。

編集 三角形が xz 平面に沿った原点 (0,0,0) にあることに気付きました。これは、カメラのデフォルトの場所です (したがって、ニアクリッピング平面の 1 単位後ろにあります)。三角形をビューに変換するか、モデルビュー マトリックスを変更して同じものをエミュレートする必要があります (たとえば、lookAt を使用。どちらの方法も本質的に同じです)。三角形を真横から見ている可能性もあり、それによって見えなくなります。その場合、glRotatef(90,1,0,0); を挿入します。指導上記の glTranslate を使用して、三角形を正しい角度に「回転」させます。平行移動、拡大縮小、回転は、その中のオブジェクトではなく、空間自体に作用することに注意してください。したがって、すべて逆方向に作用します。通常、最初にオブジェクトをスケーリングし、次に回転させてから、任意の場所に移動します。OpenGL では、座標を変換し、回転させてからスケーリングします。次に、GL はオブジェクトを '0,0,0' と思われる場所に描画します。これは現在、変更された位置にあります。

于 2012-09-02T00:14:36.987 に答える