GL01-06:著色器的使用

本文主要還是解決圖元繪制中的渲染問題-著色器,著色器的使用包含兩個(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的版本

  • 提前的說明
    1. 在其他系統(tǒng)中,實(shí)際上繪制點(diǎn)、線段、三角形等,都可以輸出效果; 在Mac的OpenGL中,如果沒有使用著色器,則線段、三角形看不見輸出;

    2. 在默認(rèn)情況下,加載的OpenGL的庫版本是2.1,但這里講解的是OpenGL使用4.1

    3. 本文重點(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

繪制基本圖元

繪制圖元的基本模式

  1. 定義頂點(diǎn)數(shù)據(jù):類型float數(shù)組,
  2. 創(chuàng)建頂點(diǎn)緩沖區(qū)對(duì)象:glGenBuffers函數(shù);
  3. 指定頂點(diǎn)緩沖區(qū)數(shù)據(jù)類型:glBindBuffer函數(shù);
  4. 設(shè)置頂點(diǎn)緩沖區(qū)的數(shù)據(jù):glBufferData函數(shù);
  5. 啟用指定索引的頂點(diǎn)屬性:glEnableVertexAttribArray函數(shù);
  6. 定義通用頂點(diǎn)屬性數(shù)據(jù)數(shù)組:glVertexAttribPointer函數(shù);
  7. 繪制圖元: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語言外,剩下的就是套路(俗稱編程模式)。

著色器編程模式

  1. 編寫Shader:

    • 頂點(diǎn)Shader(vetexShader);
    • 片Shader(ragmentShader);
  2. 創(chuàng)建頂點(diǎn)著色器對(duì)象

    • 創(chuàng)建vertexShader對(duì)象;glCreateShader
    • 加載vertexShader腳本到vertexShader對(duì)象;glShaderSource
    • 編譯vertexShader腳本;glCompileShader
  3. 創(chuàng)建片著色器

    • 創(chuàng)建fragmentShader對(duì)象;glCreateShader
    • 加載fragmentShader腳本到fragmentShader對(duì)象;glShaderSource
    • 編譯fragmentShader腳本;glCompileShader
  4. 創(chuàng)建著色器程序

    • 創(chuàng)建程序?qū)ο螅?code>glCreateProgram
    • 添加vertexShader對(duì)象到著色器程序;glAttachShader
    • 添加fragmentShader對(duì)象到著色器程序;glAttachShader
    • 鏈接著色器程序,以備渲染管道調(diào)用;glLinkProgram
  5. 在開啟頂點(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)建與頂點(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
     */

著色器使用代碼

  1. 代碼

#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


  1. 運(yùn)行結(jié)果
    • 使用著色器渲染圖元

著色器編程使用的函數(shù)說明

glCreateShader函數(shù)

  1. 函數(shù)定義
    • glCreateShader創(chuàng)建一個(gè)空的shader對(duì)象,并返回一個(gè)可以引用它的非零值。
    • Shader對(duì)象用于維護(hù)定義Shader的源代碼字符串。
    • shaderType指示要?jiǎng)?chuàng)建的Shader的類型。
    • OpenGL支持五種類型的Shader。
    GLuint glCreateShader(  GLenum shaderType);
  1. 函數(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。

glShaderSource函數(shù)

  1. 函數(shù)定義
void glShaderSource(    
    GLuint shader,
    GLsizei count,  
    const GLchar **string,
    const GLint *length);

  1. 函數(shù)參數(shù)

    • GLuint shader:Shader對(duì)象;
    • GLsizei count:字符串個(gè)數(shù);
    • const GLchar **string:字符串?dāng)?shù)組(不是數(shù)組字符串:雙指針);
    • const GLint *length:字符串長度的數(shù)組;如果是空,則表示字符串使用空表示結(jié)束;
  2. 說明:

    • 當(dāng)調(diào)用glShaderSource時(shí),OpenGL復(fù)制Shader源代碼字符串,因此應(yīng)用程序可以在函數(shù)返回后立即釋放其源代碼字符串的副本。

glCompileShader函數(shù)

  1. 函數(shù)定義
    void glCompileShader(   GLuint shader);

  1. 函數(shù)參數(shù)

    • GLuint shader:已經(jīng)創(chuàng)建,并copy了Shader源代碼的Shader對(duì)象。
  2. 說明:

    • 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ù)

  1. 函數(shù)定義
    GLuint glCreateProgram( void);
  1. 函數(shù)返回值

    • GLuint:返回創(chuàng)建的程序?qū)ο蟆?/li>
  2. 說明:

    • 創(chuàng)建的程序是空的,可以指定Shader,并鏈接成程序。

glAttachShader函數(shù)

  1. 函數(shù)定義
void glAttachShader(    
    GLuint program,
    GLuint shader);

  1. 函數(shù)參數(shù)

    • GLuint program:創(chuàng)建好的程序?qū)ο螅?/li>
    • GLuint shader:需要添加到程序的Shader
  2. 說明

    • 刪除Shader使用glDetachShader函數(shù)。

glLinkProgram函數(shù)

  1. 函數(shù)定義

void glLinkProgram( GLuint program);

  1. 函數(shù)參數(shù)
    • GLuint program:創(chuàng)建好,并添加Shader的程序?qū)ο蟆?/li>

glGenVertexArrays函數(shù)

  1. 函數(shù)定義
void glGenVertexArrays( 
    GLsizei n,           
    GLuint *arrays);
 
  1. 函數(shù)參數(shù)
    • GLsizei n:創(chuàng)建的頂點(diǎn)數(shù)組個(gè)數(shù);
    • GLuint *arrays:返回創(chuàng)建的頂點(diǎn)數(shù)組對(duì)象數(shù)組;

glBindVertexArray函數(shù)

  1. 函數(shù)定義
void glBindVertexArray( GLuint array);
  1. 函數(shù)參數(shù)

    • GLuint array:需要綁定的頂點(diǎn)數(shù)組對(duì)象;
  2. 說明:

    • 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ì)象綁定都將斷開。


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容