GLSL(wiki chs)是OpenGL(OpenGL ES、WebGL)的着色器语言,拥有如下特点:
与C语言一样,包括:预处理 -- 编译 -- 链接 -- 执行 四大步骤
使用流程如下:
1. 提供顶点着色器(.vs)和片元着(.fs)文件。
2. 在CPU端,顶点着色器和片元着色器文件上载GPU,并在GPU端进行编译
3. 在GPU端,创建着色器程序,并完成链接。
4. 在CPU端,使用着色器程序

程序如下:
(1)以下是顶点着色器和片段着色器的文本内容。
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"; const char *fragmentShaderSource = "#version 330 core\n" "out vec4 FragColor;\n" "void main()\n" "{\n" " FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);\n" "}\n\0";
(2)在GPU端创建着色器,完成文本上载到GPU端,进行链接,编译。
GPU编译:顶点着色器
// build and compile our shader program // ------------------------------------ // vertex shader unsigned int vertexShader = glCreateShader(GL_VERTEX_SHADER);//在GPU端创建着色器 glShaderSource(vertexShader, 1, &vertexShaderSource, NULL); glCompileShader(vertexShader);//GPU编译顶点着色器 // check for shader compile errors int success; char infoLog[512]; glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success); // 检查是否vs编译成功 if (!success) { glGetShaderInfoLog(vertexShader, 512, NULL, infoLog); // 获取编译错误消息 std::cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\n" << infoLog << std::endl; }
GPU编译:片段着色器
// fragment shader unsigned int fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL); glCompileShader(fragmentShader);//GPU端编译着色器 // check for shader compile errors glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success); // 检查是否fs编译成功 if (!success) { glGetShaderInfoLog(fragmentShader, 512, NULL, infoLog); // 获取编译错误消息 std::cout << "ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n" << infoLog << std::endl; }
GPU端创着色器程序,并链接着色器
// link shaders unsigned int shaderProgram = glCreateProgram();//GPU端创建:着色器程序 glAttachShader(shaderProgram, vertexShader);// 附加GPU端已经编译好的:顶点着色器 glAttachShader(shaderProgram, fragmentShader); glLinkProgram(shaderProgram);// 执行着色器程序的链接过程。 // check for linking errors glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success); // 检测链接着色器程序是否失败 if (!success) { glGetProgramInfoLog(shaderProgram, 512, NULL, infoLog); // 获取链接错误消息 std::cout << "ERROR::SHADER::PROGRAM::LINKING_FAILED\n" << infoLog << std::endl; } glDeleteShader(vertexShader); // 链接完成后,不在需要vs着色器对象,在GPU端释放:已经编译好的顶点着色器(vertexShader,就是GPU端的地址) glDeleteShader(fragmentShader); // 链接完成后,不在需要fs着色器对象
CPU端使用着色器程序,程序结束,则释放GPU端的着色器程序
// render loop // ----------- while (1) { // Sleep for a while glUseProgram(shaderProgram); // 设置要使用的着色器程序 // Draw Something } //渲染程序结束,要 释放着色器程序 glDeleteProgram(shaderProgram);
endl;
浙公网安备 33010602011771号