거의 Shader 파트 22 Skybox에서 태양 시뮬레이션을 했어요.
쉐더를 할 시간이 얼마 안 남았어요.
하마터면 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
Reference
이 문제에 관하여(거의 Shader 파트 22 Skybox에서 태양 시뮬레이션을 했어요.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/kento_o/articles/1fa52e508edea7ad7648텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)