模擬器用opengl還是directx:opengl配置環境

最近在課程上在學習計算機圖像,對於突然冒出來的好多glut庫里的函數感覺很難招架。把示例代碼一行行百度下來,總算是差不多理解了大概的意思,在這裡分享一下繪製圖像需要的基礎的函數。

1. 配置環境
對於openGL的環境配置可以看我之前寫的環境配置的文章,點擊文章底部左下角“閱讀原文”就可以訪問原文章。

2. main函數設置

基本設置
在繪製圖像前還需要對程序進行初始化
在main函數里需要添加初始化語句

//這個函數用來初始化 GLUT 庫
glutInit(&argc, argv);
//設置顏色模式和緩衝區格式
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);

顏色模式:
參數有,GLUT_RGBA模式;GLUT_RGB模式 ;GLUT_INDEX模式
緩衝區類型 :GLUT_SINGLE——單緩衝窗口;GLUT_DOUBLE——雙緩衝窗口

GLUT_SINGLE 實際上就是將所有的繪圖指令在窗口上執行,一般只用於顯示單獨的一副非動態的圖
GLUT_DOUBLE 實際上繪圖指令是在一個緩衝區完成,在繪圖指令完成之後,再通過交換指令把完成的圖形立即顯示在屏幕上,一般用於生成動畫效果

窗體設置
對繪製的窗體的設置,同樣可以寫入main函數中

    //設置初始窗口的位置
glutInitWindowPosition(100, 100);
    //設置初始窗口的大小
glutInitWindowSize(400, 400);
    //根據前面設置建立窗口,參數設置為變體
glutCreateWindow("實驗");
    //顏色函數設置
Init();
    //繪圖時被調用的函數
glutDisplayFunc(myDisplay);
    //改變窗體大小時進行圖像重繪
glutReshapeFunc(Reshape);
    //進行消息循環,用於顯示窗體,窗體關閉後自動退出循環
glutMainLoop();

glutInitWindowPosition(int x, int y)窗口左上角相對於計算機坐標(x,y)
glutDisplayFunc(myDisplay)其中的 myDisplay 參數為自己設置的成像函數
glutReshapeFunc(Reshape)其中的 Reshape 參數為自己設置的重新成像函數

Reshape函數設置

void Reshape(int w, int h) {
  //glViewport負責把視景體截取的圖像按照怎樣的高和寬顯示到屏幕上
  gViewport(0, 0, (GLsizei)w, (GLsizei)h);
         
  //將當前矩陣指定為投影矩陣
  glMatrixMode(GL_PROJECTION);
         
  //把矩陣設為單位矩陣
  lLoadIdentity();
         
  //讓中心坐標(0,0)變成窗口的左下角
  gluOrtho2D(0.0, (GLdouble)w, 0.0, (GLdouble)h);
}

顏色函數設置

void Init(){ 
  //設置顏色 
  glClearColor(0.0, 0.0, 0.0, 0.0); 
  //顏色過渡形式
  glShadeModel(GL_FLAT); 
}

glShadeModel 函數用於控制opengl中繪製指定兩點間其他點顏色的過渡模式
參數一般為 GL_SMOOTH(默認)自然過渡;GL_FLAT 不過渡,顏色有層次

函數用於控制opengl中繪製指定兩點間其他點顏色的過渡模式 參數一般為 GL_SMOOTH(默認)自然過渡 GL_FLAT 不過渡,顏色有層次

3.繪圖函數 myDisplay 函數設置

void myDraw(int a, int b) {
  /*other code*/
  //指定柵格化點的直徑
  glPointSize(1);
  //繪圖準備
  glBegin(GL_POINTS);
  glVertex2i(/*other code*/);
  lEnd();
  }
}
void myDisplay(void) {
  myDraw(a,b)
  glFlush();//強制刷新緩衝,保證繪圖命令將被執行
}

/* other code */ 為繪圖必要的條件設置
glPointSize(1) 表示圖像直徑為一個像素點,其中的參數可以決定整體圖像的粗細程度
glBegin() 是和 glEnd() 結合起來使用

函數原型 void glBegin(GLenum mode)
mode:創建元素的類型,比如:點,線等。可以是以下數值:

函數說明
GL_POINTS把每個頂點作為一個點進行處理
GL_LINES把每個頂點作為一個獨立的線段
GL_LINE_STRIP繪製從第一個頂點到最後一個頂點依次相連的一組線段
GL_LINE_LOOP繪製從第一個頂點到最後一個頂點首尾相連的一組線段
GL_TRIANGLES把每個頂點作為一個獨立的三角形
GL_TRIANGLE_STPIP繪製一組相連的三角形
GL_QUADS繪製由四個頂點組成的一組單獨的四邊形
GL_QUAD_STRIP繪製一組相連的四邊形

在 glBegin() 和 glEnd() 之間需要調用函數繪圖,glVertex() 設置頂點坐標
glVertex2i 輸入整型的點
glVertex2f 輸入單精度的點
glVertex2d 輸入雙精度的點
除此之外還有其他可以在 glBegin() 和 glEnd() 之間調用的函數

函數說明
glVertex()設置頂點坐標
glColor()設置當前顏色
glIndex()設置當前顏色表
glNormal()設置法向坐標
glCoord()產生坐標
glCallList(),glCallLists()執行顯示列表
glTexCoord()設置紋理坐標
glEdgeFlag()控制邊界繪製
glMaterial()設置材質

4.示例代碼:直線的繪製

#include <GL/glut.h>
#include <math.h>
void myDraw(int x0, int y0, int x1, int y1) {
  int m = 0;
  if (abs(x1 - x0) >= abs(y1 - y0))
    m = abs(x1 - x0);
  else
    m = abs(y1 - y0);
  float dx = (float)(x1 - x0) / m;
  float dy = (float)(y1 - y0) / m;
  float x = x0;
  float y = y0;
  glPointSize(1);
  for (int i = 0;i < m;i++) {
    glBegin(GL_POINTS);
    glVertex2i((int)(x + 0.5), (int)(y + 0.5));
    glEnd();
    x += dx;
    y += dy;
  }
}
 void myDisplay(void) {
  myDraw(0, 0, 200, 300);
  glFlush();
}
void Init() {
  glClearColor(0.0, 0.0, 0.0, 0.0);
  glShadeModel(GL_FLAT);
}
void Reshape(int w, int h) {
  glViewport(0, 0, (GLsizei)w, (GLsizei)h);
  lMatrixMode(GL_PROJECTION);
  glLoadIdentity();
  gluOrtho2D(0.0, (GLdouble)w, 0.0, (GLdouble)h);
}
int main(int argc, char *argv[]) {
  glutInit(&argc, argv);
  glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
  glutInitWindowPosition(100, 100);
  glutInitWindowSize(400, 400);
  glutCreateWindow("實驗1 直線繪製");
  Init();
  glutDisplayFunc(myDisplay);
  glutReshapeFunc(Reshape);
  lutMainLoop();
  return 0;
}

原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/225309.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
投稿專員的頭像投稿專員
上一篇 2024-12-09 14:43
下一篇 2024-12-09 14:43

相關推薦

發表回復

登錄後才能評論