簡單一個opengl程式,2D圖形移動
阿新 • • 發佈:2019-02-14
很早打算系統的學習一下opengl,但是由於課程以及學習算法佔據了時間,一直沒能開始,現在這段時間開始弄opengl了,這幾天看正在看《Opengl 程式設計指南 第8版》,首先看了GLSL寫shader。這裡先使用固定管線寫個簡單的小例子試試,然後開始進行可程式設計管線。
這個小例子很簡單,就是在2D平面畫個正方形,然後左右移動。
思路很簡單,主要是兩個函式,draw 和 move,draw負責繪製,move負責移動的控制,然後設定兩個回撥函式,glutDisplayFunc和glutIdleFunc,這樣在空閒的時候就會呼叫move函式,設定移動資訊,然後傳送一個重新顯示的訊號,這樣就能回撥draw函式進行在移動後的新位置重新繪製。
#include <gl/glew.h> #include <gl/glut.h> #include <iostream> #include <cstdlib> using namespace std; GLfloat rtx = 0, rty = 0, rtz = 0; void init() { glLoadIdentity(); glClearColor(0.0, 0.0, 0.0, 0.0); } void draw(void) { glClear(GL_COLOR_BUFFER_BIT); glPushMatrix(); glTranslatef(rtx, rty, rtz); glBegin(GL_QUADS); glColor3f(1.0f, 0.0f, 0.0f); glVertex2f(-0.5f, 0.5f); glColor3f(0.0f, 1.0f, 0.0f); glVertex2f(0.5f, 0.5f); glColor3f(0.0f, 0.0f, 1.0f); glVertex2f(0.5f, -0.5f); glColor3f(0.5f, 0.5f, 0.5f); glVertex2f(-0.5f, -0.5f); glEnd(); glPopMatrix(); glutSwapBuffers(); } void move() { static GLfloat step = 0.0002; if (rtx + step > 0.5 || rtx + step < -0.5)step = -step; rtx += step; glutPostRedisplay(); } int main(int argc, char *argv[]) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE); glutInitWindowPosition(100, 100); glutInitWindowSize(300, 300); glutCreateWindow("test"); init(); glutDisplayFunc(draw); glutIdleFunc(move); glutMainLoop(); return 0; }
下面這個例子是glut響應使用者鍵盤輸入的小例子,主要就是依據使用者按下的方向鍵來左右上下移動正方形。
#include <gl/glew.h> #include <gl/glut.h> #include <cstdio> #include <cstdlib> using namespace std; GLfloat rtx = 0.0f, rty = 0.0f, rtz = 0.0f; GLfloat step = 0.05; GLfloat exp = 1e-3; void init() { glLoadIdentity(); glClearColor(0.0, 0.0, 0.0, 0.0); } void draw(void) { glClear(GL_COLOR_BUFFER_BIT); glPushMatrix(); printf("%f %f %f\n", rtx, rty, rtz); glTranslatef(rtx, rty, rtz); glBegin(GL_QUADS); glColor3f(1.0f, 0.0f, 0.0f); glVertex2f(-0.5f, 0.5f); glColor3f(0.0f, 1.0f, 0.0f); glVertex2f(0.5f, 0.5f); glColor3f(0.0f, 0.0f, 1.0f); glVertex2f(0.5f, -0.5f); glColor3f(0.5f, 0.5f, 0.5f); glVertex2f(-0.5f, -0.5f); glEnd(); glPopMatrix(); glutSwapBuffers(); } /* special key defined in glut #define GLUT_KEY_F1 1 #define GLUT_KEY_F2 2 #define GLUT_KEY_F3 3 #define GLUT_KEY_F4 4 #define GLUT_KEY_F5 5 #define GLUT_KEY_F6 6 #define GLUT_KEY_F7 7 #define GLUT_KEY_F8 8 #define GLUT_KEY_F9 9 #define GLUT_KEY_F10 10 #define GLUT_KEY_F11 11 #define GLUT_KEY_F12 12 #define GLUT_KEY_LEFT 100 #define GLUT_KEY_UP 101 #define GLUT_KEY_RIGHT 102 #define GLUT_KEY_DOWN 103 #define GLUT_KEY_PAGE_UP 104 #define GLUT_KEY_PAGE_DOWN 105 #define GLUT_KEY_HOME 106 #define GLUT_KEY_END 107 #define GLUT_KEY_INSERT 108 */ void processKeyBoard(int key, int x, int y) { switch (key) { case GLUT_KEY_LEFT: if (rtx - step > -0.53)rtx -= step; break; case GLUT_KEY_RIGHT: if (rtx + step < 0.53)rtx += step; break; case GLUT_KEY_UP: if (rty + step < 0.53)rty += step; break; case GLUT_KEY_DOWN: if (rty - step > -0.53)rty -= step; break; default: break; } glutPostRedisplay(); return; } int main(int argc, char *argv[]) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE); glutInitWindowPosition(100, 100); glutInitWindowSize(600, 600); glutCreateWindow("test"); init(); glutDisplayFunc(draw); //glutIdleFunc(move); glutSpecialFunc(processKeyBoard); glutMainLoop(); return 0; }