程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> Delphi下OpenGL2d繪圖(03)-畫線

Delphi下OpenGL2d繪圖(03)-畫線

編輯:Delphi

一、前言

畫線與畫點基本上代碼是相同。區別在於glBegin()的參數。繪制的框架代碼可以使用 Delphi下OpenGL2d繪圖(01)-初始化 中的代碼。修改的部份為 Draw 函數的內容。

二、畫線

GL_LINES:把每一個頂點作為一個獨立的線段,頂點2n-1和2n之間共定義了n條線段,總共繪制N/2條線段

GL_LINE_STRIP:繪制從第一個頂點到最後一個頂點依次相連的一組線段,第n和n+1個頂點定義了線段n,總共繪制n-1條線段

GL_LINE_LOOP:繪制從第一個頂點到最後一個頂點依次相連的一組線段,然後最後一個頂點和第一個頂點相連,第n和n+1個頂點定義了線段n,總共繪制n條線段

畫線可能用到以下函數:

glLineWidth() 設置線條寬度

glShadeModel() 設置顏色過渡模式

glColor3f() 設置線條顏色 

procedure TForm1.Draw;
begin
  // 清空緩沖區
  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);

  // ----------- GL_LINES -----------

  // 設置線寬
  glLineWidth(5);
  // 兩點間漸變色
  glShadeModel(GL_SMOOTH);
  glBegin(GL_LINES);  // 畫線
  // 設置起點線的顏色
  glColor3f(255, 0, 0);
  // 繪制起點
  glVertex2f(50, 50);
  // 設置末點線的顏色
  glColor3f(0, 0, 255);
  // 繪畫末點
  glVertex2f(200, 200);
  glEnd;
  // 兩點間同顏色
  glShadeModel(GL_FLAT);
  glBegin(GL_LINES);
  glColor3f(0, 255, 0);
  glVertex2f(200, 50);
  glColor3f(255, 255, 0);
  glVertex2f(50, 200);
  glEnd;

  // ----------- GL_LINE_LOOP -----------
  // 三個點閉環形成一個三角形  glShadeModel(GL_SMOOTH); 不起作用
  glLineWidth(1);
  glBegin(GL_LINE_LOOP);
  glColor3f(0, 0, 255);
  glVertex2f(250, 50);
  glVertex2f(250, 200);
  glVertex2f(280, 150);
  glEnd;

  // ----------- GL_LINE_STRIP -----------
  // 多點折線    glShadeModel(GL_SMOOTH); 不起作用
  glLineWidth(1);
  glBegin(GL_LINE_STRIP);
  glColor3f(255, 0, 255);
  glVertex2f(350, 50);
  glVertex2f(400, 200);
  glVertex2f(480, 150);
  glVertex2f(490, 60);
  glEnd;

  SwapBuffers(FDC); //交換雙緩沖區內容,這將把剛繪制的圖形翻印到屏幕上。
end;

效果如下:

可以看到第一個X線條顏色漸變的,OpenGL默認情況下是這種樣式。opengl中提供了一個函數glShadeModel來決定如果處理這種不同顏色的情況。

glShadeModel(GL_SMOOTH);    // 平滑方式,這也是opengl的默認處理方式,實現顏色漸變的效果
glShadeModel(GL_FLAT);      // 單色方式,線段的顏色以某一個頂點的顏色為准,由具體實現決定。為了避免不確定性,應盡量在多邊形中使用同一種顏色

測試後發現,在GL_LINE_LOOP與GL_LINE_STRIP樣式下,漸變效果無效!!!是我程序的問題?原因不明。

另外,OpenGL提供了抗鋸齒的功能,函數為

glEnable(GL_LINE_SMOOTH); //啟用
glHint(GL_LINE_SMOOTH,GL_NICEST);
glDisable(GL_LINE_SMOOTH); //關閉

使用後發現抗鋸齒效果不明顯。又是我的問題?以後再研究。

 

2014-06-26 by lin

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved