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

【Unity Shader编程】之顶点着色器

来一张AI提供的资料在这里插入图片描述
在shader编程中,定义的结构体,有些是会被自动赋值,有些是必须要手动赋值的,这就涉及到了语义
例如

    struct appdata
    {
        float4 vertex : POSITION;
        float vertex2;
        float2 uv : TEXCOORD0;
    };

结构体里面定义的两个变量 vertex和uv,后面加了POSITION和TEXCORD0两个语义,就赋予了他们不同的特殊功能,他们会被自动赋值,而vertex2就是一个普通的变量了。
下面是语义表
在这里插入图片描述

**

一,坐标空间转换

空间转换中,一般有五个空间转换,模型空间→世界空间→视图空间→裁剪空间→NDC空间(其次坐标空间,执行其次坐标后的空间)→屏幕空间**
在这里插入图片描述

核心原则

1,数据依赖原则

当逻辑需要相对坐标系属性(如模型UV、顶点色)时,优先在模型空间处理(如gl_Vertex变换前)
当逻辑依赖全局交互状态(如光照方向、物理碰撞)时,必须转换到世界空间后处理

2,性能优化准则

在顶点着色器阶段处理空间转换(如UNITY_MATRIX_MVP),利用GPU并行性在片段着色器中避免重复坐标转换,通过TEXCOORD传递预处理数据

3,精度控制策略

高精度计算(如物理模拟)应在世界空间使用double类型
视觉效果类计算(如雾效)可在视图空间使用float类型

空间转换代码

Shader "SpaceTransform/BasicChain"
 {
  SubShader { 
  Pass { 
  CGPROGRAM
   #pragma vertex vert 
   #pragma fragment frag
    #include "UnityCG.cginc"

        struct appdata {
            float4 vertex : POSITION;
        };

        struct v2f {
            float4 pos : SV_POSITION;
            float4 worldPos : TEXCOORD0;
            float4 viewPos : TEXCOORD1;
        };

        v2f vert (appdata v) {
            v2f o;
            
            // 模型空间 → 世界空间 
            o.worldPos  = mul(unity_ObjectToWorld, v.vertex); 
            
            // 世界空间 → 视图空间 
            o.viewPos  = mul(UNITY_MATRIX_V, o.worldPos); 
            
            // 视图空间 → 裁剪空间 
            o.pos  = mul(UNITY_MATRIX_P, o.viewPos); 
            
            return o;
        }

        fixed4 frag (v2f i) : SV_Target {
            return fixed4(1,1,1,1); // 纯白输出 
        }
        ENDCG 
    }
}
}

2,顶点动态变化

顶点动态变化日常会使用到的功能如下
在这里插入图片描述

  1. 基础正弦波波动例子(模型空间)

        v2f vert (appdata v)
         {
             v2f o;
             float4 worldPos = mul(unity_ObjectToWorld, v.vertex);
             // Y轴波动计算(频率_Hz,振幅_Amp)
             float wave = _Amp * sin(_Time.y * _Hz + worldPos.x * _WaveDensity);
             v.vertex.y  += wave;
             o.vertex = UnityObjectToClipPos(v.vertex);
             return o;
         }
    

后续效果相对复杂,这边大概讲入门,就不全部细说

相关文章:

  • 基于Docker-compose的禅道部署实践:自建MySQL与Redis集成及故障排查指南
  • 【Python深入浅出㉗】Python3正则表达式:开启高效字符串处理大门
  • pdf.js默认显示侧边栏和默认手形工具
  • Node.js 完全教程:从入门到精通
  • QT 5.15.2 开发地图ArcGIS 100.15.6(ArcGIS Runtime SDK for Qt)
  • 【Spring AI】基于SpringAI+Vue3+ElementPlus的QA系统实现(后端)
  • 为什么配置Redis时候要序列化配置呢
  • C# 鼠标点击ToolStripStatuslabel 在线修改Text属性并存储加载显示Text属性
  • 无人机雨季应急救灾技术详解
  • 计算机毕业设计Tensorflow+LSTM空气质量监测及预测系统 天气预测系统 Spark Hadoop 深度学习 机器学习 人工智能
  • Linux 常见的虚拟文件系统
  • 大数据学习之PB级百战出行网约车二
  • MySQL数据库入门到大蛇尚硅谷宋红康老师笔记 基础篇 part 10
  • Python----PyQt开发(PyQt高级:图像显示,定时器,进度条)
  • 2024年终总结和2025年规划
  • Java中使用EasyExcel
  • Ubuntu 下 nginx-1.24.0 源码分析 - ngx_gmtime 函数
  • 每日Attention学习23——KAN-Block
  • 低空经济:开启未来空中生活的全新蓝海
  • 【动态规划】--- 斐波那契数模型
  • 秦洪看盘|重估叙事主题卷土重来,给A股注入新活力
  • 马新民卸任外交部条约法律司司长
  • 人民日报钟声:中方维护自身发展利益的决心不会改变
  • 驱逐行动再加码?特朗普或向利比亚和卢旺达遣送非法移民
  • 印官员称巴基斯坦在克什米尔实控线附近开火已致7死38伤
  • 央行:5月15日起下调金融机构存款准备金率0.5个百分点