분류 전체보기(94)
-
커스텀 라이팅2
Tags {"LightMode" = "ForwardBase"} 이것의 의미는 이 패스를 포워드 렌더러의 첫 번째 라이트 패스로 사용하겠다는 것이다. ForwardBase 패스가 오직 하나라면 첫 번째 빛을 제외한 다른 빛은 최종 결과에 영향을 미치지 않을 것이다. 만약 다른 빛도 영향을 주길 원한다면 또 다른 패스를 추가하고 그것의 태그를 다음과 같이 바꾼다. Tags {"LightMode" = "ForwardAdd"} #include "UnityLightingCommon.cginc" UnityLightingCommon.cginc는 라이팅 셰이더에 필요한 많은 유용한 변수 및 함수들이 담긴 파일이다. 커스텀 라이팅을 할때 주의해야 할 점은 노멀 벡터와 빛의 방향 벡터의 좌표 공간을 일치시켜야 한다. 생각..
2022.07.17 -
커스텀 라이팅
가장 간단하고 "옛날 비디오 게임 st" 처럼 보이는 간단하고 단순한 라이팅에 대해서 배워볼것이다. 셰이더가 발전해온 변천사를 이해하는데도 도움을 줄것이다. 라이팅 계산시에 각기 다른 부분을 지칭하는데 사용한 며가지 용어들이 존재했었다. 디퓨즈(Diffuse) : 불규칙한 미세면을 가진 표면의 부분집합이다. 다양한 방향으로 빛을 반사한다. 스펙큘러(Specular) : 정렬된 미세면을 가진 표면의 부분집합이다. 비슷한 방향으로 빛을 반사한다. 엠비언트(Ambient) : 씬 안에서의 최소 빛의 강도다. 따라서 빛이 전혀 도달하지 않는 곳이라 해도 단순 검정색이 되지 않게 한다. 근사란? 근사(Approximation)라는 것은 값이나 수량이 거의 가깝지만 정확한 것이 아님을 의미한다. 여기에서의 근사란 ..
2022.07.17 -
좌표 공간
좌표 공간에는 여섯 가지 좌표 공간을 다룰 것이다. 객체공간(Object Space), 월드 공간(World Space), 카메라 공간(Camera Space), 절단 공간(Clip Space), 정규 디바이스 좌표(Normalized Device Coordinates), 스크린 공간(Screen Space) 이 여섯 가지는 부분의 그래픽스 파이프라인 안에서 사용하는 순서다. 정점 셰이더에 전달하는 데이터는 객체 공간 기준이다. 데이터 중 일부는 월드 공간으로 변환돼야 한다.(라이팅 계산에서 사용된다.) 또 다른 데이터들은 카메라 공간으로 변환될 것이고 결국에는 절단 공간 등으로 변환될 것이다.(정점 위치) 객체 공간(Object Space) 객체 공간은 3D 좌표체계로 원점은 주로 입력 조립 단계에서 ..
2022.07.10 -
정점 색상 지원
기본적으로 정점과 함께 보간을 수행하는 레스터라이저에 전달할 또 다른 값을 전달한다. Appdata에 추가하기 appdata에 메시 정점 색상을 채울 멤버를 추가하려면 멤버의 이름과 시맨틱에 주의해야 한다. 권장하는 방법은 멤버의 이름을 color로 하고 COLOR 시맨틱을 추가하는것이다. 플랫폼에 따라 변수 이름을 다르게 하고 시맨틱 이름만을 COLOR로 하는 경우 제대로 동작하지 않을 수도 있다. 정점 색상 멤버 변수를 추가한 후 이 구조체의 모습은 다음과 같다. struct appdata { float4 vertex : POSITION; float4 color : COLOR; } v2f에 추가하기 v2f에 정확히 동일한 멤버 변수를 추가해야한다. struct v2f { float4 vertex : ..
2022.07.10 -
프레그먼트 데이터 구조체 & 프레그먼트 함수
v2f 데이터 구조체에 어떤 멤버를 추가하느냐는 정점 셰이더에서 전달받은 데이터 중 어떤 데이터를 전달할 수 있는지를 결정한다. [프레그먼트 데이터 구조체] struct v2f { float4 vertex : SV_POSITION; } 프레그먼트 함수 프로그래밍 가능한 단계 , 프레그먼트 셰이딩이다. 이 단계에서는 프레그먼트 셰이더가 각각의 프레그먼트마다 실행된다. [간단한 예시코드] float4 frag (v2f i) : SV_Target { return _Color; }
2022.07.10 -
정점 함수
프로그래밍 가능한 정점단계. 정점 셰이더 함수가 실행된다. 이 함수는 appdata 데이터 구조체를 인자로 하고 두 번째 데이터 구조체인 v2f를 반환한다. v2f vert(appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); return o; } 정점 좌표 공간에서 레스터라이저가 사용하는 좌표 공간으로 변환한다. 이것을 UnityObjectToClipPos함수가 수행한다.
2022.07.10