對於一個三角形,我要給它正反面不一樣的顏色。而後經過旋轉,看出它的效果。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