shader에서 Unity 음영의 실현 이념을 말씀드리겠습니다.
현실에서 그늘은 어떻게 나오나요?빛이 어느 방향으로 비치는데 일부분이 앞의 물체를 비추어 뒤의 물체에 밝기가 차이가 난다.밝기가 낮은 곳은 우리가 음영으로 간주한다.
음영이 없다는 것은 빛만 있다고 할 수 있다. 물체 표면의 빛이 정확하기만 하면 음영은 자연히 나온다.
3D 세계의 그림자를 처음 접했을 때, 나는 빛이 이미 계산되지 않았느냐고 생각했다.그럼 그림자가 저절로 나타날 거예요.그러나 실제로Unity에서 물체의 빛을 계산할 때 우리는 빛이 어디든지 비출 수 있다고 생각한다.예를 들어 난반사:
fixed3 diffuse = _LightColor0.rgb * saturate(dot(lightDir, i.worldNormal)) * albedo;
여기
_LightColor0
는 빛이 비추는 것이기 때문에 우리는 어떠한 판단도 하지 않았다. 언제_LightColor0
가 없으면 가져오면 된다.현실과 같은 논리에 따라 음영을 계산하려면 빛이 언제 없는지, 즉 현재의 기초 위에서 감법을 판단해야 한다.그러나 실제로는 이렇게 하는 것이 아니라 덧셈을 하는 것이다.
이념1: 음영을 특수한 빛으로 보고 원래의 물체 표면을 덮는다.
만약 네가 컴퓨터로 그림을 그렸다면 쉽게 이해할 수 있을 것이다. 그림을 그릴 때 한 부분에 음영을 주는 방법은 새로 도층을 열어 원색의 도층 위에 놓은 다음에 정편 접는 모드로 설정하면 이 도층은 회색으로 그리면 음영의 효과를 얻을 수 있다.정판 레이어드는 사실 색깔 레이어드입니다. 한 색깔 위에 회색을 레이어드하고 원색의 성질을 유지하면 어두워지고 음영 효과와 부합됩니다.
코드로 설명하기
color x = (a,b,c); //rgb a b c
color shadow = (0.9, 0.9, 0.9); // , [0,1]
color y = x * shadow = (a * 0.9, b * 0.9 , c * 0.9); //
이렇게 하면 남은 문제는 그곳에 음영이라는 특수한 빛을 찾아서 물체의 색깔을 계산할 때 곱셈을 하면 된다는 것이다.
어떤 부분에 그늘이 있을까요?먼저 한 묶음의 빛을 보고 위치 A와 B가 같은 묶음의 빛 안에 있다고 가정하면 뒤에 있는 사람이 그늘이 있다.꼬치 구이의 모습을 상상할 수 있다. 첫 번째 빛만 있고 뒤에 있는 것은 모두 그늘에 있다.
그래서 만약에 내가 데이터 테이블을 만들어서 광원의 모든 방향이 첫 번째로 비친 위치를 기록할 수 있다면.그러면 새로운 위치 A에 대해 이 데이터 표에서 같은 빛의 첫 번째 위치 B를 찾을 수 있다. 만약에 A가 B보다 가깝다면 A는 이 빛의 첫 번째 비친 곳이 되고 A는 그늘이 없고 반대로 A가 그늘에 있다.
한 광원에 대해 말하자면 나는 이런 데이터 테이블을 유지하기만 하면 음영의 문제를 해결할 수 있다. 이 데이터 테이블은 바로 음영이 무늬를 비추는 것이다.무늬와 같은 것은 바로 당신이 xy 좌표를 주면 특정한 값을 되돌려준다. 여기서 이 xy 좌표는 이 빛을 포지셔닝하는 좌표이고 되돌아오는 값은 음영의 색깔이다. 예를 들어(0.9,0.9,0.9).
이 논리는 사실 깊은 무늬와 유사하다.
이념 2: 그림자를 사용하여 무늬를 비추다
그러면 문제는 어떻게 한 묶음의 빛을 포지셔닝하는가로 바뀌었다.해결 방안은 광원 자체의 좌표 체계(즉 광원 공간)를 구축하는 것이다. 이 좌표계의 xy 위치는 모든 빛을 포지셔닝하는 데 쓰인다.
광원 공간을 어떻게 정의하는지에 대해 다음은 나의 추측이다.
예를 들어 평행광에 대해 평행광은 광원 위치 개념이 없고 방향만 있다.그러면 나는 빛이 비치는 방향을 Z축으로 하고 빛이 비치는 방향과 수직의 면을 xy축 평면으로 설정한다.그러면 xy값으로 한 묶음의 빛을 정할 수 있는 건가요?내 생각엔 그래.두 점이 만약 xy값이 같다면, 그들은 틀림없이 같은 빛 속에 있을 것이다. 왜냐하면 Z축 방향은 빛의 방향이기 때문이다.
점광원에 대해 빛은 구형으로 발산된다.빛의 방향은 변화한다.그러면 xy축은 어떻게 해야 합니까?3D 도형 공간 변환의 일부분은 정점을 카메라 공간에서 재단 공간으로 바꾸는 것이다. 즉, 카메라의 유시추체를 xyz로 바꾸는 것은 모두 [-1,1] 범위의 입방체이다.그러면 광원은 여기서도 마찬가지로 이런 변환 수단을 사용할 수 있다. 단지 이때는 360도의 시각이다.
발산하고 만약에 빛이 모퉁이를 돌 수 있다면 xy평면은 빛의 한 평면에 수직으로 있다. 이 평면은 울퉁불퉁한 면일 수 있다. 이 울퉁불퉁한 면을 평면으로 펼치면 된다. 울퉁불퉁한 모형 표면의 무늬 좌표와 같다.이런 단면은 하나만 있으면 된다. 예를 들어 광원 자체를 포함하는 면을 취하면 된다.
하나의 점 A에 대해 이 단면에 있지 않으면 빛의 회류를 따라 같은 빛의 xy 단면의 점 B를 찾을 수 있다. 이 점 B와 A는 같은 xy 값을 가지고 있다.
(갑자기 유체 분석에 이런 생각을 썼는지 어렴풋이 생각난다.)
이념3: 광원 공간에서 모든 빛을 포지셔닝한다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.