Geometry几何着色器学习(一)——UnityShader学习笔记

自言自语

学习新知识 记录一下。几何着色器不做什么处理的情况下的三种状态表现

一、效果在这里插入图片描述

二、Shader

Shader "TNshaders/GeometryShaderPractise"
{
    Properties
    {
       [HDR]_TriangleColor ("TriangleColor",Color)=(0,0,1,1)
       [HDR]_LineColor ("LineColor",Color)=(0,1,0,1)
       [HDR]_PointColor ("PointColor",Color)=(1,0,0,1)    
       _Offset("ScaleTriangle",Float) =1
       _Offset1("ScaleLine",Float) =1
       _Offset2("ScalePoint",Float) =1
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }

        Pass
        {
        //输出三角形的pass
            NAME "TRIANGLE PASS"
            CGPROGRAM
            #pragma vertex vert
            //几何着色器声明
            #pragma geometry geom
            #pragma fragment frag

            #include "UnityCG.cginc"
            
            float4 _TriangleColor;
            float _Offset;

            struct a2v
            {
                float4 vertex : POSITION;
                float2 texcoord : TEXCOORD0;
                float3 normal : NORMAL;
            };
            //几何着色器需要传递的数据
            struct v2g 
            {
                float4 pos : POSITION;
                float2 uvG : TEXCOORD0;
                float3 normal : TEXCOORD1;
            };
            //再从几何着色器变化过的数据传到片元着色器的结构      所以可以不用v2f 不过一个名字 想怎么取随便 自己别忘了就行
            struct g2f
            {
                float2 uv : TEXCOORD0;
                float4 posf : SV_POSITION;
            };

        //取代原本v2f 将顶点结构传入到结合着色器需要的结构中
            v2g  vert (a2v v)
            {
                v2g o = (v2g)0;
                o.pos =v.vertex;
                o.normal = v.normal;
                o.uvG = v.texcoord;
                
                return o;
            }

	//几何着色器 是在顶点着色器和片元着色器之间 vs 的输出作为gs的输入      vs 顶点着色器  gs 几何着色器
            //最大调用顶点数,三角形因为是三个顶点,因此最小输入3个顶点进入
			[maxvertexcount(3)]
			//输入 point line triangle lineadj triangleadj----输出: PointStream只显示点,LineStream只显示线,TriangleStream三角形
			void geom (triangle v2g input[3], inout TriangleStream<g2f> g)
			{
                g2f o = (g2f)0;
                //3个顶点 就要计算三次。 如果输入的是一个顶点 就计算一次  不用循环写三次也是可以的
                for (int i = 0; i<3; i++)
                {
                    o.posf = input[i].pos+float4(input[i].normal,0)*_Offset;
                    o.uv = input[i].uvG;
                    o.posf = UnityObjectToClipPos(o.posf);
                    g.Append(o);
                }
            }

            half4 frag (g2f i) : SV_Target
            {
                return _TriangleColor;
            }
            ENDCG
        }
        Pass
        {
        //输出线段的pass
            NAME "LINE PASS"
            CGPROGRAM
            #pragma vertex vert
            //几何着色器声明
            #pragma geometry geom
            #pragma fragment frag

            #include "UnityCG.cginc"
            
            float4 _LineColor;
            float _Offset1;

            struct a2v
            {
                float4 vertex : POSITION;
                float2 texcoord : TEXCOORD0;
                float3 normal : NORMAL;
            };
            //几何着色器需要传递的数据
            struct v2g 
            {
                float4 pos : POSITION;
                float2 uvG : TEXCOORD0;
                float3 normal : TEXCOORD1;
            };
            //再从几何着色器变化过的数据传到片元着色器的结构      所以可以不用v2f 不过一个名字 想怎么取随便 自己别忘了就行
            struct g2f
            {
                float2 uv : TEXCOORD0;
                float4 posf : SV_POSITION;
            };

        //取代原本v2f 将顶点结构传入到结合着色器需要的结构中
            v2g  vert (a2v v)
            {
                v2g o = (v2g)0;
                o.pos = v.vertex;
                o.normal = v.normal;
                o.uvG = v.texcoord;
                
                return o;
            }

	//几何着色器 是在顶点着色器和片元着色器之间 vs 的输出作为gs的输入      vs 顶点着色器  gs 几何着色器
            //最大调用顶点数,三角形因为是三个顶点,因此最小输入3个顶点进入
			[maxvertexcount(3)]
			//输入 point line triangle lineadj triangleadj----输出: PointStream只显示点,LineStream只显示线,TriangleStream三角形
			void geom (triangle v2g input[3], inout LineStream<g2f> g)
			{
               
                //3个顶点 就要计算三次。 如果输入的是一个顶点 就计算一次  不用循环写三次也是可以的
                for (int i = 0; i<3; i++)
                {
                    g2f o = (g2f)0;
                    o.posf = input[i].pos+float4(input[i].normal,0)*_Offset1;
                    o.posf = UnityObjectToClipPos(o.posf);
                    o.uv = input[i].uvG;
                    g.Append(o);
                }
                
            }

            half4 frag (g2f i) : SV_Target
            {
                return _LineColor;
            }
            ENDCG
        }
        Pass
        {
        //输出三角形的pass
            NAME "Point PASS"
            CGPROGRAM
            #pragma vertex vert
            //几何着色器声明
            #pragma geometry geom
            #pragma fragment frag

            #include "UnityCG.cginc"
            
            float4 _PointColor;
            float _Offset2;

            struct a2v
            {
                float4 vertex : POSITION;
                float2 texcoord : TEXCOORD0;
                float3 normal : NORMAL;
            };
            //几何着色器需要传递的数据
            struct v2g 
            {
                float4 pos : POSITION;
                float2 uvG : TEXCOORD0;
                float3 normal : TEXCOORD1;
            };
            //再从几何着色器变化过的数据传到片元着色器的结构      所以可以不用v2f 不过一个名字 想怎么取随便 自己别忘了就行
            struct g2f
            {
                float2 uv : TEXCOORD0;
                float4 posf : SV_POSITION;
            };

        //取代原本v2f 将顶点结构传入到结合着色器需要的结构中
            v2g  vert (a2v v)
            {
                v2g o = (v2g)0;
                o.pos =v.vertex;
                o.normal = v.normal;
                o.uvG = v.texcoord;
                
                return o;
            }

	//几何着色器 是在顶点着色器和片元着色器之间 vs 的输出作为gs的输入      vs 顶点着色器  gs 几何着色器
            //最大调用顶点数,三角形因为是三个顶点,因此最小输入3个顶点进入
			[maxvertexcount(3)]
			//输入 point line triangle lineadj triangleadj----输出: PointStream只显示点,LineStream只显示线,TriangleStream三角形
			void geom (triangle v2g input[3], inout PointStream<g2f> g)
			{
                g2f o = (g2f)0;
                //3个顶点 就要计算三次。 如果输入的是一个顶点 就计算一次  不用循环写三次也是可以的
                for (int i = 0; i<3; i++)
                {
                    o.posf = input[i].pos+float4(input[i].normal,0)*_Offset2;
                    o.posf = UnityObjectToClipPos(o.posf);
                    o.uv = input[i].uvG;
                    g.Append(o);
                }
            }

            half4 frag (g2f i) : SV_Target
            {
                return _PointColor;
            }
            ENDCG
        }
    }
}

总结

还是有点问题 线段有几个线段不显示 回去再研究下。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值