顶点片元Shader

本文介绍了3D坐标空间的概念,包括物体空间、世界空间和摄像机空间,以及Unity中的坐标转换矩阵,如_LOCAL_TO_WORLD_和_WORLD_TO_LOCAL_。详细讲解了GPU管道流水线中的顶点片元着色器,如何在shader中编写Cg代码段,并控制灵活的着色效果。此外,还列举了常用的语义修饰,如_POSITION_、_NORMAL_、_TEXCOORD0_等,对于理解和创建自定义shader至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

坐标空间

  • 物体空间:3D物体自己的坐标空间
    一般设计时以几何体中心、人物双脚为原点
  • 世界空间:3D物体在场景中的世界坐标,整个游戏场景的空间
  • 摄像机空间:以观察摄像机为原点的坐标系下的空间
  • 投影成像:3D坐标转换到屏幕空间

Unity坐标系转换

  • transform.localToWorldMatrix 局部转世界的矩阵
  • transform.worldToLocalMatrix 世界坐标转局部坐标矩阵
  • shader中左乘_WorldToObject 矩阵实现世界坐标转局部坐标的变换
  • shader中左乘_ObjectToWorld矩阵实现局部坐标转世界坐标的变换
  • UNITY_MATRIX_MV 基本变换矩阵 x 摄像机矩阵
  • UNITY_MATRIX_MVP 基本变换矩阵 x 摄像机矩阵 x 投影矩阵
  • UNITY_MATRIX_V 摄像机矩阵
  • UNITY_MATRIX_P 投影矩阵
  • UNITY_MATRIX_VP 摄像机矩阵 x 投影矩阵
  • UNITY_MATRIX_T_MV(基本变换矩阵 x 摄像机矩阵)的转置矩阵
  • UNITY_MATRIX_IT_MV(基本变换矩阵 x 摄像机矩阵)的逆转置矩阵
  • UNITY_MATRIX_TEXTURE0 纹理变化矩阵

GPU管道流水线

顶点初始化
顶点shader
Tellellation曲面化
几何shader
裁剪投影
三角形遍历
片元着色shader
输出

顶点片元着色器

  • 控制灵活,但不能参加光照计算
  • 在着色器中插入Cg代码段,编写在CGPROGRAMENDCG之间
  • 编译指令:#program 控制着色器代码编译
    #progma vertex name 将名称为name的函数编译为顶点着色器
    #pragma fragment name 将名称为name的函数编译为片元着色器
  • 参数和返回值有语义修饰

常用语义修饰

  1. POSITION:位置
  2. TANGENT:切线
  3. NORMAL:法线
  4. TEXCOORD0:第一套纹理
  5. TEXCOORD1:第二套纹理
  6. TEXCOORD2:第三套纹理
  7. TEXCOORD3:第四套纹理
  8. COLOR:颜色

第一个shader

Shader "Custom/shader00" 
{
	//属性,可以在编辑器里面绑定和修改的
	Properties 
	{
		_Color ("Color", Color) = (1,1,1,1)
		_MainTex ("Albedo (RGB)", 2D) = "white" {}
		_Glossiness ("Smoothness", Range(0,1)) = 0.5
		_Metallic ("Metallic", Range(0,1)) = 0.0
	}
	SubShader
	{
		Pass
		{
			CGPROGRAM//插入CG代码开始
			#pragma vertex my_vert 
			//把my_vert作为顶点Shader的入口
			float4 my_vert(float4 pos : POSITION) : POSITION//语义绑定
			{
				return UnityObjectToClipPos(pos);
			}
			
			#pragma fragment my_frag
			fixed4 my_frag() : COLOR
			{
			    return fixed4(1.0, 0.0, 0.0, 1.0);
			}
			ENDCG//插入CG代码结束
		}
	}
	FallBack "Diffuse"
}

材质效果

### 如何用Shader实现瀑布顶点位置移动动画 为了实现在Shader中控制瀑布顶点的位置移动,可以利用顶点着色器来修改顶点坐标。这通常涉及到时间变量的应用以及一些基础的数学运算,比如正弦或余弦函数来模拟自然流动的效果。 在顶点着色器内,可以通过改变顶点的世界空间位置来创建动态效果。对于瀑布而言,主要关注的是Y轴方向上的位移变化,因为水流通常是垂直向下流淌。下面给出一段用于演示目的的基础代码段: ```c // 定义属性和统一变量 struct appdata { float4 vertex : POSITION; }; float _TimeFactor; // 时间因子,影响流速 v2f vert (appdata v) { v2f o; // 获取当前帧的时间戳并乘以速度系数 float time = _Time * _TimeFactor; // 应用正弦波形偏移量到y轴上 float offsetY = sin(v.vertex.x + time) * 0.1; // 修改原始顶点位置 v.vertex.y -= offsetY; // 将变换后的顶点传递给像素着色器 o.pos = UnityObjectToClipPos(v.vertex); return o; } ``` 此段代码展示了如何通过调整顶点沿Y轴的方向来进行简单的上下浮动操作[^1]。这里使用了`sin()`函数生成周期性的波动模式,并将其应用于每个顶点的X坐标加上全局时间作为输入参数,从而形成连续不断的运动感。 需要注意的是,在实际应用中可能还需要考虑更多因素,例如水滴分离、碰撞检测等复杂交互逻辑;此外也可以引入其他类型的噪声算法(如Perlin Noise),使水流看起来更加真实随机[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值