Shader 할 부분 71 그림자 받은 아욱용 Shader

16543 단어 Unityshadertech

쉐더를 할 시간이 얼마 안 남았어요.


하마터면 Shader를 할 뻔했다.쉐더를 할 시간이 많지 않을 것 같아서요.
100부까지 열심히 하겠습니다.10년이 걸려도 돼요.
100편의 글을 배웠다면 초보자라도 이해할 수 있을 것 같아요.
이렇게 하는 거야.
※ 초보자는 필기 레벨로 기록
기술 보도로는 도움이 안 될 것 같습니다.

미리 준비하다


아래 참조
Shader 파트 1Unite 2017 애니메이션을 볼 때가 많지 않아요. (기초지식~종이 스크레이퍼로 색깔 바꾸기)

데모


계속해서 지난번 해바라기 보도.
【참조 링크】: Shader의 70번째 바이트용 Shader를 할 시간이 거의 없어요.
해바라기와 동시에 그림자를 떨어뜨려 보세요.

Shader 샘플


Shader "Custom/ShadowOcclusion"
{
    Properties
    {
        _ShadowIntensity ("Shadow Intensity", Range (0, 1)) = 0.6
    }

    SubShader
    {
        Pass
        {
            Tags
            {
                "Queue"="geometry-1"
                "LightMode" = "ForwardBase"
            }
            Blend SrcAlpha OneMinusSrcAlpha

            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #pragma multi_compile_fwdbase

            #include "UnityCG.cginc"
            #include "AutoLight.cginc"

            float4 _Color;
            float _ShadowIntensity;
            //グローバル変数
            float _ShadowDistance;

            struct appdata
            {
                float4 vertex:POSITION;
                float3 normal:NORMAL;
            };

            struct v2f
            {
                float4 pos : SV_POSITION;
                float3 worldNormal:TEXCOORD0;
                float3 worldPos : WORLD_POS;
                SHADOW_COORDS(1)
            };

            v2f vert(appdata v)
            {
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex);
                //影の計算のマクロ
                TRANSFER_SHADOW(o);
                //法線方向のベクトル
                o.worldNormal = UnityObjectToWorldNormal(v.normal);
                o.worldPos = mul(unity_ObjectToWorld, v.vertex);
                return o;
            }

            float4 frag(v2f i) : COLOR
            {
                // カメラとオブジェクトの距離(長さ)を取得
                // _WorldSpaceCameraPos:定義済の値 ワールド座標系のカメラの位置
                float cameraToObjLength = clamp(length(_WorldSpaceCameraPos - i.worldPos), 0, _ShadowDistance);
                //1つ目のライトのベクトルを正規化
                float3 L = normalize(_WorldSpaceLightPos0.xyz);
                //ワールド座標系の法線を正規化
                float3 N = normalize(i.worldNormal);
                //内積の結果が0以上なら1 この値を使って裏側の影は描画しない
                float front = step(0, dot(N, L));
                //影の場合0、それ以外は1
                float attenuation = SHADOW_ATTENUATION(i);
                //影の減衰率
                float fade = 1 - pow(cameraToObjLength / _ShadowDistance, _ShadowDistance);
                return float4(0, 0, 0, (1 - attenuation) * _ShadowIntensity * front * fade);
            }
            ENDCG
        }
    }
}
해바라기 처리 자체는 이전 문장과 같다.
수상 처리를 추기하고 있습니다.
단순히SHADOW_ATTENUATION음영을 주는 것만으로는 부족하다.
각도에 따라 터진 것처럼 보인다.

뒷면의 그림자가 필요 없기 때문에, 광선 벡터와 법선으로 내적을 계산한다
뒷면에 그림자를 그리지 않는 처리가 추가되었습니다.
//1つ目のライトのベクトルを正規化
float3 L = normalize(_WorldSpaceLightPos0.xyz);
//ワールド座標系の法線を正規化
float3 N = normalize(i.worldNormal);
//内積の結果が0以上なら1 この値を使って裏側の影は描画しない
float front = step(0, dot(N, L));
이외에 음영 거리가 쇠퇴한다는 표시도 추가했다.

【참조 링크】: Shader의 14부분 카메라의 거리를 측정하고 사용할 만한 차이는 거의 없다
BultitIn의 Shader에서 그림자를 받으면 그림자의 그리기 거리 설정에 따라 감쇠됩니다.
만약 아무것도 하지 않는다면, 아래 그림의 위쪽 그림처럼 선명하게 묘사할 것이다
일단 일정한 거리에 이르면 사라진다.
아래처럼 흐릿하게 사라지는 게 좋을 것 같아서요.

【인용원】: Shadow distance rendering in a custom shader

Shader.SetGlobalFloat


따라서 "QualitySettings 그림자의 그리기 거리"를 Shader에 반영하는 기법을 사용했다.Shader.SetGlobalFloat를 사용하여 C#에서 지정한 이름과 동일한 Shader 내의 변수를 균일하게 변경할 수 있습니다.
Shader 버전의 글로벌 변수 같은 인상.

C# 스크립트


using UnityEngine;

/// <summary>
/// 影の描画距離をShaderのグローバル変数で設定する
/// </summary>
[ExecuteAlways]
public class SetShadowDistance : MonoBehaviour
{
    private void Start()
    {
        Shader.SetGlobalFloat("_ShadowDistance",QualitySettings.shadowDistance); 
    }

    void Update()
    {
        //設定値をリアルタイムに反映するのはEditor上だけで良い
        if(!Application.isEditor) return;
        Shader.SetGlobalFloat("_ShadowDistance",QualitySettings.shadowDistance); 
    }
}

참조 링크


Unity에 Shader의 글로벌 변수가 있음
QualitySettings.shadowDistance
[AR Foundation] 모델에 섀도우를 넣습니다.
[Unity] 그림자만 비치는 바닥을 준비하고 바닥 아래를 보지 마세요.
AR로 섀도우 그리기(섀도우의 섀도우만 렌더링)

좋은 웹페이지 즐겨찾기