初识OpenGL 编译着色器

Posted thefist11

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了初识OpenGL 编译着色器相关的知识,希望对你有一定的参考价值。

step1. 创建一个着色器对象

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

unsigned int vertexShader;
vertexShader = glCreateShader(GL_VERTEX_SHADER);

. 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);

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

step3. 检测编译结果

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

int  success;
char infoLog[512];
glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success);

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

if(!success)

    glGetShaderInfoLog(vertexShader, 512, NULL, infoLog);
    std::cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\\n" << infoLog << std::endl;

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

以上是关于初识OpenGL 编译着色器的主要内容,如果未能解决你的问题,请参考以下文章

初识OpenGL 链接着色器

初识OpenGL 链接着色器

初识OpenGL 片段着色器(Fragment Shader)

初识OpenGL 片段着色器(Fragment Shader)

OpenGL着色器编译错误

为啥在使用 OpenGL 编译顶点着色器时会出现着色器编译器错误 #143、#160 和 #216?