• 初识OpenGL (2)编译着色器


    step1. 创建一个着色器对象

    用ID来引用,储存这个顶点着色器为unsigned int,

    unsigned int vertexShader;
    vertexShader = glCreateShader(GL_VERTEX_SHADER);
    
    • 1
    • 2

    . glCreateShader 创建着色器。

    参数: 着色器类型。eg. 顶点着色器,传递的参数是GL_VERTEX_SHADER。

    step2. 把着色器源码附加到着色器对象上并编译

    const char *vertexShaderSource = "#version 330 core\n"
        "layout (location = 0) in vec3 aPos;\n"
        "void main()\n"
        "{\n"
        "   gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);\n"
        "}\0";
    
    glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);
    glCompileShader(vertexShader);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    glShaderSource函数
    第一个参数: 要编译的着色器对象。
    第二参数: 指定了传递的源码字符串数量,这里只有一个。
    第三个参数:顶点着色器真正的源码
    第四个参数:先设置为NULL。

    step3. 检测编译结果

    检测调用glCompileShader后编译是否成功了,如果没成功的话,你还会希望知道错误是什么,这样你才能修复它们。检测编译时错误可以通过以下代码来实现:

    int  success;
    char infoLog[512];
    glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success);
    
    • 1
    • 2
    • 3

    首先我们定义一个整型变量来表示是否成功编译,还定义了一个储存错误消息(如果有的话)的容器。然后我们用glGetShaderiv检查是否编译成功。如果编译失败,我们会用glGetShaderInfoLog获取错误消息,然后打印它。

    if(!success)
    {
        glGetShaderInfoLog(vertexShader, 512, NULL, infoLog);
        std::cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\n" << infoLog << std::endl;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    如果编译的时候没有检测到任何错误,顶点着色器就被编译成功了

  • 相关阅读:
    强强联合:OpenFeign 整合 Sentinel
    Selenium-CSS定位
    看完这篇,医学小白也能轻松玩转文献查阅
    电容笔和Apple pencil有啥区别?电容笔四大口碑比较好的品牌推荐
    17个机器学习的常用算法
    探究Vue 的脚手架-详细版
    GCC C语言特性
    c++面试题汇总(不定期更新...)
    图扑软件数字孪生厦门隧道,助力交通数字化升级
    HEC-RAS 1D/2D水动力与水环境模拟教程
  • 原文地址:https://blog.csdn.net/thefist11cc/article/details/125904383