거의 Shader 파트 22 Skybox에서 태양 시뮬레이션을 했어요.

11827 단어 Unityshadertech

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


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

미리 준비하다


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

데모


계산 공식에서 유사한 태양을 나타냈다.

이번에는 다음과 같은 기사의 뜻을 이해하기 위해 노력했다.
【참조 링크】: [Unity] 스카이박스 면도기 쓰는 법.

Shader 샘플


Shader "Custom/SunSky"
{
   Properties {
        _BGColor ("Background Color", Color) = (0.05, 0.9, 1, 1)
        _SunColor ("Color", Color) = (1, 0.8, 0.5, 1)
        _SunDir ("Sun Direction", Vector) = (0, 0.5, 1, 0)
        _SunStrength("Sun Strengh", Range(0, 200)) = 30
    }
    SubShader
    {
        Tags
        {
            "RenderType"="Background" //最背面に描画するのでBackground
            "Queue"="Background" //最背面に描画するのでBackground
            "PreviewType"="SkyBox" //設定すればマテリアルのプレビューがスカイボックスになるらしい
        }

        Pass
        {
            ZWrite Off //常に最背面に描画するので深度情報の書き込み不要

            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"

            fixed3 _BGColor;
            fixed3 _SunColor;
            float3 _SunDir;
            float _SunStrength;

            struct appdata
            {
                float4 vertex : POSITION;
                float3 uv : TEXCOORD0;
            };

            struct v2f
            {
                float4 vertex : SV_POSITION;
                float3 uv : TEXCOORD0;
            };

            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = v.uv;
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                float3 dir = normalize(_SunDir); //太陽の位置ベクトル正規化
                float angle = dot(dir, i.uv); //太陽の位置ベクトル と 描画されるピクセルの位置ベクトル の内積
                //pow(x,y)はxをy乗する 
                //0 < max(0, angle) < 1 なので _SunStrengthを大きくするほど計算結果は0に近づく
                fixed3 c = _BGColor + _SunColor * pow(max(0, angle), _SunStrength);
                return fixed4(c, 1);
            }
            ENDCG
        }
    }
}

도해는 내적 계산의 아래와 같다.
각 픽셀에 대해 다음과 같은 계산을 통해 태양을 시뮬레이션한다.

태양의 색은 덧셈이기 때문에 짙은 색으로 반영하고 싶다면 아래와 같다
Lerp로 계산하면 색상을 혼합하지 않고 계산할 수 있습니다.
//pow(x,y)はxをy乗する
//0 < max(0, angle) < 1 なので _SunStrengthを大きくするほど計算結果は0に近づく
fixed3 c = lerp(_BGColor,_SunColor,pow(max(0, angle), _SunStrength));

pow


듣자니 Pow(x, y)는 x의 y승을 돌려주었다고 한다.
만약 x가 소수라면 y가 클수록 되돌아오는 값도 작다.

ZWrite


깊이 정보를 픽셀 단위로 저장하는 버퍼를 켜거나 끌 수 있습니다.
켜면 각 픽셀이 Z 버퍼를 유지합니다.
새로 그린 픽셀의 깊이 값을 비교합니다.
비교한 결과, 앞에 표시된 것은 깊이가 비교적 작은 픽셀이다.
이것은Zバッファ法(デプスバッファ法)의 방법이다
깊이 정보를 픽셀 단위로 저장하여 전후 관계를 정확하게 그릴 수 있습니다.
【참조 링크】: Z 버퍼(깊이 버퍼)
스카이박스는 항상 맨 뒤에 그려요.
앞뒤 깊이 정보를 지정할 필요는 없고 Que의 그리기 순서만으로도 충분합니다.

참조 링크


Unity Shader에서 배우는 세 가지
[Unity(C#)] 레이가 아닌 내적(Vector3.Dot)을 통한 시선판정
GLSL에 대한 노트
ShaderLab culling and depth testing

좋은 웹페이지 즐겨찾기