コンピュータグラフィックス——OpenGL学習シリーズのGraphics 2 D
3963 ワード
コンピュータグラフィックス——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
#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;
}
#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;
}