전체 글 (46)
Baked GI? GI?

GI : Global Illumination 이고,
광원에서 직접 표면에 닿는 빛에 국한하지 않고 다른 표면(간접 조명)으로 빛이 표면에 반사되는 방식을 모델링하는 시스템이다.


Baked GI
Baked GI는 베이크 / 사전 계산의 정적 객체에만 이 기능을 제한하고 있다 이동하는 객체는 다른 객체로 빛을 반사할 수 없으며 그 반대도 마찬가지다. 그러다 라이트 프루브를 이용하여 정적 오브젝트에서 바운스 라이트를 계속 가져올 수 있다. 런타임시 비 정적 오브젝트가 정적 오브젝트가 반사한 빛을 가질 수 있다. 즉, 흰 벽옆에 붉은 공이 있으면 흰 벽에 색이 번지지 않지만 흰 공옆에 붉은 벽이 있으면 흰 공에 색이 번진다.

 

왼쪽의 빨간색 Plane은 Emission으로 빨간색 빛을 방출한다.

오른쪽의 랜더몽키는 static이고 ( emssion의 영향을 받음 )

왼쪽의 랜더몽키는 static이 아니다 ( emssion의 영향을 받지 않음 )

하지만 lightProbe를 사용한다면?? static이 아니어도 emission이 방출한 빛의 영향을 받는 걸 확인할 수 있다.

 

참고로 이 랜더몽키는 저번에 제작한 이 멀티라이팅 툰 쉐이더를 사용한 랜더몽키이다.

 

Baked GI의 영향을 받기위해 Ambient에서 이 값을 참조한다.

Add의 B는 쉐이더의 fragment 색깔 값이다.

원래는 여기에 baked GI의 값을 더해주었지만 이것을 끊어보겠다.

그랬더니 당연하게도 이 씬에는 라이트가 없으므로 검정색이 되어버린다!

 

그래서 Unlit Shader를 작성할 때 이러한 GI의 영향을 받게 하려면 Baked GI라는 값을 추가해주어야 한다

  Comments,     Trackbacks
노드 툰 쉐이더 멀티라이팅

사용한 디퓨즈 워래핑 그라디언트 이미지

Lighting정보는 cs파일로 직접 넣어줌

  Comments,     Trackbacks
모든 약수 빠르게 구하는 법
1
2
3
4
5
6
for(i=0;i*i<n;i++)
        if(n%i==0)  
            printf("%d %d",i,n/i);
    
    if(i*i==n)          //제곱수 확인
        printf("%d",i);  
cs

 

 

n이 30일 시 출력

출력

1 30

2 15

3 10

5 6 //모든약수 구하기 끝

코드만 봐도 어떤이유인진 알거임

 

 

  Comments,     Trackbacks
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
다이렉트 X 모델링표현
보호되어 있는 글입니다. 내용을 보시려면 비밀번호를 입력하세요.
다이렉트X 11 시작 -삼각형 만들기

이 곳은 정말 간소하게 공부한 걸 정리하는 블로그

초기화 하는 법이나 자료는 다른 블로그가 많으니 그곳에서 찾아야 함!

 

 

중요한 점

모든 함수를 전부 외울 수 없다 그냥 흐름을 파악하는게 중요하다.

1.다이렉트 X 프레임 워크

 

일단 삼각형 만들때까지의 프레임워크는 이러하다.

 

SystemClass에서 윈도우 응용프로그램에 필요한 WndProc이나 뭐 여러 정보들이 담겨있고,

 

InputClass에 키보드 인풋이나 뭐 인풋관련된거

GraphicsClass에 그래픽랜더링 관련이 있다.

2.하드웨어(그래픽,모니터)와 연결해주는 작업이 있다.

바로 이 부분

대충 흐름을 보면 어뎁터 지정해서

그래픽 카드의 정보, 모니터 정보 가져오고 주사율 확인하고

어댑터 해제한담에 백버퍼 정보 초기화하고 ( 프론트 버퍼 백버퍼는 다른 블로그참고 )

스텐실 설정하고~

윈도우 핸들 정하고 뭐 이런거함

3.다이렉트X는 어떻게 돌아감?

시스템클래스 Run함수를 통해서 whileLoop가 돈다.

순서[0] . 이니셜라이즈

우선 이니셜라이즈가 일어남

시스템 클래스 이니셜라이즈에 각 클래스들의 이니셜라이즈들을 넣음

각 이니셜라이즈는 자료를 찾아 한 번 훑어보면 알 수 있다.

 

공통된 점은 버퍼를 생성하고 초기화하고 포인터에 넣어두고(클래스의 맴버변수)

 

이라는 점

쉐이더는 컴파일한 걸 버퍼에 넣어둔다. (신기)

 

쉐이더 파트는 워낙 많이 했었기때문에 이 글에서 또 한번 다루진 않겠음

 

 

뭐 대충 저런 과정을 거쳐서 코딩하면 삼각형이 완성됨

'개발 > 다이렉트X11' 카테고리의 다른 글

다이렉트 X 모델링표현  (0) 2020.06.08
2번째 - 그래픽 렌더링  (0) 2020.06.07
다이렉트 X11 입문  (0) 2020.06.07
  Comments,     Trackbacks