看opengl寫程式碼(6)glArrayElement,,glDrawElements和glDrawArrays

看opengl寫程式碼(6)glArrayElement,,glDrawElements和glDrawArrays

glArrayElement,,glDrawElements和glDrawArrays: 這三個 都是 使用 頂點 陣列 繪製的 OpenGl函式。

glArrayElement 每次 只能 使用 一組 頂點資料,並且 必須 在 GLbegin 和 glend 之間 繪製。

glDrawElements 每次 可以 繪製 多組 頂點資料,順序 可以 任意 存放,無  glBegin 和 glend 的限制。

glDrawArrays 每次 可以繪製 多組頂點資料,必須 從 起點 到 終點 按順序 繪製,無 glBegin 和 glend 限制。

其實 還有 幾個 使用 頂點陣列 繪製的 函式 ,在我使用的 這個版本(opengl 3.3) 被刪除了。

檢視版本等資訊:

   const GLubyte* name = glGetString(GL_VENDOR); //返回負責當前OpenGL實現廠商的名字
   const GLubyte* biaoshifu = glGetString(GL_RENDERER); //返回一個渲染器識別符號,通常是個硬體平臺
   const GLubyte* OpenGLVersion =glGetString(GL_VERSION); //返回當前OpenGL實現的版本號
   const GLubyte* gluVersion= gluGetString(GLU_VERSION); //返回當前GLU工具庫版本

介紹完了,直接上程式碼:

// vertexPointer.cpp : 定義控制檯應用程式的入口點。
//使用頂點陣列 進行 渲染
//
#include "stdafx.h"
#include <gl/glut.h>
void init(){
glClearColor(0,0,0,0);
//開啟頂點,顏色陣列
glEnableClientState(GL_VERTEX_ARRAY);
glEnable(GL_COLOR_ARRAY);
}
//用 glArrayElement方式繪製
void useGlArrayElement(){
static GLfloat vertexs[] = {
-1,-1,0,
-0.5,-0.5,0,
-1,-0.5,0};
static GLfloat colors[] = {
1,0,0,
0,1,0,
0,0,1
};
//繫結頂點陣列
glVertexPointer(3,GL_FLOAT,0,vertexs);
glColorPointer(3,GL_FLOAT,0,colors);
//解引用 和 繪製
glBegin(GL_TRIANGLES);
glArrayElement(1);
glArrayElement(0);
glArrayElement(2);
glEnd();
}
void useGlDrawElements(){
static GLfloat vertexs[] = {
-0.4,-1,0,
-0.2,-1,0,
-0.2,-0.5,0};
static GLfloat colors[] = {
1,0,0,
0,1,0,
0,0,1
};
//繫結頂點陣列
glVertexPointer(3,GL_FLOAT,0,vertexs);
glColorPointer(3,GL_FLOAT,0,colors);
//解引用 和 繪製
GLubyte array[] = {0,1,2};
//type 必須是 無符號整形: GL_BYTE -- > gl
glDrawElements(GL_TRIANGLES,3,GL_UNSIGNED_BYTE,array);
}
//glDraw
void useGlDrawArrays(){
static GLfloat vertexs[] = {
0,0,0,
0,0.5,0,
0.3,0.4,0};
static GLfloat colors[] = {
1,0,0,
0,1,0,
0,0,1
};
//繫結頂點陣列
glVertexPointer(3,GL_FLOAT,0,vertexs);
glColorPointer(3,GL_FLOAT,0,colors);
//gldraw
glDrawArrays(GL_TRIANGLES,0,3);
}
void display(){
glClear(GL_COLOR_BUFFER_BIT);
//gl
useGlArrayElement();
useGlDrawElements();
useGlDrawArrays();
glFlush();
}
//列印opengl資訊
void printGlInfo(){
const GLubyte* name = glGetString(GL_VENDOR); //返回負責當前OpenGL實現廠商的名字
const GLubyte* biaoshifu = glGetString(GL_RENDERER); //返回一個渲染器識別符號,通常是個硬體平臺
const GLubyte* OpenGLVersion =glGetString(GL_VERSION); //返回當前OpenGL實現的版本號
const GLubyte* gluVersion= gluGetString(GLU_VERSION); //返回當前GLU工具庫版本
printf("OpenGL實現廠商的名字:%s\n", name);
printf("渲染器識別符號:%s\n", biaoshifu);
printf("OpenGL實現的版本號:%s\n",OpenGLVersion );
printf("OGLU工具庫版本:%s\n", gluVersion);
}
int _tmain(int argc, _TCHAR* argv[])
{
glutInit(&argc,(char **)argv);
glutInitWindowSize(500,500);
glutInitWindowPosition(100,100);
glutCreateWindow("vertexArray");
printGlInfo();
init();
glutDisplayFunc(display);
glutMainLoop();
return 0;
}

執行截圖: