本文主要還是解決圖元繪制中的渲染問題-著色器,著色器的使用包含兩個(gè)部分:(1)OpenGL的API調(diào)用,(2)GLSL語言及其語法;本文主要解釋OpenGL的API使用(通過grew擴(kuò)展使用);GLSL那是另外一個(gè)話題。
??1. OpenGL著色器使用過程與例子;
??2. OpenGL著色器相關(guān)函數(shù)的解釋;
主要過程為:
??1.編寫Shader:
????1)頂點(diǎn)Shader(vetexShader);
????2)片Shader(ragmentShader);
??2.創(chuàng)建頂點(diǎn)著色器對(duì)象
????1)創(chuàng)建vertexShader對(duì)象;glCreateShader
????2)加載vertexShader腳本到vertexShader對(duì)象;glShaderSource
????3)編譯vertexShader腳本;glCompileShader
??3.創(chuàng)建片著色器
????1)創(chuàng)建fragmentShader對(duì)象;glCreateShader
????2)加載fragmentShader腳本到fragmentShader對(duì)象;glShaderSource
????3)編譯fragmentShader腳本;glCompileShader
??4.創(chuàng)建著色器程序
????1)創(chuàng)建程序?qū)ο?;glCreateProgram
????2)添加vertexShader對(duì)象到著色器程序;glAttachShader
????3)添加fragmentShader對(duì)象到著色器程序;glAttachShader
????4)鏈接著色器程序,以備渲染管道調(diào)用;glLinkProgram
??5.在開啟頂點(diǎn)屬性之前需要?jiǎng)?chuàng)建一個(gè)頂點(diǎn)數(shù)組:(用于頂點(diǎn)屬性的處理)
加載OpenGL4.2的版本
- 提前的說明
在其他系統(tǒng)中,實(shí)際上繪制點(diǎn)、線段、三角形等,都可以輸出效果; 在Mac的OpenGL中,如果沒有使用著色器,則線段、三角形看不見輸出;
在默認(rèn)情況下,加載的OpenGL的庫版本是2.1,但這里講解的是OpenGL使用4.1
本文重點(diǎn)不是GLSL,旦會(huì)用到GLSL,可以直接放過。
獲取當(dāng)前系統(tǒng)的OpenGL的版本
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <GL/glew.h>
#include <GLFW/glfw3.h>
int main(int argc, char const *argv[]){
glfwInit();
GLFWwindow *window = glfwCreateWindow(800, 600, "頂點(diǎn):Vertex", NULL, NULL);
glfwMakeContextCurrent(window);
if (glewInit() != GLEW_OK){
printf("OpenGL初始化失敗:glew\n");
exit(-1);
}
// ********************************
const GLubyte* name = glGetString(GL_VENDOR); //返回負(fù)責(zé)當(dāng)前OpenGL實(shí)現(xiàn)廠商的名字
const GLubyte* video = glGetString(GL_RENDERER); //返回一個(gè)渲染器標(biāo)識(shí)符,通常是個(gè)硬件平臺(tái)
const GLubyte* OpenGLVersion = glGetString(GL_VERSION); //返回當(dāng)前OpenGL實(shí)現(xiàn)的版本號(hào)
printf("OpenGL實(shí)現(xiàn)廠商的名字:%s\n", name);
printf("顯示器顯卡:%s\n", video);
printf("OpenGL實(shí)現(xiàn)的版本號(hào):%s\n", OpenGLVersion);
// 釋放
glfwTerminate();
return 0;
}
// 編譯命令:g++ -omain gl00_opengl_version.cpp -lglfw -lglew -framework opengl
- 說明:
- 盡管上面不需要Window,但是需要?jiǎng)?chuàng)建上下文,在glfw模塊中創(chuàng)建上下文與創(chuàng)建窗體是一起的。
- 本文使用的系統(tǒng)的OpenGL環(huán)境如下:
OpenGL實(shí)現(xiàn)廠商的名字:Intel Inc.
顯示器顯卡:Intel(R) Iris(TM) Graphics 6100
OpenGL實(shí)現(xiàn)的版本號(hào):2.1 INTEL-12.9.22
系統(tǒng)安裝的OpenGL版本查看
- 如果想知道硬件支持與系統(tǒng)安裝的OpenGL版本,可以在硬件與系統(tǒng)提供商的官網(wǎng)查看。比如蘋果的OpenGL版本可以官網(wǎng)查看:
https://support.apple.com/zh-cn/HT202823- Mac系統(tǒng)的OpenGL版本信息
設(shè)置最高的OpenGL版本
- 在創(chuàng)建上下文之前設(shè)置,通過窗體創(chuàng)建前的提示設(shè)置即可
glfwWindowHint。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <GL/glew.h>
#include <GLFW/glfw3.h>
int main(int argc, char const *argv[]){
glfwInit();
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4); // 主版本
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 1); // 副版本(可選)
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); // 設(shè)置蘋果系統(tǒng)向后兼容
GLFWwindow *window = glfwCreateWindow(800, 600, "頂點(diǎn):Vertex", NULL, NULL);
glfwMakeContextCurrent(window);
if (glewInit() != GLEW_OK){
printf("OpenGL初始化失敗:glew\n");
exit(-1);
}
// ********************************
const GLubyte* name = glGetString(GL_VENDOR); //返回負(fù)責(zé)當(dāng)前OpenGL實(shí)現(xiàn)廠商的名字
const GLubyte* video = glGetString(GL_RENDERER); //返回一個(gè)渲染器標(biāo)識(shí)符,通常是個(gè)硬件平臺(tái)
const GLubyte* OpenGLVersion = glGetString(GL_VERSION); //返回當(dāng)前OpenGL實(shí)現(xiàn)的版本號(hào)
printf("OpenGL實(shí)現(xiàn)廠商的名字:%s\n", name);
printf("顯示器顯卡:%s\n", video);
printf("OpenGL實(shí)現(xiàn)的版本號(hào):%s\n", OpenGLVersion);
// 釋放
glfwTerminate();
return 0;
}
// 編譯命令:g++ -omain gl00_opengl_version.cpp -lglfw -lglew -framework opengl
- 設(shè)置后輸出位設(shè)置的版本:
OpenGL實(shí)現(xiàn)廠商的名字:Intel Inc.
顯示器顯卡:Intel(R) Iris(TM) Graphics 6100
OpenGL實(shí)現(xiàn)的版本號(hào):4.1 INTEL-12.9.22
繪制基本圖元
繪制圖元的基本模式
- 定義頂點(diǎn)數(shù)據(jù):類型float數(shù)組,
- 創(chuàng)建頂點(diǎn)緩沖區(qū)對(duì)象:
glGenBuffers函數(shù); - 指定頂點(diǎn)緩沖區(qū)數(shù)據(jù)類型:
glBindBuffer函數(shù); - 設(shè)置頂點(diǎn)緩沖區(qū)的數(shù)據(jù):
glBufferData函數(shù); - 啟用指定索引的頂點(diǎn)屬性:
glEnableVertexAttribArray函數(shù); - 定義通用頂點(diǎn)屬性數(shù)據(jù)數(shù)組:
glVertexAttribPointer函數(shù); - 繪制圖元:
glDrawArrays函數(shù)
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <GL/glew.h>
#include <GLFW/glfw3.h>
int main(int argc, char const *argv[]){
glfwInit();
GLFWwindow *window = glfwCreateWindow(800, 600, "三角形", NULL, NULL);
glfwMakeContextCurrent(window);
if (glewInit() != GLEW_OK){
exit(-1);
}
// 1. 定義頂點(diǎn)數(shù)據(jù);
float vertices[] = {
-0.5f, -0.5f, 0.0f, // 第一個(gè)點(diǎn)
0.5f, -0.5f, 0.0f, // 第二個(gè)點(diǎn)
0.0f, 0.5f, 0.0f // 第三個(gè)點(diǎn)
};
// 2. 生成緩沖區(qū)對(duì)象名;
GLuint vertex_buffer_object;
glGenBuffers(1, &vertex_buffer_object);
// 3. 綁定命名緩沖區(qū)對(duì)象;
glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer_object);
// 4. 創(chuàng)建并初始化緩沖區(qū)對(duì)象的數(shù)據(jù)存儲(chǔ);
glBufferData(
GL_ARRAY_BUFFER,
sizeof(vertices),
vertices,
GL_STATIC_DRAW);
// 5. 開啟頂點(diǎn)屬性;
glEnableVertexAttribArray(0);
// 6. 定義通用頂點(diǎn)屬性數(shù)據(jù)數(shù)組;
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
while (! glfwWindowShouldClose(window)){
glClear(GL_COLOR_BUFFER_BIT);
// 7. 繪制;
glDrawArrays(GL_TRIANGLES, 0, 3);
glfwSwapBuffers(window);
glfwPollEvents();
}
glDeleteBuffers(1, &vertex_buffer_object);
glfwTerminate();
return 0;
}
// 編譯命令:g++ -omain gl02_vertexes.cpp -lglfw -lglew -framework opengl
- 運(yùn)行是看不到三角形滴。
使用著色器
- 著色器使用了GLSL語言,這是一個(gè)類似C或者C++的語言,著色器主要用來處理兩個(gè)事情:
- 多輸入的頂點(diǎn)坐標(biāo)進(jìn)行變換處理(因?yàn)檩斎氲?D坐標(biāo),但實(shí)際屏幕是2D,這個(gè)需要轉(zhuǎn)換)
- 把坐標(biāo)最終轉(zhuǎn)換為像素(RGBA構(gòu)成的像素)
- 除了GLSL語言外,剩下的就是套路(俗稱編程模式)。
著色器編程模式
-
編寫Shader:
- 頂點(diǎn)Shader(vetexShader);
- 片Shader(ragmentShader);
-
創(chuàng)建頂點(diǎn)著色器對(duì)象
- 創(chuàng)建vertexShader對(duì)象;
glCreateShader - 加載vertexShader腳本到vertexShader對(duì)象;
glShaderSource - 編譯vertexShader腳本;
glCompileShader
- 創(chuàng)建vertexShader對(duì)象;
-
創(chuàng)建片著色器
- 創(chuàng)建fragmentShader對(duì)象;
glCreateShader - 加載fragmentShader腳本到fragmentShader對(duì)象;
glShaderSource - 編譯fragmentShader腳本;
glCompileShader
- 創(chuàng)建fragmentShader對(duì)象;
-
創(chuàng)建著色器程序
- 創(chuàng)建程序?qū)ο螅?code>glCreateProgram
- 添加vertexShader對(duì)象到著色器程序;
glAttachShader - 添加fragmentShader對(duì)象到著色器程序;
glAttachShader - 鏈接著色器程序,以備渲染管道調(diào)用;
glLinkProgram
-
在開啟頂點(diǎn)屬性之前需要?jiǎng)?chuàng)建一個(gè)頂點(diǎn)數(shù)組:(用于頂點(diǎn)屬性的處理)
- 創(chuàng)建一個(gè)頂點(diǎn)數(shù)組對(duì)象;
glGenVertexArrays - 綁定頂點(diǎn)數(shù)組對(duì)象;
glBindVertexArray - 注意:這個(gè)與頂點(diǎn)緩沖區(qū)不同,不需要綁定數(shù)據(jù),因?yàn)檫@個(gè)頂點(diǎn)數(shù)組內(nèi)部存放數(shù)據(jù);
- 創(chuàng)建一個(gè)頂點(diǎn)數(shù)組對(duì)象;
- 注意:
- 著色器程序的創(chuàng)建與頂點(diǎn)緩沖區(qū)的創(chuàng)建沒有先后關(guān)系,但是使用著色器程序的頂點(diǎn)在渲染過程需要頂點(diǎn)數(shù)組。
著色器與OpenGL對(duì)應(yīng)版本關(guān)系
/*
OpenGL Version GLSL Version
2.0 110
2.1 120
3.0 130
3.1 140
3.2 150
3.3 330
4.0 400
4.1 410
4.2 420
4.3 430
*/
著色器使用代碼
- 代碼
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <GL/glew.h>
#include <GLFW/glfw3.h>
/*
OpenGL Version GLSL Version
2.0 110
2.1 120
3.0 130
3.1 140
3.2 150
3.3 330
4.0 400
4.1 410
4.2 420
4.3 430
*/
// 蘋果的OpenGL版本可以官網(wǎng)查看:https://support.apple.com/zh-cn/HT202823
// Intel(R) Iris(TM) Graphics 6100:
// MacBook Pro(視網(wǎng)膜顯示屏,13 英寸,2015 年初) Intel Iris Graphics 6100 4.1(OpenGL版本)
// GLSL著色器語言
/*
#version 410 core
layout (location = 0) in vec3 aPos;
void main(){
gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);
}
*/
const char *vertexShaderSource = ""
"#version 410 core\n" // OpenGL版本,核心模式
"layout (location = 0) in vec3 aPos;\n" // 頂點(diǎn)屬性(輸入)
"void main(){\n"
" gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);\n"
"}\0"; // 空字符
const char *fragmentShaderSource = ""
"#version 410 core\n"
"out vec4 FragColor;\n" // 顏色屬性(輸出變量)
"void main(){\n"
" FragColor = vec4(1.0f, 0.0f, 0.0f, 1.0f);\n" // 固定顏色輸出
"}\n\0";
int main(int argc, char const *argv[]){
glfwInit();
// 下面代碼使用最新版本的OpenGL(一定需要glfw初始化后調(diào)用,下面版本不設(shè)置,會(huì)導(dǎo)致某些功能不支持,會(huì)導(dǎo)致段錯(cuò)誤)
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4); // 主版本
// glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 1); // 副版本(可選)
GLFWwindow *window = glfwCreateWindow(
800,
600,
"著色器",
NULL, //glfwGetPrimaryMonitor(),
NULL);
glfwMakeContextCurrent(window);
if (glewInit() != GLEW_OK){
printf("OpenGL初始化失敗:glew\n");
exit(-1);
}
/////////////////////////////
// ********************************
// 1. 頂點(diǎn)著色器對(duì)象
unsigned int vertexShader;
vertexShader = glCreateShader(GL_VERTEX_SHADER);
// 2. 編譯頂點(diǎn)著色器
glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);
glCompileShader(vertexShader);
// --------------------------------
// 1. 片著色器對(duì)象
unsigned int fragmentShader;
fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
// 2. 片著色器
glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL);
glCompileShader(fragmentShader);
// --------------------------------
// 1. 著色器程序?qū)ο? unsigned int shaderProgram;
shaderProgram = glCreateProgram();
// 2. 鏈接著色器程序
glAttachShader(shaderProgram, vertexShader);
glAttachShader(shaderProgram, fragmentShader);
glLinkProgram(shaderProgram);
// ---------------------------------
// 1. 激活著色器程序
// glUseProgram(shaderProgram);
// 2. 激活后,釋放前面分配的內(nèi)存
glDeleteShader(vertexShader);
glDeleteShader(fragmentShader);
// ********************************
const GLubyte* name = glGetString(GL_VENDOR); //返回負(fù)責(zé)當(dāng)前OpenGL實(shí)現(xiàn)廠商的名字
const GLubyte* video = glGetString(GL_RENDERER); //返回一個(gè)渲染器標(biāo)識(shí)符,通常是個(gè)硬件平臺(tái)
const GLubyte* OpenGLVersion = glGetString(GL_VERSION); //返回當(dāng)前OpenGL實(shí)現(xiàn)的版本號(hào)
printf("OpenGL實(shí)現(xiàn)廠商的名字:%s\n", name);
printf("顯示器顯卡:%s\n", video);
printf("OpenGL實(shí)現(xiàn)的版本號(hào):%s\n", OpenGLVersion);
///////////////////////////
// 1. 定義頂點(diǎn)數(shù)據(jù);
float vertices[] = {
-0.5f, -0.5f, 0.0f, // left
0.5f, -0.5f, 0.0f, // right
0.0f, 0.5f, 0.0f // top
};
// 2. 生成緩沖區(qū)對(duì)象名;
GLuint vertex_buffer_object; // 定義存儲(chǔ)緩沖區(qū)對(duì)象名的變量
glGenBuffers(
1, // 緩沖區(qū)個(gè)數(shù)
&vertex_buffer_object); // 返回的緩沖區(qū)對(duì)象名
// 3. 綁定命名緩沖區(qū)對(duì)象;
glBindBuffer(
GL_ARRAY_BUFFER, // 緩沖區(qū)類型是:頂點(diǎn)屬性(Vertex attributes)
vertex_buffer_object); // 緩沖區(qū)對(duì)象名
// 4. 創(chuàng)建并初始化緩沖區(qū)對(duì)象的數(shù)據(jù)存儲(chǔ);
glBufferData(
GL_ARRAY_BUFFER, // 指定緩沖區(qū)對(duì)象綁定的目標(biāo)
sizeof(vertices), // 指定緩沖區(qū)對(duì)象的新數(shù)據(jù)存儲(chǔ)區(qū)的大小
vertices, // 定指向?qū)?fù)制到數(shù)據(jù)存儲(chǔ)中進(jìn)行初始化的數(shù)據(jù)的指針,如果不復(fù)制任何數(shù)據(jù),則指定為空。
GL_STATIC_DRAW); // 數(shù)據(jù)存儲(chǔ)內(nèi)容將重復(fù)修改并多次使用,并用作GL繪圖和圖像操作的源。
/////////////////////////////////////////////
// ------------------------------------
unsigned int VAO;
glGenVertexArrays(1, &VAO);
glBindVertexArray(VAO);
// ------------------------------------
// 1. 開啟頂點(diǎn)屬性;
glEnableVertexAttribArray(
0); // 啟用的頂點(diǎn)屬性的索引。;
// 2. 定義通用頂點(diǎn)屬性數(shù)據(jù)數(shù)組;
glVertexAttribPointer(
0, // 指定通用頂點(diǎn)屬性的索引;
3, // 指定每個(gè)頂點(diǎn)屬性的維數(shù);
GL_FLOAT, // 指定數(shù)組中每個(gè)組件的數(shù)據(jù)類型;
GL_FALSE, // 指定訪問固定點(diǎn)數(shù)據(jù)值時(shí),是否規(guī)范化;
3 * sizeof(float), // 指定頂點(diǎn)屬性之間的步長;
0); // 指定當(dāng)前綁定到GL_ARRAY_BUFFER目標(biāo)的存儲(chǔ)區(qū)地址的偏移地址;
glBindBuffer(GL_ARRAY_BUFFER, 0);
// glBindVertexArray(0); // 解除頂點(diǎn)數(shù)組對(duì)象的綁定,便于后面綁定使用;
///////////////////////////////////////////
while (! glfwWindowShouldClose(window)){
// glClearColor(1.0f, 1.0f, 1.0f, 1.0f); // 可以設(shè)置清屏顏色;
glClear(GL_COLOR_BUFFER_BIT);
glUseProgram(shaderProgram);
// 3. 繪制;
glDrawArrays(
GL_TRIANGLES, // 渲染的基元類型(點(diǎn));
0, // 指定已啟用數(shù)組中的起始索引;
3); // 渲染的點(diǎn)的個(gè)數(shù);
///////////////////////////
glfwSwapBuffers(window);
glFlush();
// glfwPollEvents();
glfwWaitEvents();
}
// 釋放
// 4. 繪制完成,禁用頂點(diǎn)緩沖,這是為了性能;
glDisableVertexAttribArray(
0 // 指定禁用的頂點(diǎn)屬性的索引;
);
glDeleteVertexArrays(1, &VAO);
glDeleteBuffers(1, &vertex_buffer_object);
glfwTerminate();
return 0;
}
// 編譯命令:g++ -omain gl03_shader_step.cpp -lglfw -lglew -framework opengl
- 運(yùn)行結(jié)果
- 使用著色器渲染圖元
著色器編程使用的函數(shù)說明
glCreateShader函數(shù)
- 函數(shù)定義
- glCreateShader創(chuàng)建一個(gè)空的shader對(duì)象,并返回一個(gè)可以引用它的非零值。
- Shader對(duì)象用于維護(hù)定義Shader的源代碼字符串。
- shaderType指示要?jiǎng)?chuàng)建的Shader的類型。
- OpenGL支持五種類型的Shader。
GLuint glCreateShader( GLenum shaderType);
- 函數(shù)參數(shù):
- GLenum shaderType:指定Shader的類型,GL可以申明的類型包含:
- GL_COMPUTE_SHADER
- GL_VERTEX_SHADER
- GL_TESS_CONTROL_SHADER 與 GL_TESS_EVALUATION_SHADER
- GL_GEOMETRY_SHADER
- GL_FRAGMENT_SHADER.
- 注意:
- 這里創(chuàng)建兩種最基本的Shader。
- GLenum shaderType:指定Shader的類型,GL可以申明的類型包含:
glShaderSource函數(shù)
- 函數(shù)定義
void glShaderSource(
GLuint shader,
GLsizei count,
const GLchar **string,
const GLint *length);
-
函數(shù)參數(shù)
-
GLuint shader:Shader對(duì)象; -
GLsizei count:字符串個(gè)數(shù); -
const GLchar **string:字符串?dāng)?shù)組(不是數(shù)組字符串:雙指針); -
const GLint *length:字符串長度的數(shù)組;如果是空,則表示字符串使用空表示結(jié)束;
-
-
說明:
- 當(dāng)調(diào)用glShaderSource時(shí),OpenGL復(fù)制Shader源代碼字符串,因此應(yīng)用程序可以在函數(shù)返回后立即釋放其源代碼字符串的副本。
glCompileShader函數(shù)
- 函數(shù)定義
void glCompileShader( GLuint shader);
-
函數(shù)參數(shù)
- GLuint shader:已經(jīng)創(chuàng)建,并copy了Shader源代碼的Shader對(duì)象。
-
說明:
glCompileShader編譯存儲(chǔ)在Shader對(duì)象中的源代碼字符串。
編譯狀態(tài)將作為著色器對(duì)象狀態(tài)的一部分存儲(chǔ)。如果在沒有錯(cuò)誤的情況下編譯了明暗器并準(zhǔn)備好使用,則此值將設(shè)置為GL_TRUE,否則設(shè)置為GL_FALSE。
編譯狀態(tài)可以通過調(diào)用帶有shade參數(shù)r和GL_COMPILE_STATUS參數(shù)的glGetShader函數(shù)進(jìn)行查詢。
由于OpenGL著色語言規(guī)范指定的許多原因,著色程序的編譯可能會(huì)失敗。無論編譯是否成功,都可以通過調(diào)用glGetShaderInfo從著色器對(duì)象的信息日志中獲取有關(guān)編譯的信息(包含編譯錯(cuò)誤的位置)。
glCreateProgram函數(shù)
- 函數(shù)定義
GLuint glCreateProgram( void);
-
函數(shù)返回值
- GLuint:返回創(chuàng)建的程序?qū)ο蟆?/li>
-
說明:
- 創(chuàng)建的程序是空的,可以指定Shader,并鏈接成程序。
glAttachShader函數(shù)
- 函數(shù)定義
void glAttachShader(
GLuint program,
GLuint shader);
-
函數(shù)參數(shù)
- GLuint program:創(chuàng)建好的程序?qū)ο螅?/li>
- GLuint shader:需要添加到程序的Shader
-
說明
- 刪除Shader使用
glDetachShader函數(shù)。
- 刪除Shader使用
glLinkProgram函數(shù)
- 函數(shù)定義
void glLinkProgram( GLuint program);
- 函數(shù)參數(shù)
- GLuint program:創(chuàng)建好,并添加Shader的程序?qū)ο蟆?/li>
glGenVertexArrays函數(shù)
- 函數(shù)定義
void glGenVertexArrays(
GLsizei n,
GLuint *arrays);
- 函數(shù)參數(shù)
-
GLsizei n:創(chuàng)建的頂點(diǎn)數(shù)組個(gè)數(shù); -
GLuint *arrays:返回創(chuàng)建的頂點(diǎn)數(shù)組對(duì)象數(shù)組;
-
glBindVertexArray函數(shù)
- 函數(shù)定義
void glBindVertexArray( GLuint array);
-
函數(shù)參數(shù)
- GLuint array:需要綁定的頂點(diǎn)數(shù)組對(duì)象;
-
說明:
glBindVertexArray使用名稱數(shù)組綁定頂點(diǎn)數(shù)組對(duì)象。參數(shù)array是先前從調(diào)用glGenVertexArrays返回的頂點(diǎn)數(shù)組對(duì)象的名稱
或者為零以中斷現(xiàn)有的頂點(diǎn)數(shù)組對(duì)象綁定。
如果不存在名為array的頂點(diǎn)數(shù)組對(duì)象,則在數(shù)組第一次綁定時(shí)創(chuàng)建一個(gè)頂點(diǎn)數(shù)組對(duì)象。
如果綁定成功,則不會(huì)更改頂點(diǎn)數(shù)組對(duì)象的狀態(tài),并且任何先前的頂點(diǎn)數(shù)組對(duì)象綁定都將斷開。

