[Unity] 서피스 면도기와 세그먼트 면도기의 차이점을 쉽게 정리했습니다.

8237 단어 ShaderLabUnity

개시하다


Unity 면도기에 대한 이해를 높이기 위해 서피스 면도기와 세그먼트 면도기의 차이점을 간략하게 정리했습니다.

Surface 및 부스러기 페이지


서피스 면도기


서피스 면도기를 사용하면 조명과 섀도우를 고려한 면도기를 간단하게 쓸 수 있다.

정점 농담기


복잡한 일을 하려면 이 컨실러를 사용하세요.
이것은 서피스 면도기보다 코드가 더 복잡합니다.
Unlit 면도기와 ImageEffect 면도기가 여기에 포함되어 있습니다.

양자 의 작법 이 다르다


필자는 이 면도기들이 어떤 차이가 있는지 잘 몰라서 자신의 방식에 따라 간단하게 작법의 차이를 총결하였다.

주요 차이점


구체적으로는 다음과 같다.다른 것도 있을지도 몰라요.
・번역 지도의 작법이 다르다
• 패스 블록 유무
구조체 데이터의 쓰기 방식이 다르다
・vertex 은폐 함수 없음
・vertex 농담 함수 쓰기의 차이
세션 차폐 함수의 쓰기 방식이 다르다
• 쓰기의 기술 방법의 차이

편역 지도의 작법이 다르다



서피스 면도기의 경우


아래의 작법은 다음과 같다.
디렉토리를 컴파일하는 쓰기 방법 중 하나
#pragma surface surf Standard fullforwardshadows vertex vert
편역한 문법의 2
#pragma surface surf Standard fullforwardshadows
#pragma vertex vert
서피스 농담자에서는 농담 함수를 지정할 때 조명 모델을 지정해야 합니다.
샘플 중 Standard는 조명 모형입니다.
참조: https://docs.unity3d.com/jp/540/Manual/SL-SurfaceShaders.html

세그먼트 마스크의 경우


아래의 작법은 다음과 같다.
디렉토리를 컴파일하는 방법
#pragma vertex vert
#pragma fragment frag
참조: https://docs.unity3d.com/jp/540/Manual/SL-ShaderPrograms.html

패스 블록 유무


서피스 면도기의 경우


• 패스를 쓸 줄 모른다

세그먼트 마스크의 경우


· 패스를 써야 합니다
• 다중 패스 기술 가능
참조: https://docs.unity3d.com/jp/540/Manual/SL-Pass.html

구조체 데이터의 쓰기 방법이 다르다


서피스 면도기의 경우


밑글씨
구조 데이터의 설명
struct Input {
  float2 uv_MainTex;
  float2 uv_BumpMap;
};
참조: https://docs.unity3d.com/jp/540/Manual/SL-SurfaceShaders.html

세그먼트 마스크의 경우


밑글씨
구조 데이터의 설명
struct v2f {
    half3 worldRefl : TEXCOORD0;
    float4 pos : SV_POSITION;
};
그런 의미를 써야 한다.
참조: https://docs.unity3d.com/jp/540/Manual/SL-VertexFragmentShaderExamples.html

vertex 음영 함수 유무


서피스 면도기의 경우


vertex 그림자 함수 안 써도 돼요.

세그먼트 마스크의 경우


vertex 그림자 함수 쓰기

vertex 음영 함수 쓰기


서피스 면도기의 경우


밑글씨
vertex 음영 함수 쓰기
void vert (inout appdata_full v) {
    v.vertex.xyz += v.normal * _Amount;
}
vertex 음영 함수 쓰기 2
void myvert (inout appdata_full v, out Input data)
{
    UNITY_INITIALIZE_OUTPUT(Input,data);
    float4 hpos = UnityObjectToClipPos(v.vertex);
    hpos.xy/=hpos.w;
    data.fog = min (1, dot (hpos.xy, hpos.xy)*0.5);
}
가장 큰 특징은 계산 결과를 구조 데이터에 저장하는 것이다.
참조: https://docs.unity3d.com/Manual/SL-SurfaceShaderExamples.html

세그먼트 마스크의 경우


아래의 작법은 다음과 같다.
vertex 음영 함수 쓰기
v2f vert (appdata v)
{
    v2f o;
    o.vertex = UnityObjectToClipPos(v.vertex);
    o.uv = TRANSFORM_TEX(v.uv, _MainTex);
    UNITY_TRANSFER_FOG(o,o.vertex);
    return o;
}
vertex 음영 함수 쓰기 2
v2f vert (float4 vertex : POSITION, float3 normal : NORMAL)
{
    v2f o;
    o.pos = UnityObjectToClipPos(vertex);
    o.worldPos = mul(_Object2World, vertex).xyz;
    o.worldNormal = UnityObjectToWorldNormal(normal);
    return o;
}
계산 결과를 구조 데이터로 되돌려 주는 것이 가장 큰 특징이다.
참조: https://docs.unity3d.com/Manual/SL-VertexFragmentShaderExamples.html

서버 면도기 함수


서피스 면도기의 경우


서버 면도기 함수 쓰기 1
void surf (Input IN, inout SurfaceOutput o) {
    o.Albedo = tex2D (_MainTex, IN.uv_MainTex).rgb;
}
서버 면도기 함수 쓰기 2
void surf (Input IN, inout SurfaceOutput o) {
    clip (frac((IN.worldPos.y+IN.worldPos.z*0.1) * 5) - 0.5);
    o.Albedo = tex2D (_MainTex, IN.uv_MainTex).rgb;
    o.Normal = UnpackNormal (tex2D (_BumpMap, IN.uv_BumpMap));
}
계산 결과를 구조 데이터에 저장하는 것이 특징이다.
참조: https://docs.unity3d.com/Manual/SL-SurfaceShaderExamples.html

세그먼트 마스크의 경우


세션 차폐 함수의 쓰기 1
fixed4 frag (v2f i) : SV_Target
{
    fixed4 col = tex2D(_MainTex, i.uv);
    col *= i.diff;
    return col;
}
세션 차폐 함수의 문법 2
fixed4 frag (v2f i) : SV_Target
{
    fixed4 col = tex2D(_MainTex, i.uv);
    fixed shadow = SHADOW_ATTENUATION(i);
    fixed3 lighting = i.diff * shadow + i.ambient;
    col.rgb *= lighting;
    return col;
}
계산 결과를 컬러 값으로 복원하는 것이 특징이다.
참조: https://docs.unity3d.com/Manual/SL-VertexFragmentShaderExamples.html

작문 묘사 방법의 차이


서피스 면도기의 경우


다음 매개 변수만 지정하면 기록을 기술할 수 있습니다.
서피스 차광기의 조명 예
#pragma surface surf SimpleLambert

half4 LightingSimpleLambert (SurfaceOutput s, half3 lightDir, half atten) {
    half NdotL = dot (s.Normal, lightDir);
    half4 c;
    c.rgb = s.Albedo * _LightColor0.rgb * (NdotL * atten);
    c.a = s.Alpha;
    return c;
}
참조: https://docs.unity3d.com/jp/540/Manual/SL-SurfaceShaderLightingExamples.html

세그먼트 마스크의 경우


스스로 글을 쓰고 처리해야 한다.
참조: https://docs.unity3d.com/ja/540/Manual/SL-VertexFragmentShaderExamples.html

기타


apdata 정보


apdata의 공식 이름은 Application to Vertex Shader Structure인 것 같습니다.
참조: http://wiki.unity3d.com/index.php?title=Shader_Code#Application_to_Vertex_Shader_Structure_.28appdata.29

v2f 정보


v2f의 정식 이름은 Vertex Shader to Fragment Shader Structure인 것 같습니다.
참조: http://wiki.unity3d.com/index.php?title=Shader_Code#Vertex_Shader_to_Fragment_Shader_Structure_.28v2f.29

최후


필자는 면도기에 대한 지식이 천박해서 잘못된 점이 있을 수 있다.
만약 잘못을 발견하면 저에게 알려 주세요.

참조 링크


유닛 마스크의 기초를 배워봤기 때문에 열의를 가지고 정리를 해봤습니다.
http://tips.hecomi.com/entry/2014/03/16/233943
Shader Code - Unify Community Wiki
http://wiki.unity3d.com/index.php?title=Shader_Code#Application_to_Vertex_Shader_Structure_.28appdata.29
[Unity] Vertex/Fragment shader에 일반적인 조명과 음영을 적용한 샘플
http://qiita.com/edo_m18/items/ee4b9018e860c11199b0

좋은 웹페이지 즐겨찾기