티스토리 뷰

Game/MMD

Deferred Rendering (2)

newpolaris 2017. 10. 2. 19:52

Forward pass 가 너무 많이 잡아먹기에, 투명이 없는 배경 모델을 찾아서 바꾸고,

DirectXTex가 PNG 읽을 때 강제로 32 BIT RGBA로 컨버팅 하기에 차라리 BGRX로 읽도록 바꿨다.

이전에 BGRX의 경우 alpha가 없는 걸로 처리하도록 했기에 뒷단은 알아서 된다.

내부적으로 WinCodec 쪽을 사용하기에 멀 할수가 없다.

FreeImage를 사용한 INFOMSPGMT 의 경우는 아래와 같이 처리한다.

// Check to see if the texture has an alpha channel.
m_bIsTransparent = ( FreeImage_IsTransparent( dib ) == TRUE );

Position 을 Depth 부터 reconstruction 하게 바꿀 경우,

Light 가 random 이라 일관성은 없는데

대충 메모리 사용을 줄이고 시간은 거의 변화가 없다는걸 알 수 있다

Light pre-pass 가 속도를 올려줄것 같진 않아서 좀더 찾아보니

https://www.slideshare.net/cagetu/kgc2012-deferred-forward

light volume z-test 란 부분에서 stencil 포기하고 z-test로 그리자란 부분이 나와있었다.

    RenderSubPass( gfxContext, LightType::Point, ViewToClip, m_Lighting1PSO );
    RenderSubPass( gfxContext, LightType::Spot, ViewToClip, m_Lighting1PSO );
    RenderSubPass( gfxContext, LightType::Point, ViewToClip, m_Lighting2PSO );
    RenderSubPass( gfxContext, LightType::Spot, ViewToClip, m_Lighting2PSO );

앞앞, 뒤뒤 이렇게 그림. 비교는 z 깊이만, cull 은 앞뒤로 각각

Pre-pass 를 구현해보기로 했다

https://www.slideshare.net/leemwymw/light-in-screenspacelight-pre-pass

http://aker.tistory.com/556

  1. MRT 가 필요없다?

단계 1에서 1장 사용: Depth, Normal 경우에 따라서 Specular Power 를 1개 텍스쳐에 저장

Normal은 16,16 2개로 압축, depth도 16, power 를 16 bit로 depth는 그대로 사용하고, normal 을 16 3개로, power를 16 bit 로 등...

단계 2에서 1장 사용: Diffuse (RGB), Spec (A)

float specular = pow( saturate( dot( normal, H ) ), specularPower ) * attenuation * nDotL;
// Final value is diffuse RGB + mono specular 
return float4( diffuse, specular ); 

Spec의 color 를 적용하지 않고 intencity 만 사용하는 것

위의 방법은 chromaticity 라는 값을 사용함

http://aker.tistory.com/556 https://www.slideshare.net/cagetu/light-prepass

그런데 HDR 값을 쓴다면 사용이 불가능 한것 같다

diffuse 에서 light끼리 더하는거라 1 을 넘겨버려서;

  1. Material 별 다른 shader path 사용 가능

http://zerogram.info/?p=1290

캐릭터와 배경의 공식 분리

Stencil light culling

Z-test light culling

메모리 사용량은 specular power 만큼 늘어나고

vertex pass를 한번더 해야한다.

결국 vertex pass는 final render가 가져가는데, 약 1.1 ms 가 추가로 걸린다.

light pass 는 왜 2 ms 가 늘었을까?

처리과정은 거의 비슷하기에 random seed를 고정시킨 후 조사에 들어갔다.

HDR texture 입력을 받지 않기에 deferred 에서는

 Out.Diffuse = float4(texColor * diffuse, 1.0)

Diffuse 와 Specular를 R8G8B8A8_UNORM 으로 생성하였다.

DXGI_FORMAT_R11G11B10_FLOAT 으로 바꾸니

Light pre-pass 의 경우

흠...

Gpu view 사용법을 몇번 더 봐도 머가 문제인지 모르겠다.

https://msdn.microsoft.com/en-us/library/windows/desktop/jj585574(v=vs.85).aspx.aspx) https://graphics.stanford.edu/~mdfisher/GPUView.html

Present 가 체크무뉘(hatch)라는 것과 잡다한 것만 새롭게 배웠는데; 직접적인 해석은 불가능하다.

'Game > MMD' 카테고리의 다른 글

Bloom (1)  (0) 2017.10.07
Outline (2)  (0) 2017.10.06
Tone mapping (3)  (0) 2017.09.22
Outline (1)  (0) 2017.09.21
Deferred Rendering (1)  (0) 2017.09.19
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크