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

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

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
			}
		}
}

相关推荐

  1. shader学习记录——几何着色

    2024-03-21 21:58:02       46 阅读
  2. OpenGL着色对象 Shader Objects

    2024-03-21 21:58:02       58 阅读
  3. 从渲染管线到着色Shader实践

    2024-03-21 21:58:02       26 阅读
  4. 11.3 OpenGL可编程顶点处理:几何着色

    2024-03-21 21:58:02       52 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-21 21:58:02       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-21 21:58:02       106 阅读
  3. 在Django里面运行非项目文件

    2024-03-21 21:58:02       87 阅读
  4. Python语言-面向对象

    2024-03-21 21:58:02       96 阅读

热门阅读

  1. c++简介

    2024-03-21 21:58:02       44 阅读
  2. web高可用集群(lvs负载均衡+keepalved高可用)

    2024-03-21 21:58:02       37 阅读
  3. 算法刷题day32

    2024-03-21 21:58:02       32 阅读
  4. Linux 安装RabbitMQ及RabbitMQ Web界面管理

    2024-03-21 21:58:02       39 阅读
  5. 注解的原理

    2024-03-21 21:58:02       35 阅读
  6. 浅谈Spring框架

    2024-03-21 21:58:02       45 阅读
  7. C 语言中常量和变量的区别

    2024-03-21 21:58:02       47 阅读
  8. 【生命周期】简述及部分软件知识补充

    2024-03-21 21:58:02       41 阅读
  9. IM服务集群与跨服务器消息路由策略

    2024-03-21 21:58:02       34 阅读
  10. sqllab通关笔记(汇总)

    2024-03-21 21:58:02       40 阅读