[原]OpenGL基礎教程(二)多邊形繪制


上篇介紹了最基本的三角形繪制,本篇介紹如何使用索引的方式繪制多邊行。

為什么要使用索引方式,總體來說提高性能。如何提高:使用頂點數組的好處是避免大量的函數調用。即避免每畫一個頂點就調用1次glVertex*()。
另一個好處是避免多邊形相鄰頂點的冗余指定。例如正方體,分別描述6個正方形,會造成每個頂點被重復描述3次。

如果以上沒有說服力,看看這個, gl.Begin(),gl.End()對是一種低效的方式,因此opengl es干脆不再支持他們了,同時高版本的opengl都在棄用gl.Begin(),gl.End()

先了解一些基本的API:

(1)glEnableClientState(枚舉值),參數支持頂點,顏色等等。作用激活選擇的數組,例如:glEnableClientState(GL_VERTEX_ARRAY)表示激活頂點數組

(2)glVertexPointer(size,type,stride,*pointer) size:每個頂點坐標的數量,type 每個坐標的數據類型,stride:連接頂點的之間的偏移值,pointer:頂點數據的指針;作用 :指定頂點數據的數組

與之同類的包括 頂點 法線 紋理等等。

(3)glDrawElements(model,count,type,indices) model:那種類型的圖元(點 線 三角形等),count:數組的元素個數,type:數組中元素的數據類型,indices:存放索引的數組;作用:解引用數組元素的一個列表 我也沒大明白啥意思,用熟了大概就理解了。

(4)glutReshapeFunc(func)  窗口大小發生改變時 會回調func

直接上代碼:

#include "stdafx.h"
#include<gl/glut.h>  
float vertices[] = {-50.0,-50.0,
    50.0,-50.0,
    -50.0,50.0,
    50.0,50.0};
GLuint indexs[] = {0,1,2};
void init()
{
    glEnableClientState(GL_VERTEX_ARRAY);//激活頂點數組
    glVertexPointer(2,GL_FLOAT,0,vertices); 
}
void renderScene(void)  
{  
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);  
    glDrawElements(GL_TRIANGLES,sizeof(indexs),GL_UNSIGNED_INT,indexs);//以三角形方式繪制 sizeof(indexs)取得數組元素的個數
    glutSwapBuffers();  
}  

void Reshape(GLsizei w,GLsizei h)
{
    if(h<0)
    {
        h=1;
    }
    glViewport(0,0,w,h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-100,100,-100,100,-100,100);
}

int _tmain(int argc, _TCHAR* argv[])  
{  
    glutInit(&argc, (char**) argv);  
    glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);  
    glutInitWindowPosition(100,100);  
    glutInitWindowSize(320,320);  
    glutCreateWindow("Hello OpenGL");  
    glutDisplayFunc(renderScene); 
    glutReshapeFunc(Reshape);
    init();
    glutMainLoop();//enters the GLUT event processing loop.  
    return 0;  
}  

效果如下:

(5)白色太難看了吧 來給上點色(下面不會再貼全部代碼,貼核心代碼)

float colors[] = {1.0,0.0,0.0,
    1.0,0.0,0.0,
    1.0,0.0,0.0,
    1.0,0.0,0.0};//定義顏色數組

初始化函數里面激活顏色數組 並綁定顏色數組

glEnableClientState(GL_COLOR_ARRAY);
glColorPointer(3,GL_FLOAT,0,colors);

這不效果出來了:

(6)繪制四邊形,非常easy,只需要改一下數組的索引 GLuint indexs[] = {0,1,2,2,3,1};

 

下一篇介紹多邊形貼紋理

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM