当前位置: 首页 > news >正文

OpenGL学习笔记-04-着色器-基础说明

着色器

  • 本质:一段运行在显卡(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() { // 输出:把位置告诉GPU,(1.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表示的透明度FragColor=vec4(1.0,0.5,0.2,1.0);// 橙黄色,完全不透明}
  • 编译着色器
// 1. 创建一个空的着色器对象,告诉 OpenGL 这是什么类型的着色器unsignedintvertexShader;vertexShader=glCreateShader(GL_VERTEX_SHADER);// 创建顶点着色器对象unsignedintfragmentShader;fragmentShader=glCreateShader(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::cout<<"ERROR::SHADER::VERTEX::COMPILATION_FAILED\n"<<infoLog<<std::endl;}// 检查片段着色器编译是否成功glGetShaderiv(fragmentShader,GL_COMPILE_STATUS,&success);if(!success){glGetShaderInfoLog(fragmentShader,512,NULL,infoLog);std::cout<<"ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n"<<infoLog<<std::endl;}// 5. 创建一个着色器程序对象(完整的操作流程)unsignedintshaderProgram;shaderProgram=glCreateProgram();// 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::cout<<"ERROR::SHADER::PROGRAM::LINKING_FAILED\n"<<infoLog<<std::endl;}// 9. 激活着色器程序(大厨开始按菜谱工作)glUseProgram(shaderProgram);// 10. 着色器对象链接到程序后,可以删除释放资源glDeleteShader(vertexShader);glDeleteShader(fragmentShader);
http://www.cnnetsun.cn/news/3054405.html

相关文章:

  • SQL注入漏洞实战:从手工注入到参数化查询修复
  • TI TPIC7710EVM评估模块:汽车EPB系统ASIC驱动与电机控制实战解析
  • EtherCAT重学之二: EtherCAT 系统硬件架构
  • 从零到一:如何用免费开源Verilog工具链打造专业数字电路
  • 从让AI写代码,到让AI管流程
  • Burp Suite实战:验证码场景下的自动化渗透测试与绕过技术
  • 权威测评:2026年实力出众的专业AI论文工具
  • 关于我的第十次web作业
  • 3步搞定Navicat无限试用:Mac用户的终极解决方案 [特殊字符]
  • DICOM图像核心参数实战指南:从像素到诊断的精准度量
  • 无需编程,快速打造专属物联网APP——ThingsCloud平台实战指南
  • 煤矿通信 “侦察兵”:光缆普查仪 CM-K60 助力井下光缆快速识别
  • MATLAB双目相机标定:从工具箱实战到参数解析
  • 企业AI化转型核心:打造分工协作的多Agent团队,小白也能看懂!
  • League Akari终极指南:8个秘诀掌握英雄联盟自动秒选黑科技
  • 【独家首发】ChatGPT API调用诊断工具包(含12个自检函数+实时token追踪+异常归因热力图)
  • 深入解析TL16C552:双串一并通信控制器的硬件设计与软件驱动
  • 【R语言实战】解锁Wind与iFinD金融数据:从零到一的API调用与避坑指南
  • 如何用League Akari实现英雄联盟自动秒选:终极配置指南
  • 计算机毕业设计之基于SSM礼服租赁系统的设计与实现
  • RePKG使用指南:轻松提取Wallpaper Engine资源包和转换TEX图片格式
  • 评测:国内主流S2B2C系统服务商全方位横评(2026版)
  • 如何在1分钟内为Windows安装苹果USB网络共享驱动:完整解决方案
  • 突然报 “关键字 WITH 附近有语法错误“?一篇避坑指南
  • Feign 远程调用:调用的是对方项目的 Controller,不是 Service
  • Windows风扇控制终极指南:用Fan Control彻底告别噪音烦恼
  • 从FIR与IIR的群延迟差异,看滤波器如何塑造信号
  • nlohmann/json:现代C++ JSON处理的终极完整指南
  • RSA非对称加密在登录模块的实战应用:从原理到前后端完整实现
  • TPIC7710EVM评估板实战:从硬件解析到GUI软件驱动的电机控制芯片验证