「OpenGL 1 」關於基本圖形繪製

一、一個簡單的OpenGL程序如下:(注意,如果需要編譯並運行,需要正確安裝GLUT,安裝方法如上所述)

<pre name="code" class="cpp">#include<GL/glut.h>
     //GLUT的頭文件,OpenGL程序一般還要包含和,但GLUT的頭文件中已經自動將這兩個文件包含了c
void myDisplay(void)
{
     glClear(GL_COLOR_BUFFER_BIT);
     glRectf(-0.5f, -0.5f, 0.5f, 0.5f); //畫一個矩形,四個參數分別表示了位於對角線上的兩個點的橫、縱座標。
     glFlush(); //保證前面的OpenGL命令立即執行(而不是讓它們在緩衝區中等待)。其作用跟fflush(stdout)類似。
}
int main(int argc, char *argv[])
{
     glutInit(&argc, argv); //對GLUT進行初始化,一般照抄這句glutInit(&argc, argv)就可以了。
     glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE); //設置顯示方式,其中GLUT_RGB表示使用RGB顏色,與之對應的還有GLUT_INDEX(表示使用索引顏色)。GLUT_SINGLE表示使用單緩衝,與之對應的還有GLUT_DOUBLE(使用雙緩衝)。
     glutInitWindowPosition(100, 100);
     glutInitWindowSize(400, 400);
     glutCreateWindow("第一個OpenGL程序"); //注意:窗口被創建後,並不立即顯示到屏幕上。需要調用glutMainLoop才能看到窗口。
     glutDisplayFunc(&myDisplay); //設置一個函數,當需要進行畫圖時,這個函數就會被調用。
     glutMainLoop(); //進行一個消息循環
     return 0;
}




二、繪製直線

程序代碼:

void myDisplay(void)
{
     glClear(GL_COLOR_BUFFER_BIT);
     glBegin( GL_LINES );  //在這裏填上你所希望的模式
    glVertex2f(0.0f, 0.0f);
     glVertex2f(0.5f, 0.0f);
  //在這裏使用glVertex*系列函數  指定你所希望的頂點位置
        
     glEnd();
     glFlush();
}

把這段代碼改成你喜歡的樣子,然後用它替換第一課中的myDisplay函數,編譯後即可運行。

結果如圖:



三、繪製正多邊形和圓

正五邊形:

#include <math.h>
const int n = 5;
const GLfloat R = 0.5f;
const GLfloat Pi = 3.1415926536f;
void myDisplay(void)
{
     int i;
     glClear(GL_COLOR_BUFFER_BIT);
     glBegin(GL_POLYGON);
     for(i=1;i<=n; i++)
         glVertex2f(R*cos(2*Pi/n*i), R*sin(2*Pi/n*i));
     glEnd();
     glFlush();
}


(以正多邊形中心爲原點,將一個點先固定在y軸上。角度總爲360,2Pi,除以n得到每條邊對應角的角度,再乘以i得到n個頂點的位置)
以n=5爲例。

結果:



n越大越接近圓,以n=50爲例子:

四、繪製正五角星
#include <math.h>
const GLfloat Pi = 3.1415926536f;
void myDisplay(void)
{
     GLfloat a = 1 / (2-2*cos(72*Pi/180));
     GLfloat bx = a * cos(18 * Pi/180);
     GLfloat by = a * sin(18 * Pi/180);
     GLfloat cy = -a * cos(18 * Pi/180);
     GLfloat
         PointA[2] = { 0, a },
         PointB[2] = { bx, by },
         PointC[2] = { 0.5, cy },
         PointD[2] = { -0.5, cy },
         PointE[2] = { -bx, by };

     glClear(GL_COLOR_BUFFER_BIT);
     // 按照A->C->E->B->D->A的順序,可以一筆將五角星畫出
     glBegin(GL_LINE_LOOP);
         glVertex2fv(PointA);
         glVertex2fv(PointC);
         glVertex2fv(PointE);
         glVertex2fv(PointB);
         glVertex2fv(PointD);
     glEnd();
     glFlush();
}


(長度a的算法,個人更偏向於1 / (2*sin(36*Pi/180)),搞不懂爲何與1 / (2-2*cos(72*Pi/180))等價???

將五角星結果如圖:


五、繪製正弦函數圖形

 #include <math.h>
const GLfloat factor = 0.1f;
void myDisplay(void)
{
      GLfloat x;
      glClear(GL_COLOR_BUFFER_BIT);
      glBegin(GL_LINES);
          glVertex2f(-1.0f, 0.0f);
          glVertex2f(1.0f, 0.0f);         // 以上兩個點可以畫x軸
           glVertex2f(0.0f, -1.0f);
          glVertex2f(0.0f, 1.0f);         // 以上兩個點可以畫y軸
      glEnd();
      glBegin(GL_LINE_STRIP);
      for(x=-1.0f/factor; x<1.0f/factor; x+=0.01f)
      {
          glVertex2f(x*factor, sin(x)*factor);
      }
         glEnd();
      glFlush();
}


(默認座標-1到1是怎麼回事???)


結果如圖:


發佈了7 篇原創文章 · 獲贊 39 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章