时间:2025-08-14 15:22
人气:
作者:admin
【从UnityURP开始探索游戏渲染】专栏-直达
#pragma geometry geom。Shader基础结构:
hlsl
Shader "Custom/URPGeoShader" {
Properties { _Extrude("Extrude", Float) = 0.1 }
SubShader {
Pass {
HLSLPROGRAM
#pragma vertex vert
#pragma geometry geom
#pragma fragment frag
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
struct v2g {
float4 posOS : TEXCOORD0;
float3 normalOS : NORMAL;
};
struct g2f {
float4 posCS : SV_POSITION;
float3 normalWS : TEXCOORD0;
};
[maxvertexcount(6)]
void geom(triangle v2g input[3], inout TriangleStream<g2f> stream) {
// 几何处理逻辑
}
ENDHLSL
}
}
}
关键参数说明:
hlsl
void geom(triangle v2g input[3], inout TriangleStream<g2f> stream) {
float3 center = (input[0].posOS + input[1].posOS + input[2].posOS) / 3;
for(int i=0; i<3; i++) {
g2f o;
o.posCS = UnityObjectToClipPos(center);
stream.Append(o);
o.posCS = UnityObjectToClipPos(input[i].posOS);
stream.Append(o);
o.posCS = UnityObjectToClipPos(input[(i+1)%3].posOS);
stream.Append(o);
stream.RestartStrip();
}
}
hlsl
[maxvertexcount(6)]
void geom(triangle v2g input[3], inout TriangleStream<g2f> stream) {
// 原始三角形
for(int i=0; i<3; i++) {
g2f o;
o.posCS = UnityObjectToClipPos(input[i].posOS);
stream.Append(o);
}
stream.RestartStrip();
// 外扩轮廓
float extrude = _Extrude;
for(int i=0; i<3; i++) {
g2f o;
float4 offset = float4(input[i].normalOS * extrude, 0);
o.posCS = UnityObjectToClipPos(input[i].posOS + offset);
stream.Append(o);
}
}
【从UnityURP开始探索游戏渲染】专栏-直达
(欢迎点赞留言探讨,更多人加入进来能更加完善这个探索的过程,????)