티스토리 뷰

Game/MMD

Deferred Rendering (1)

newpolaris 2017. 9. 19. 14:46

이까지 오는데 너무 많이 걸렸는데,

여기서 또 Pixel Query를 하네

Deferred context랑 안맞기도 한데 그냥 context로 해도 stall 이 있는듯.

https://www.3dgep.com/forward-plus/ 에서는

이전 프레임 (또는 이전 2 프레임)의 쿼리 결과가 
시간적 일관성 이론 [15] 에 의존하는 현재 프레임의 쿼리 결과 대신 사용되는
경우 실속을 피할 수 있습니다 . 이렇게하면 여러 광원에 대해 여러 쿼리 
개체를 만들어야하기 때문에 쿼리 개체를 여러 프레임에 걸쳐 유지해야하는 
경우 다시 쿼리 개체를 사용할 수 없기 때문에 이러한 쿼리 개체를 다시 
사용할 수 없습니다.

또, 다시 Query pool 을 만들어야하나.

만들어도 저 시간적 일관성이 어떻게 얻어지는거지;

motion blur 쪽에서도 이상한 방법 사용하던데

우선, light 추가 부터

128개 추가시켰는데 우선 시간도 문제이지만 light 가 들어갔는지 파악이 안된다.

확인을 위해 main 을 끄고 red light 만 추가시키면

HDR Tone mapping 을 먼저 넣어야 겠다.

넣다보니 전에 넣은 Fxaa pixel 이 이번에 업데이트한 부분하고 안맞아서

생긴 문제란걸 알았다.

톤 매핑이 없다고 해서 하얗게 뜨진 않고;

1로 날라내니 전체적으로 밝아진다 :> 많이 밝은 부분의 정보가 날라간다. 가 끝임

128 Light (1 Directional) - model 은 2개인데 mesh로 분류하면 42, 8 개로 나눠짐.

Foward:

Deferred: Light 의 범위로 제한 걸지 않고 Full Quad 로 rendering 했을 경우

처음 결과를 봤을 땐 혼란 스러웠는데;

배경 model 이 화면을 많이 차있고 모두 transparent 로 분류됨(alpha texture를 가져서)

Full screen quad로 128 개 라이트를 처리함.

foward의 경우 50번 draw 되지만, 최상위에 있는 pixel 만 처리됨.

이래서 이런 결과가 나온게 아닌가 함.

Deferred: Light 의 Range clipping

3dgrep에서 설명한 방법대로 수행하였다.

Deferred Rendering in Killzone 2 의 방법에서 culling 방향을 바꾼건데

Realtime rendering 의 deferred rendering chapter의 최적화 부분에 언급이 있다.

이러면 3dgrep 에서 설명한 것처럼 near plane 쪽 light는 안짤리고 표시되나 반대로 far plane 쪽에 걸친 light가 짤린다고 한다.

Forward 쪽에도 똑같이 range clipping 추가하고 다시 측정

투명이 너무 많다...

PS. Cone 의 원점이 가운데 있는걸 까먹고 spot light 가 너무 작다고 저 부분만 2시간 넘게 본거 같다. 의욕과 멘탈이 나간건 덤.

3DGrep은 AssImp 의 primitive generate 가 가능한 format 으로 기록한후 import 한다.

std::shared_ptr<Scene> RenderDeviceDX11::CreateCylinder( float baseRadius, float apexRadius, float height, const glm::vec3& axis )
{
    std::shared_ptr<Scene> scene = CreateScene();
    std::stringstream ss;

    // Create a white diffuse material for the cylinder.
    // f red green blue Kd Ks Shine transmittance indexOfRefraction
    ss << "f 1 1 1 1 0 0 0 0" << std::endl;

    ss << "c" << std::endl;
    // base.x base.y base.z baseRadius
    ss << "0 0 0 " << baseRadius << std::endl;

    glm::vec3 apex = axis * height;
    // apex.x apex.y apex.z apexRadius
    ss << apex.x << " " << apex.y << " " << apex.z << " " << apexRadius << std::endl;

    scene->LoadFromString( ss.str(), "nff" )
}

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

Tone mapping (3)  (0) 2017.09.22
Outline (1)  (0) 2017.09.21
Bullet (5) Skinning  (0) 2017.08.31
Bullet (5) Skinning  (0) 2017.08.31
Boost spirit  (0) 2017.08.29
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크