news 2026/7/15 2:22:55

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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);
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/13 5:10:59

SQL注入漏洞实战:从手工注入到参数化查询修复

1. 项目概述&#xff1a;一次典型的Web应用安全实战最近在整理一些老旧的Web应用系统漏洞案例&#xff0c;发现很多开发者对SQL注入这类“古典”漏洞的防范意识依然不足。今天我们就来深入复现一个典型的案例&#xff1a;某微商城系统的goods.php文件存在的SQL注入漏洞。这个案…

作者头像 李华
网站建设 2026/7/13 5:10:56

TI TPIC7710EVM评估模块:汽车EPB系统ASIC驱动与电机控制实战解析

1. 项目概述与核心价值如果你正在开发汽车电子驻车制动&#xff08;EPB&#xff09;系统&#xff0c;或者对高集成度电机驱动ASIC的评估感兴趣&#xff0c;那么德州仪器&#xff08;TI&#xff09;的TPIC7710EVM评估模块绝对是一个绕不开的利器。我最近在做一个EPB控制单元的原…

作者头像 李华
网站建设 2026/7/14 15:17:07

EtherCAT重学之二: EtherCAT 系统硬件架构

EtherCAT 系统的硬件分为两大部分&#xff1a;主站&#xff08;Master&#xff09;和从站&#xff08;Slave&#xff09;。主站负责发起所有通信、配置从站、周期性地交换过程数据&#xff1b;从站负责执行主站的命令、响应数据读写、驱动物理设备&#xff08;电机、IO、传感器…

作者头像 李华
网站建设 2026/7/13 5:11:15

从零到一:如何用免费开源Verilog工具链打造专业数字电路

从零到一&#xff1a;如何用免费开源Verilog工具链打造专业数字电路 【免费下载链接】iverilog Icarus Verilog 项目地址: https://gitcode.com/gh_mirrors/iv/iverilog 还在为昂贵的EDA软件许可证发愁吗&#xff1f;Icarus Verilog——这个完全开源、符合IEEE 1364标准…

作者头像 李华
网站建设 2026/7/13 5:10:54

从让AI写代码,到让AI管流程

1. 背景&#xff1a;我想让 AI 接管训练全过程 最近业余时间&#xff0c;我在尝试用 YOLO26 训练一个目标对象识别模型。 一开始的想法很直接&#xff1a;把本地视频素材交给 AI&#xff0c;让 AI 帮我完成从数据集处理到模型训练的全过程。这不是单纯让 AI 写一个训练脚本&…

作者头像 李华
网站建设 2026/7/14 10:58:16

Burp Suite实战:验证码场景下的自动化渗透测试与绕过技术

1. 项目概述&#xff1a;当验证码遇上自动化测试在Web应用安全测试&#xff0c;特别是渗透测试的授权攻击阶段&#xff0c;验证码&#xff08;CAPTCHA&#xff09;常常是横亘在自动化攻击工具面前的一道“叹息之墙”。它的设计初衷就是为了区分人类用户和自动化脚本&#xff0c…

作者头像 李华