shader学习记录——几何着色器

本文介绍了在Unity中使用几何着色器实现沙砾化效果的基本模型,涉及顶点着色器、片元着色器和几何着色器的编写,以及如何通过加速参数控制模型的动态变化。
摘要由CSDN通过智能技术生成

参考连接:
几何着色器基础知识
模型沙砾化

Shader "Custom/geomShader"
{
	Properties
	{
		_MainTex("Texture", 2D) = "white" {}
		_Speed("Speed", Float) = 10
		_AccelerationValue("AccelerationValue", Float) = 10
	}
		SubShader
		{
			Tags { "RenderType" = "Opaque" }
			LOD 100

			Pass
			{
				CGPROGRAM

				#pragma vertex vert //顶点着色器函数
				#pragma fragment frag //片元着色器函数
				#pragma geometry geom //几何着色器函数

				#include "UnityCG.cginc"

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

				struct v2g
				{
					float2 uv : TEXCOORD0;
					float4 vertex : POSITION;
					float3 normal : NORMAL;
				};

				struct g2f
				{
					float2 uv : TEXCOORD0;
					float4 vertex : SV_POSITION;
					float3 normal : NORMAL; //定义后,必须使用
				};

				sampler2D _MainTex;

				float _Speed;
				float _AccelerationValue;
				float _StartTime;

				v2g vert(appdata v)
				{
					v2g o;//将顶点和UV信息存入 o 返回
					o.vertex = v.vertex;
					o.uv = v.uv;
					return o;
				}

				//maxvertexcount 定义顶点输出的最大数量,PointStream>=1,LineStream>=2,TriangleStream>=3
				[maxvertexcount(3)]
				void geom(triangle v2g IN[3], inout LineStream<g2f> pointStream)
				{   //第一个参数是输入图元,三角面的顶点UV信息
					//图像单元,point=1,line=2,triangle=3,lineadj=4 线段相邻2个点,triangleadj=6 三角形相邻三个点
					//第二个参数是输出图元的顶点UV信息
					//PointStream,LineStream,TriangleStream
					//g2f o;

					//float3 v1 = IN[1].vertex - IN[0].vertex;
					//float3 v2 = IN[2].vertex - IN[0].vertex;

					//float3 norm = normalize(cross(v1, v2));//计算点移动的方向
					//o.normal = (IN[0].normal + IN[1].normal + IN[2].normal) / 3;
					//float3 tempPos = (IN[0].vertex + IN[1].vertex + IN[2].vertex) / 3;

					//float realTime = _Time.y - _StartTime;
					//tempPos += norm * (_Speed * realTime + .5 * _AccelerationValue*0.01 * pow(realTime, 2));

					//o.vertex = UnityObjectToClipPos(tempPos);

					//o.uv = (IN[0].uv + IN[1].uv + IN[2].uv) / 3;

					//pointStream.Append(o);

					
					for (int i = 0; i < 3; i++)
					{
						g2f g;
						//g.vertex = IN[i].vertex;//屏幕上的点坐标,结果会跟随相机移动

						//理解为模型的世界坐标,可以正常做三维坐标计算
						float3 pos = IN[i].vertex+float3(0,1,0);
						//物体的世界坐标转裁剪坐标,转换后,结果会跟随物体移动
						g.vertex = UnityObjectToClipPos(pos * _AccelerationValue * 0.1);
						g.normal = IN[i].normal; //此行注释,shader无法正常应用
						g.uv = IN[i].uv;
						pointStream.Append(g);
					}
					
				}

				fixed4 frag(g2f i) : SV_Target
				{
					fixed4 col = tex2D(_MainTex, i.uv);
					return col;
				}
				ENDCG
			}
		}
}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值