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
}
}
}
(自用)learnOpenGL学习总结-高级OpenGL-几何着色器
2024-03-21 21:58:02 54 阅读