着色器本质一段运行在显卡GPU上的小程序。作用告诉GPU“每个顶点应该放在哪里”和“每个像素应该显示什么颜色”分类顶点着色器、几何着色器、片段着色器顶点着色器作用告诉GPU每个顶点的位置类比手办搭骨架几何着色器作用告诉GPU这三个点组成的是三角形类比手办组装片段着色器作用告诉GPU这些三角形里面的每个像素是什么颜色类比手办上色为什么需要着色器灵活性同样的代码换一个着色器就可以得到不同的渲染风格卡通-写实可控性你可以精确控制画出来的光照、阴影等效果编译链接着色器作用让GPU能够读懂你的着色器代码类比就和你写c的hello world一样需要编译和链接才能让机器读懂你在干什么代码示例顶点着色器—一般着色器都是c语言风格- cpp #version 330 core //告诉GPU要使用opengl3.3的核心模式来编译代码 layout (location 0) in vec3 aPos; // 输入CPU传过来的顶点位置 void main() { // 输出把位置告诉GPU1.0表示这个顶点是一个具体的点而不是方向向量 gl_Position vec4(aPos.x, aPos.y, aPos.z, 1.0); } 片段着色器#version330coreout vec4 FragColor;// 输出最终颜色voidmain(){//红色1.0绿色0.5蓝色0.2透明度1.0完全不透明//RGBA,A表示的透明度FragColorvec4(1.0,0.5,0.2,1.0);// 橙黄色完全不透明}编译着色器// 1. 创建一个空的着色器对象告诉 OpenGL 这是什么类型的着色器unsignedintvertexShader;vertexShaderglCreateShader(GL_VERTEX_SHADER);// 创建顶点着色器对象unsignedintfragmentShader;fragmentShaderglCreateShader(GL_FRAGMENT_SHADER);// 创建片段着色器对象// 2. 把 GLSL 代码字符串附加到着色器对象上glShaderSource(vertexShader,1,vertexShaderSource,NULL);glShaderSource(fragmentShader,1,fragmentShaderSource,NULL);// 3. 编译着色器语法检查 翻译成 GPU 机器码glCompileShader(vertexShader);glCompileShader(fragmentShader);// 4. 检查是否编译成功非常重要intsuccess;charinfoLog[512];glGetShaderiv(vertexShader,GL_COMPILE_STATUS,success);if(!success){glGetShaderInfoLog(vertexShader,512,NULL,infoLog);std::coutERROR::SHADER::VERTEX::COMPILATION_FAILED\ninfoLogstd::endl;}// 检查片段着色器编译是否成功glGetShaderiv(fragmentShader,GL_COMPILE_STATUS,success);if(!success){glGetShaderInfoLog(fragmentShader,512,NULL,infoLog);std::coutERROR::SHADER::FRAGMENT::COMPILATION_FAILED\ninfoLogstd::endl;}// 5. 创建一个着色器程序对象完整的操作流程unsignedintshaderProgram;shaderProgramglCreateProgram();// 6. 把编译好的顶点着色器和片段着色器“安装”到程序里glAttachShader(shaderProgram,vertexShader);glAttachShader(shaderProgram,fragmentShader);// 7. 链接程序把所有着色器合并成一个可执行的整体glLinkProgram(shaderProgram);// 8. 检查链接是否成功glGetProgramiv(shaderProgram,GL_LINK_STATUS,success);if(!success){glGetProgramInfoLog(shaderProgram,512,NULL,infoLog);std::coutERROR::SHADER::PROGRAM::LINKING_FAILED\ninfoLogstd::endl;}// 9. 激活着色器程序大厨开始按菜谱工作glUseProgram(shaderProgram);// 10. 着色器对象链接到程序后可以删除释放资源glDeleteShader(vertexShader);glDeleteShader(fragmentShader);