標籤:style class blog code http color
一、前言
畫線與畫點基本上代碼是相同。區別在於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