1. 程式人生 > >OpenGL第二節:繪制多個顏色四邊形

OpenGL第二節:繪制多個顏色四邊形

unsigned main.c 頂點 date() splay 二維 ltr width orm

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第二節:繪制多個顏色四邊形