OpenGL第二節:繪制多個顏色四邊形
MyOpengGL.h://和前一節一樣。
MyUtil.h://添加
const int COLOR_MODE_CYAN = 0;//定義兩個顏色選擇
const int COLOR_MODE_MULTI = 1;
void handleKeys( unsigned char key, int x, int y );//按鍵處理函數。根據按鍵去切換顏色
MyUtil.cpp://添加
int gColorMode = COLOR_MODE_CYAN;
GLfloat gProjectionScale = 1.f;//投影縮放比例
bool initGL()//添加glOrtho
{
glMatrixMode(GL_PROJECTION);//設置為投影矩陣
glLoadIdentity();//加載單位矩陣,和前一句一起,意思是設置投影矩陣為單位矩陣。
//glOrtho將當前矩陣(也就是投影矩陣)和二維正交矩陣相乘,用於控制縮放大小的。如果是三維調用gluPerspective() 或者 glFrustum()方法
glOrtho( 0.0, SCREEN_WIDTH * gProjectionScale, SCREEN_HEIGHT * gProjectionScale, 0.0, 1.0, -1.0 );//參數分別對應左,右,下,上,近,遠
......
//這裏說明一下投影矩陣,模型矩陣分別幹什麽的:
//投影矩陣是用於控制幾何視圖的,簡單來說,也就是外觀、大小、形狀。比如調用glOrtho()方法進行縮放
//模型矩陣是用於控制幾何位置的,比如移動、旋轉、翻轉、傾斜等等。比如調用glTranslatef()方法移動位置
//那麽OpenGL是怎麽使用矩陣將多邊形轉為像素,然後進行渲染的呢?
//首先,模型矩陣負責進行各種移動、旋轉、翻轉、傾斜等操作,然後投影矩陣負責讀取各個頂點、運算,將頂點轉換為OpenGL使用的對應的視圖坐標,然後連接,然後填充顏色也就是光柵化。
//總的來說就是使用ProjectionMatrix * ModelviewMatrix * Vertex 這三樣東西完成將對應的頂點取出並光柵化為像素的。
}
void update()//不變
{
}
void render()
{
glClear(GL_COLOR_BUFFER_BIT);//清屏幕
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();//這兩句重置模型矩陣為單位矩陣
glTranslatef(SCREEN_WIDTH / 2.f, SCREEN_HEIGHT / 2.f, 0.f);//然後移動到屏幕中心位置
if (gColorMode == COLOR_MODE_CYAN)
{
glBegin(GL_QUADS);//使用同一種顏色
glColor3f(0.f, 1.f, 1.f);
glVertex2f(-50.f, -50.f);
glVertex2f(50.f, -50.f);
glVertex2f(50.f, 50.f);
glVertex2f(-50.f, 50.f);
glEnd();
}
else
{
glBegin(GL_QUADS);
glColor3f(1.f, 0.f, 0.f); glVertex2f(-50.f, -50.f);//每一點使用一種顏色
glColor3f(1.f, 1.f, 0.f); glVertex2f(50.f, -50.f);
glColor3f(0.f, 1.f, 0.f); glVertex2f(50.f, 50.f);
glColor3f(0.f, 0.f, 1.f); glVertex2f(-50.f, 50.f);
glEnd();
}
glutSwapBuffers();//更新屏幕
}
void handleKeys(unsigned char key, int x, int y)
{
if (key == ‘q‘)//按下鍵盤q鍵切換顏色
{
if (gColorMode == COLOR_MODE_CYAN)
{
gColorMode = COLOR_MODE_MULTI;
}
else
{
gColorMode = COLOR_MODE_CYAN;
}
}
else if (key == ‘e‘)//按下e鍵進行縮放,改變大小
{
if (gProjectionScale == 1.f)
{
gProjectionScale = 2.f;
}
else if (gProjectionScale == 2.f)
{
gProjectionScale = 0.5f;
}
else if (gProjectionScale == 0.5f)
{
gProjectionScale = 1.f;
}
glMatrixMode(GL_PROJECTION);
glLoadIdentity();//和上一句一起,重置投影矩陣為單位矩陣
glOrtho(0.0, SCREEN_WIDTH * gProjectionScale, SCREEN_HEIGHT * gProjectionScale, 0.0, 1.0, -1.0);//然後進行縮放操作
}
}
main.cpp:
void runMainLoop(int val){//不變
}
int main( int argc, char* args[] )
{
...
glutKeyboardFunc( handleKeys );//添加鍵盤處理回調方法
glutDisplayFunc( render );
...
}
OpenGL第二節:繪制多個顏色四邊形