コンピュータグラフィックス——OpenGL学習シリーズのGraphics 2 D


コンピュータグラフィックス——OpenGL学習シリーズのGraphics 2 D


まず、テスト用のコードを分析します.
#include 
void Draw()
{
    glClear(GL_COLOR_BUFFER_BIT);
    glRectf(-0.5f, -0.5f, 0.5f, 0.5f);
    glFlush();
}
int main(int argc, char *argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
    glutInitWindowPosition(100, 100);
    glutInitWindowSize(400, 400);
    glutCreateWindow("HelloOpenGL");
    glutDisplayFunc(&Draw);
    glutMainLoop();
    return 0;
}

main関数のいくつかのglut関数の役割を説明します.
1、glutInit、glut初期化、この関数は他のGLUT関数を使用する前に一度呼び出さなければならない.
2、glutInitDisplayMode、表示方式を設定し、GLUT_RGBはRGB色を使用していることを示します.
3、glutInitWindowPosition、画面上のウィンドウの位置を設定します.
4、glutInitWindowSize、ウィンドウのサイズを設定します.
5、glutCreateWindow、ウィンドウを作成し、与えられた文字列パラメータはウィンドウのタイトルである.
6、glutDisplayFunc、図形描画関数を登録する.グラフ関数Draw()だけをパラメータにすればいいのです.
7、glutMainLoop、メッセージループを行う.
注意:main関数のglutInitDisplayMode()関数のパラメータは、プログラムのバッファを設定し、アニメーションを行うときに使用できます.
アニメーションを実装すると、OpenGLはデュアルバッファを提供します.Aバッファが表示されると、Bバッファはグラフィックを描画しています.Bが描画されるとバッファが交換され、Bが表示され、Aが描画される.これにより、フレームごとにスムーズに表示され、観客は完成していない画面を永遠に見ることができない.コンピュータはバッファを交換するとき、速度が速いので、一般のユーザーは気づかない.
私たちのプログラムがデュアルバッファを使用できるように、main関数のglutInitDisplayMode()関数のパラメータを変更し、GLUT_SINGLEをGLUT_に変更DOUBLEは、デュアルバッファ(double)を使用することを示しています.以前はシングルバッファ(single)でした.
draw関数ではglの先頭にある関数が,我々のOpenGLの標準関数である.
glClear()文の役割は、クリアカラーを使用して指定したバッファをクリアすることです.パラメータGL_COLOR_BUFFER_BITとは、現在書き込み可能なカラーバッファをクリアカラーでクリアすることであり、クリアカラーはglClearColor()関数で設定することができる.
glRectf()は長方形を描き、4つのパラメータは対角線の左下の点の横縦座標と右上の点の横縦座標である.
glFlush()の役割は、前のglコマンドを実行することです.
OpenGLでは、頂点を指定する前にglBegin()関数を呼び出し、頂点を指定した後にglEnd()を呼び出す必要があります.glBegin関数のパラメータは、私たちが描きたい図形に関係しています.
例:
glBegin(GL_POINTS); glVertex2f(0.0f,0.0f); glVertex2f(0.5f,0.5f); glEnd();
このとき、この2つの点が描かれます.GL_をPOINTSをGL_に変更LINEでは、この2つの点を端点とする直線が描かれます.前章のDraw関数を
voidDraw() {     glClear(GL_COLOR_BUFFER_BIT);     glBegin(GL_POINTS);     glVertex2f(0.0f,0.0f);     glVertex2f(0.5f,0.5f);     glEnd();     glFlush(); }
運転すると2つの小さな白い点が見えます.
次のプログラムでは、一般的な2 D作図方法を使用します.
#include 
void myDisplay(void){
     glClear(GL_COLOR_BUFFER_BIT);
	 //   glBegin glEnd 
	 //   
     glPointSize(5.0f);
     glBegin(GL_POINTS);
         glVertex2f(0.0f, 0.0f);
         glVertex2f(0.5f, 0.5f);
     glEnd(); 
	 //   、 
	 glLineWidth(2.8f);
	 glEnable(GL_LINE_STIPPLE);
	 glLineStipple(2,0x0F0F);
	 glBegin(GL_LINES);
		 glVertex2f(0.0f,0.0f);
		 glVertex2f(0.5f,0.5f);
	 glEnd();
	 // 
	 glColor3f(0.4,0.2,0.1);
	 glBegin(GL_LINE_STRIP);
		glVertex2f(0,0);
		glVertex2f(0.3,0.3);
		glVertex2f(0.4,0.5);
	 glEnd();
	 // 
	 glBegin(GL_TRIANGLES);
		glVertex2f(0,0);
		glVertex2f(0.5,0);
		glVertex2f(0.3,-0.3);
	 glEnd();
	 // 
	 glColor3f(0,0.5,0.3);
	 glBegin(GL_QUADS);
		glVertex2f(0,0);
		glVertex2f(0,0.5);
		glVertex2f(-0.5,0.5);
		glVertex2f(-0.5,0);
	 glEnd();
	 // N 
	 glColor4f(0,0.5,0.3,0.3);
	 glBegin(GL_POLYGON);
		glVertex2f(0,0);
		glVertex2f(-0.2,-0.1);
		glVertex2f(-0.3,-0.4);
		glVertex2f(-0.7,-0.5);
		glVertex2f(-0.75,-0.55);
		glVertex2f(-0.8,-0.3);
	 glEnd();
	 //// 
	 glShadeModel(GL_SMOOTH);	// , , Smooth 
	 glBegin(GL_TRIANGLES);
		glColor3f(0.7,0,0.3);
		glVertex2f(0,0.5);
		glColor3f(0.5,0.2,0.3);
		glVertex2f(-0.4,-0.3);
		glColor3f(0.3,0.3,0.4);
		glVertex2f(0.4,-0.3);
	 glEnd();
	 glBegin(GL_TRIANGLES);
		glColor3f(0.3,0.4,0.3);
		glVertex2f(-0.4,0.3);
		glColor3f(0.2,0.4,0.4);
		glVertex2f(0.4,0.3);
		glColor3f(0,0.5,0.3);
		glVertex2f(0,-0.5);
	 glEnd();

	glFlush();
}
int main(int argc, char *argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
    glutInitWindowPosition(100, 100);
    glutInitWindowSize(400, 400);
    glutCreateWindow("HelloOpenGL");
    glutDisplayFunc(&myDisplay);
    glutMainLoop();
    return 0;
}

参考文献:http://www.linuxidc.com/Linux/2013-02/78959p3.htm