news 2026/6/10 22:41:11

着色器变量

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
着色器变量

在WebGL/GLSL的渲染流水线中,顶点着色器与片元着色器的传参有着严格的规范,这是由GPU的渲染架构和数据处理逻辑决定的,以下是核心规定和原因解析:


一、着色器变量的作用域与类型约束

WebGL将着色器变量分为三类,各自有明确的作用域和传递规则:

变量类型顶点着色器片元着色器核心作用
Attribute仅支持in(输入)不可用传递每个顶点独有的数据(如坐标、法向量、UV),由CPU通过缓冲区绑定传递
Varying支持out(输出)支持in(输入)实现顶点到片元的插值传递,GPU自动对顶点数据进行光栅化插值,生成片元级平滑数据
Uniform支持in(输入)支持in(输入)传递全局共享数据(如MVP矩阵、光照参数),所有顶点/片元使用同一值

二、为什么不能直接在片元着色器中接收顶点着色器的in变量?

你提到的a_normal属于Attribute变量,这类变量有严格的使用限制:

  1. 执行阶段分离

    • 顶点着色器是逐顶点执行,每个顶点对应一次调用,直接读取CPU传递的顶点缓冲区数据;
    • 片元着色器是逐像素执行,每个像素对应一次调用,此时已经没有"顶点"的概念,只有光栅化后的片元(像素)数据。
      两者的执行上下文完全独立,无法直接共享顶点级数据。
  2. 数据插值需求
    顶点数据(如法向量、颜色、UV)需要在三角形/图元内部进行平滑插值,才能让片元得到连续的视觉效果(如渐变颜色、平滑光照)。
    这个插值过程由GPU自动完成,但必须通过Varying变量作为桥梁:

    // 顶点着色器:输出顶点法向量 out vec3 v_normal; void main() { v_normal = a_normal; // 传递顶点数据到Varying } // 片元着色器:接收插值后的法向量 in vec3 v_normal; void main() { // v_normal是GPU自动插值后的片元级数据,而非原始顶点数据 vec3 color = calculateLighting(v_normal); }
  3. WebGL规范硬性约束

    • Attribute变量只能在顶点着色器中声明为in,片元着色器无法访问Attribute变量;
    • 跨着色器传递必须使用Varying变量(WebGL 1.0中用varying关键字,WebGL 2.0中用out/in配对),且变量的类型、名称必须完全一致,否则GPU无法识别数据通道。

三、传参的核心规定总结

  1. Attribute变量

    • 仅顶点着色器可用,必须与CPU的顶点缓冲区绑定;
    • 每个顶点对应一个独立值,无法直接传递到片元着色器。
  2. Varying变量

    • 顶点着色器中声明为out,片元着色器中声明为in,名称和类型必须严格匹配;
    • 自动完成光栅化插值,将顶点数据平滑过渡到每个片元。
  3. Uniform变量

    • 可同时在顶点/片元着色器中声明为in
    • 全局共享同一值,适合传递矩阵、光照参数等不随顶点/片元变化的数据。

如果你尝试在片元着色器中直接使用顶点着色器的in变量(如a_normal),WebGL会抛出编译错误,因为片元着色器的上下文不存在该变量的定义,也无法访问顶点缓冲区数据。必须通过Varying变量完成跨阶段的数据传递。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 9:34:57

P9333 [JOIST 2023] 议会 / Council题解

P9333 [JOIST 2023] 议会 / Council 题目背景 本题子任务编号如果为 0 表示样例,如果是非 0 的一位数表示满足对应的子任务,如果是两位数表示同时满足这两个子任务。 题目描述 题目翻译 在 JOI 市议会中,有 NNN 名议员,编号从 111…

作者头像 李华
网站建设 2026/6/10 9:31:59

ops-nn仓库深度实操:AIGC模型适配的核心算子调用与避坑指南

在上一篇博客中,我们全景拆解了CANN开源仓的四大核心模块,明确了ops-nn仓库作为AIGC模型适配的“基础基石”,承载着卷积、激活、归一化等核心算子的支撑作用。但很多开发者在实际上手后,依然会遇到各种问题:调用ops-nn…

作者头像 李华
网站建设 2026/6/10 9:34:56

DeepSeek-OCR 2上线魔乐社区,让AI像人一样读文档

当我们阅读一页复杂文档时,视线并不是从左上到右下机械扫描,而是会沿着标题、段落、表格、公式的逻辑顺序自然跳转。DeepSeek 最新发布的 DeepSeek-OCR 2,正是第一次把这种人类阅读逻辑引入OCR模型架构。它不仅识别更准,更重要的是…

作者头像 李华
网站建设 2026/6/10 2:28:31

算法学习——素数筛法

素数:一个大于1的自然数,除了1和它本身以外不再有其他因数的数称为素数。合数:一个大于1的自然数,除了1和它本身以外还有其他因数的数称为合数。因数:整数a除以整数b(b≠0)的商正好是整数而没有余数&#x…

作者头像 李华