OpenGL三角形的雙面不一樣顏色的繪製

對於一個三角形,我要給它正反面不一樣的顏色。而後經過旋轉,看出它的效果。html

我只想到了2種方法,下面我來寫一下這兩種方法。緩存

第一種方法,經過角度的判斷重設glColor3f的參數(這種方法侷限性很大,不推薦,不喜歡的能夠直接跳過看第二種)。函數

對於一個平面,咱們知道,當它旋轉到必定角度的時候,它就變成了一條線,那麼,咱們只要對這個角度進行一下判斷就能夠了。oop

下面是個人測試代碼:測試

 

#include <GL/glut.h>

GLfloat yrot; //饒y軸旋轉

void display()
{
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 清除屏幕和深度緩存
	glLoadIdentity(); // 重置當前的模型觀察矩陣
	glTranslatef(0.0f, 0.0f, -5.0f); // 移入屏幕5個單位
	glColor3f(1.0f, 0.0f, 0.0f); // 顏色設置爲紅色
	if ((int)yrot % 360 > 90 && (int)yrot % 360 < 270)
		glColor3f(1.0f, 1.0f, 0.0f); // 黃色
	glRotatef(yrot, 0.0f, 1.0f, 0.0f);
	glBegin(GL_TRIANGLES); // 開始繪製三角形
		glVertex3f(0.0f, 1.0f, 0.0f); // 上頂點
		glVertex3f(-1.0f, -1.0f, 0.0f); // 左下頂點
		glVertex3f(1.0f, -1.0f, 0.0f); // 右下頂點
	glEnd(); // 結束繪製
	glutPostRedisplay(); // 重繪
	glFlush(); // 強制刷新緩衝
	
}

 

 

第二種方法,在同一個地方繪製兩個三角形(不一樣顏色的),而後經過剔除多邊形背面的方式實現。spa

先來介紹一下繪製方式,在默認狀況下,逆時針繪製的是正面,順時針繪製的是背面,固然,能夠經過glFrontFace(GL_CCW)是它相反。code

既然如此,那麼就能夠繪製兩個正好相反的三角形,一個正面(紅色)一個背面(藍色)。htm

而後對其剔除背面就能夠了。blog

如何剔除?事件

void glCullFace(GLenum mode); 經過這個函數

看一下它的參數:

GL_FRONT: 剔除正面多邊形

GL_BACK:剔除背面多邊形

GL_FRONT_AND_BACK:剔除全部多邊形

那麼這裏,就使用GL_BACK這個參數。

而後要使用剔除功能的時候,啓用一下glEnable(GL_CULL_FACE);便可。

接下來我來講一下實現的原理:

在繪製的時候是一個正面(紅色)一個背面(藍色)。

在啓用glEnable(GL_CULL_FACE);剔除的功能後,咱們告訴OpenGL說:「我看不見的你給我剔除了把!」。

一開始,咱們看到的是紅色三角形,由於它是正面。OpenGL認爲,看得見的是正面,看不見的是背面。

其實,咱們能夠這麼想,對於這兩個三角形,一個紅色三角形,一個藍色三角形,由於被剔除了背面,因此,它們始終只有一個面,即正面。

當這兩個三角形,不斷旋轉,旋轉到紅色三角形即將沒有了的時候,這個時候,是否是本來是正面的紅色三角形要變成了背面(由於看不見了嘛~)?結果就要被剔除了,而後此時,本來是背面的藍色三角形,變成了正面,由於咱們能夠看到正面,因此接下來看到的就是藍色三角形了。

下面,我貼一下這種方法的源碼:

 

#include <GL/glut.h>

GLfloat yrot; //饒y軸旋轉

void display()
{
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 清除屏幕和深度緩存
	glLoadIdentity(); // 重置當前的模型觀察矩陣
	glTranslatef(0.0f, 0.0f, -5.0f); // 移入屏幕5個單位
	glColor3f(1.0f, 0.0f, 0.0f); // 顏色設置爲紅色
	glRotatef(yrot, 0.0f, 1.0f, 0.0f);
	glBegin(GL_TRIANGLES); // 開始繪製三角形
		glVertex3f(0.0f, 1.0f, 0.0f); // 上頂點
		glVertex3f(-1.0f, -1.0f, 0.0f); // 左下頂點
		glVertex3f(1.0f, -1.0f, 0.0f); // 右下頂點
	glEnd(); // 結束繪製
	glColor3f(0.0f, 1.0f, 1.0f); // 顏色設置爲藍色
	glBegin(GL_TRIANGLES); // 反方向繪製											
		glVertex3f(1.0f, -1.0f, 0.0f);								
		glVertex3f(-1.0f, -1.0f, 0.0f);									
		glVertex3f(0.0f, 1.0f, 0.0f);									
	glEnd();											
	yrot += 0.2f;
	glutPostRedisplay(); // 重繪
	glFlush(); // 強制刷新緩衝
	
}

void initGL()
{		
	glViewport(0, 0, 300, 300); // 重置當前的視口
	glMatrixMode(GL_PROJECTION); // 選擇投影矩陣
	glLoadIdentity(); // 重置投影矩陣
	gluPerspective(45.0f, (GLfloat)300 / (GLfloat)300, 0.1f, 100.0f); // 設置視口的大小
	glMatrixMode(GL_MODELVIEW); // 選擇模型觀察矩陣
	glLoadIdentity(); // 重置模型觀察矩陣

	glShadeModel(GL_SMOOTH); // 平滑投影
	glClearColor(0.0f, 0.0f, 0.0f, 0.0f); // 黑色背景
	glClearDepth(1.0f); // 設置深度緩存
	glEnable(GL_DEPTH_TEST); // 啓用深度測試
	glDepthFunc(GL_LEQUAL);	// 深度測試類型
	glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // 透視修正

	glCullFace(GL_BACK); // 剔除背面
	glEnable(GL_CULL_FACE); // 啓用剔除功能
}

int main(int argc, char *argv[])
{
	glutInit(&argc, argv); // 初始化GLUT
	glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); // 設置顯示模式(這裏是單緩存和RGB顏色模式的窗口)
	glutInitWindowSize(300, 300); // 設置窗口大小
	glutInitWindowPosition(300, 300); // 設置窗口初始位置
	glutCreateWindow("雙面繪製三角形"); // 建立一個窗口
	initGL(); // OpenGL的設置
	glutDisplayFunc(display); // 註冊一個繪圖函數
	glutMainLoop(); // 進入GLUT事件處理循環
	return 0;
}

OpenGL源碼:http://www.eyesourcecode.com/forum-OpenGL-1.html

OpenGL三角形的雙面不一樣顏色的繪製

相關文章
相關標籤/搜索