1. 程式人生 > >簡單一個opengl程式,2D圖形移動

簡單一個opengl程式,2D圖形移動

很早打算系統的學習一下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;
}