개발/쉐이더 - 랜더몽키 (3)
2일차 - 라이팅

필요한 변수
world,view,projection(mvp) 메트릭스!   ,[필요시] [디퓨즈 컬러 ,스페큘러컬러,shiness]
빛 위치,카메라 위치(월드좌표계) ( 뷰좌표계에서 계산할거면 뷰에서 해도됨)

 

버텍스 인풋값
버텍스 포지션 , 노말 , uv좌표 저장할 변수

픽셀 인풋값
픽셀 포지션,uv좌표 저장할 변수,디퓨즈 rgb,viewDir,reflection[노멀라이즈안한거], _shiness[필요시]

버텍스 쉐이더에서 해야할거

1.포지션에 mvp 곱하기 ( 프로젝션 좌표계로 전환하기)
2.월드 좌표계에서 빛계산 (view에서 해도됨)
3.월드에서 할 시 생성해야할 변수
-worldNormal,worldPosition(좌표계 곱하기 전에 계산해도됨)
4.liightDir,viewDir,reflection 선언후 정의하기

( 월드좌표계시)

lightDir = normalize(worldPosition.xyz-lightWorldPosition.xyz);

viewDir = normalize(worldPosition.xyz-cameraWorldPosition.xyz);

reflection = reflect(lightDir,worldNormal);
5.디퓨즈값 계산하기
ndot( 빛의 밝기 ) = dot(lightDir,worldNormal);
Output.mDiffuse = ndot * diffuseColor[필요시];//안하면 float3(ndot,ndot,ndot);
6.반환


픽셀쉐이더에서 해야할거
전역변수
sampler2D DiffuseSampler(텍스처이미지)
픽셀쉐이더 인풋값
Position (포지션)
mTexCoord : TEXCOOR


 

전역변수는 이렇게 지정해주자.

 

버텍스의 인풋정보는 Stream Mapping을 더블클릭하면 되고,

정보를 위처럼 해주자.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
float4x4 gWorldMatrix;
float4x4 gViewMatrix;
float4x4 gProjectionMatrix;
float3 diffuseColor;// 컬러값
 
float4 gWorldLightPosition;
float4 gWorldCameraPosition;
 
struct VS_INPUT 
{
   float4 Position : POSITION0;
   float3 Normal : NORMAL0;
   float2 mTexCoord : TEXCOORD0;
   
};
 
struct VS_OUTPUT 
{
   float4 Position : POSITION0;
   float2 mTexCoord : TEXCOORD0;
   float3 mDiffuse : TEXCOORD1;
   float3 mViewDir : TEXCOORD2; 
   float3 mReflection : TEXCOORD3;
};
 
VS_OUTPUT vs_main( VS_INPUT Input )
{
   VS_OUTPUT Output;
 
   Output.Position = mul( Input.Position, gWorldMatrix );
   Output.mTexCoord = Input.mTexCoord;
   
   float3 worldNormal = mul(Input.Normal.xyz, gWorldMatrix);
   
   float3 lightDir = normalize(Output.Position.xyz-gWorldLightPosition.xyz);
   
   
   float3 viewDir = normalize(Output.Position.xyz-gWorldCameraPosition.xyz);
   Output.mViewDir =viewDir;
   
   Output.Position = mul( Output.Position, gViewMatrix );
   Output.Position = mul( Output.Position, gProjectionMatrix );
   
   float ndot = dot(-lightDir,worldNormal);
   Output.mDiffuse = saturate(diffuseColor);
   
   Output.mViewDir =viewDir;
   Output.mReflection =reflect(viewDir,worldNormal);
   return( Output );
   
}
 
 
 
 
cs

버택스 쉐이더

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
sampler2D DiffuseSampler;
struct PS_INPUT
{
   float4 Position : POSITION0;
   float2 mTexCoord : TEXCOORD0;
   float3 mDiffuse : TEXCOORD1; // 밝기만 전달할거 일단.
   float3 mViewDir : TEXCOORD2; // 
   float3 mReflection : TEXCOORD3;
};
float4 ps_main(PS_INPUT Input) : COLOR0
{  
   
   float3 diffuseColor = Input.mDiffuse;//엠비언트 포함
   
   
   float _shiness = 30.0f;
   float3 specColor =0;
   float3 viewDir = normalize(Input.mViewDir);
   float3 reflection = normalize(Input.mReflection); //여기서 다시 노멀라이즈 해주는 이유는 보간기를 거치면서 흐트러질수 있기때문에!
   if(diffuseColor.x >0)
   {
      float specNdot = saturate(dot( reflection , -viewDir));
      specColor = pow(specNdot,_shiness);
   }
   
   
   float4 albedo = tex2D(DiffuseSampler , Input.mTexCoord);
   
   return float4(albedo.rgb*diffuseColor.xyz+specColor.rgb,albedo.a);
   //return float4(specColor.rgb,albedo.a);
}
 
 
 
 
cs

픽셀 쉐이더

 

 

결과

'개발 > 쉐이더 - 랜더몽키' 카테고리의 다른 글

1일차 - 텍스처매핑  (0) 2020.06.09
1일차 - 렌더몽키 툴알기  (0) 2020.06.09
  Comments,     Trackbacks
1일차 - 텍스처매핑

공부한 걸 정리하는 블로그이므로 모르는 사람은 모를 가능성이 높습니다.

알려주는 블로그가 아님

 

 

각 버텍스(정점)들은 자신들이 표현한 폴리곤에 텍스처를 입히기 위해 uv좌표를 가지고 있음

 

UV좌표  표현법

백분율 (0~1)

 

각 엔진의 표현법

출처 : https://m.blog.naver.com/PostView.nhn?blogId=mo_n23&logNo=221475468651&proxyReferer=https:%2F%2Fwww.google.com%2F

 

 

그리고 이 UV좌표를 넘어갔을때 (만약 오른쪽부분이 (2,0) , (2,1)일때)

반복됨

자세한 내용

https://woodorl.tistory.com/41

 

내가 이해한 내용

정점 uv좌표 :  uv맵에서의 좌표 * 말 어렵게 써놓은덴 이유가 잇음 아래 uv맵 보면 이해됨

픽셀 uv좌표 : 해당 폴리곤을 이루는 정점의 uv좌표를 보간기를 통해 픽셀의 uv좌표를 픽셀에게 전달해줌

uv : 1:1 비율의 텍스처 이고 안에는 u,v,w 값이 들어있다 

w값은 특수한 상황에만 쓰이고 주로  u(r)와 v(g)만 쓰임

 

여기서 정점은 uv 맵의 좌표를 가지고 있다고 했다

그리고 uv는 이렇게 R채널과 G채널로 이루어져있는데

이는 uv맵의 특정 좌표의 R의 값과 G의 값이 텍스처의 백분율(좌표)을 의미하는 것이기때문

Unity로 잠시 넘어와서,이렇게 해준다면? uv 맵은 반복되기 때문에

[uv1 변수가 우리가 만들 uv맵이고 , IN.uv_MainTex 는 기본적인 uv맵(바로 위에있는 사진의 uv맵) 이다]

수직으로 6개가 된다

uv 맵으로 어떻게 표현되는지 나는 알기땜에 넘어감

 

UV맵과 정확한 정의에 대해선 여기까지하고

 

랜더몽키에서 텍스쳐를 표현하려면 이렇게하면된다.

1.Texture 추가

2.텍스처 오브젝트 추가

3.텍스처랑 텍스처 오브젝트의 속성이랑 이름 같게하기

4.텍스처 오브젝트랑 픽셀 쉐이더 전역변수 이름 같게하고 구조체랑 main 매개변수 바꾸기 + tex2D(텍스처전역변수이름, Input.mTexCoord)

참고로 Inpt.mTexCoord가 픽셀의 uv좌표

5.버텍스 쉐이더도 고쳐주기

Ouput.mTexCoord가 정점의 uv좌표이고 픽셀의 uv좌표를 정할때 쓰임 

 

우왕

'개발 > 쉐이더 - 랜더몽키' 카테고리의 다른 글

2일차 - 라이팅  (7) 2020.06.13
1일차 - 렌더몽키 툴알기  (0) 2020.06.09
  Comments,     Trackbacks
1일차 - 렌더몽키 툴알기

공부한 걸 정리하는 블로그이므로 모르는 사람은 모를 가능성이 높습니다.

알려주는 블로그가 아님

 

 

다운받고 나서 저거 누르면 DirectX전용 쉐이더를 만들 수 있다.

얘는 전역변수임

Pass0에 버텍스 쉐이더 켜보면 위에 선언되있고 코드에 선언된 값이 workspace에 있는 matViewProjection으로 정해지는거

 

DirectX에서 쉐이더 랜더링할때 매개변수로 값 넣어주듯이 ㅇㅇ

 

그러니 일단 저 matViewProjection을 삭제할거

 

(공부해야하니까)

 

좌표계를 표현할떄 버텍스쉐이더에서 모델의 버텍스에 world , view , projection 메트릭스를 곱하는건 알거임

 

 

그래서 값을 선언하고 곱해주고

넣어줄 값도 추가해주면 

나옴

'개발 > 쉐이더 - 랜더몽키' 카테고리의 다른 글

2일차 - 라이팅  (7) 2020.06.13
1일차 - 텍스처매핑  (0) 2020.06.09
  Comments,     Trackbacks