원래 이전 글에서, 다음에는 아토믹(atomic) 연산을 이용해서 데이터 버퍼로 출력하는걸 설명하겠다고 했는데 그렇게 큼지막하게 가끔 글을 쓰기보다는 잘잘한 것들을 좀 더 자세하고 더 빈번하게 글을 쓰려고 한다. 그래서 이번 글에서는 복셀 구축에서 지오메트리 쉐이더(Geometry Shader, GS)를 이용하는 부분을 설명하려고 한다.

이전 방법으로 렌더링을 해서 3D 텍스쳐로 출력할 경우 카메라는 하나이기 때문에 복셀이 만들어진 것을 보면 한 방향으로만 (거의) 제대로 보여지는 것을 알 수 있다(‘거의’가 붙은 이유, 화면에서 구멍이 뻥뻥 뚫린 이유는 이번 글 말미에서 설명하겠다).


그림 1. Z 축 기준으로 만들고, 다른 모습에서도 본 화면

이것은 현재 카메라가 -Z 축(OpenGL)을 바라보고 있는 상황에서 프래그먼트 쉐이더(Fragment Shader, FS)의 픽셀이 복셀이 되기 때문에 삼각형이 +-X 축이나 +-Y 축을 바라볼 경우 픽셀이 제대로 만들어지지 않기 때문이다.

이를 위해서 지오메트리 쉐이더를 사용한다.

먼저 버텍스 쉐이더(Vertex Shader, VS)에서는 간단한 계산만 한다. 주어진 행렬을 계산하고, 필요한 버텍스 속성(attribute)을 넘겨주고 끝. 일단 이전 글 처럼 이번에도 복셀 정보는 간략하게 하여 노말만 사용하겠다.

지오메트리 쉐이더에서는 프리미티브(primitive) 단위로 입력이 들어온다. 즉, 삼각형 단위로 들어올 때 삼각형의 노말을 보고 이 삼각형을 X, Y, Z의 세 축 중 어느 축으로 보낼지를 결정한다. 삼각형의 노말을 기준으로 가장 노말의 x, y, z 값 중 가장 긴 축을 선택하고 이를 우성 축(dominant axis)이라고 부른다. 이 축의 값은 지오메트리 쉐이더에서 프래그먼트 쉐이더로 전달되어야 한다.

프래그먼트 쉐이더에서 복셀을 만들 세 축을 정의해보자. 일단 기본적인 카메라는 -Z 방향을 보고 있고, X, Y 축이 프래그먼트 쉐이더의 뷰포트(viewport)가 된다. 이걸 Z 축의 뷰포트라고 부르겠다.


그림 2. Z 축 뷰포트

X 축의 뷰포트는 카메라가 -X 축 방향을 향하고 있는 형태로 보면 된다. 단, 다른 계산을 할 필요 없도록 하기 위해서 Y, Z 축을 뷰포트의 X, Y 축이 되도록 만든다. 그림으로 보면 다음과 같다.


그림 3. X 축 뷰포트

이렇게 하려면 gl_Position = gl_PositionIn[i].yzxw 하면 된다.

마찬가지로 Y축 뷰포트의 경우는 gl_Position = gl_PositionIn[i].zxyw 가 되고 아래와 같이 보인다.


그림 4. Y 축 뷰포트

여기서 뷰포트 안에 들어오는 삼각형들이 지오메트리 쉐이더에서의 범위가 중요하다. x, y, z 값 각각 모두 범위는 [-1:1] 이다(OpenGL 기준. DirectX에서 z값은 [0: 1] 이다). x, y 값은 프래그먼트 쉐이더에서 gl_FragCoord[0], gl_FragCoord[1] 로 얻어올 때 뷰포트(스크린) 크기만큼 스케일링 되는데 반해 z 값은 부호가 반대가 된다.

따라서 X 축 뷰포트나 Y 축 뷰포트에서 제대로 보일 수 있도록 하기 위해 z 값은 따로 관리 하도록 한다. 먼저 미리 z 값의 부호를 바꿔주고, X 축 뷰포트나 Y 축 뷰포트에서 컬링 되지 않도록 z 값을 0으로 만들어준다. 지오메트리 쉐이더에서 우성 축을 얻는 부분을 제외한 코드는 다음과 같다.


for( int i = 0; i < gl_VerticesIn; i++ )
{
    oNormal = normal[i];
    vertex = gl_PositionIn[i];
    vertex.z = -vertex.z;
    if( axis == 0 )
        gl_Position = vertex.yzxw;
    else if( axis == 1 )
        gl_Position = vertex.zxyw;
    else
        gl_Position = vertex;
    depth = gl_Position.z;
    gl_Position.z = 0.0;
    EmitVertex();
}
EndPrimitive();
 

이런 후 프래그먼트 쉐이더에서는 이 우성 축을 이용해서 3차원 좌표를 얻으면 된다.


ivec3 GetVoxelPosition( ivec3 screenPosition, int axis )
{
    if( axis == 0 )
        return screenPosition.zxy;
    else if( axis == 1 )
        return screenPosition.yzx;
    else
        return screenPosition.xyz;
}
// 실제 사용할 때는...
ivec3 voxelPosition = GetVoxelPosition( ivec3( gl_FragCoord[0], gl_FragCoord[1], (depth * 0.5 + 0.5) * BOX_LENGTH), axis );
 

세 방식을 따로 그려봤다.


그림 5. 순서대로 X 축 뷰포트, Y 축 뷰포트, Z 축 뷰포트

최종 그림은 여기 복셀을 glutSolidCube를 이용해서 그렸다. 그런데도 구멍이 뚤려있는데 이는 삼각형이 작을 경우에 발생한다. 이를 위해 conservative rasterization 방법을 이용하는데, 요건 일단 구현과 설명을 생략하고 다음 단계로 넘어가겠다[1].


그림 6. 최종

다음 글에서는 (이번엔 진짜로) 아토믹 연산을 이용해서 3D 텍스쳐가 아닌 데이터 출력을 해본다.

참고 문헌

  1. Cyril Crassin and Simon Green, Octree-Based Sparse Voxelization Using The GPU Hardware Rasterizer, OpenGL Insights, CRC Press, 2012
  2. Jon Hasselgren, et al. Conservative Rasterization, GPU Gems, Addison-Wesley Professional, 2005


  1. GPU Gems 2 - Chapter 42. Conservative Rasterization 참고 [본문으로]
크리에이티브 커먼즈 라이센스
Creative Commons License
2013/01/06 18:09 2013/01/06 18:09

트랙백 주소 :: http://www.hybrid.pe.kr/tt/trackback/708

  1. Subject: Recommended Reading

    Tracked from Recommended Reading 2013/04/24 04:01  삭제

    Hybrid :: SVOGI - 2. Geometry Shader

  2. Subject: Highly recommended Internet site

    Tracked from Highly recommended Internet site 2013/04/24 06:31  삭제

    Hybrid :: SVOGI - 2. Geometry Shader

  3. Subject: simply click the up coming internet site

    Tracked from simply click the up coming internet site 2013/04/24 12:53  삭제

    Hybrid :: SVOGI - 2. Geometry Shader

  4. Subject: just click the next website page

    Tracked from just click the next website page 2013/04/24 19:57  삭제

    Hybrid :: SVOGI - 2. Geometry Shader

  5. Subject: ipad3

    Tracked from ipad3 2013/04/25 20:17  삭제

    Hybrid :: SVOGI - 2. Geometry Shader

  6. Subject: Y3

    Tracked from Y3 2013/04/26 22:02  삭제

    Hybrid :: SVOGI - 2. Geometry Shader

  7. Subject: pure green coffee Extract

    Tracked from pure green coffee Extract 2013/04/26 22:05  삭제

    Hybrid :: SVOGI - 2. Geometry Shader

  8. Subject: scegliere attraverso la pagina web fino a venire

    Tracked from scegliere attraverso la pagina web fino a venire 2013/04/28 17:31  삭제

    Hybrid :: SVOGI - 2. Geometry Shader

  9. Subject: Casino online

    Tracked from Casino online 2013/04/29 01:46  삭제

    Hybrid :: SVOGI - 2. Geometry Shader

  10. Subject: Online Casinos - casinoonlinespiele911.de

    Tracked from Online Casinos - casinoonlinespiele911.de 2013/04/29 18:30  삭제

    Hybrid :: SVOGI - 2. Geometry Shader

  11. Subject: eine günstige Suchmaschienen-Optimierung in der Nähe von Frankfurt in der Innenstadt

    Tracked from eine günstige Suchmaschienen-Optimierung in der Nähe von Frankfurt in der Innenstadt 2013/04/30 01:07  삭제

    Hybrid :: SVOGI - 2. Geometry Shader

  12. Subject: Coaching Karriere in Frankfurt

    Tracked from Coaching Karriere in Frankfurt 2013/04/30 18:55  삭제

    Hybrid :: SVOGI - 2. Geometry Shader

  13. Subject: used slot machines

    Tracked from used slot machines 2013/05/03 09:03  삭제

    Hybrid :: SVOGI - 2. Geometry Shader

  14. Subject: casinoonlinespiele911.de

    Tracked from casinoonlinespiele911.de 2013/05/07 10:35  삭제

    Hybrid :: SVOGI - 2. Geometry Shader

  15. Subject: Hundertwasser Waldspirale Darmstadt in der Hessen

    Tracked from Hundertwasser Waldspirale Darmstadt in der Hessen 2013/05/08 18:12  삭제

    Hybrid :: SVOGI - 2. Geometry Shader

  16. Subject: Find Your Finest Online Online casinos By means of Online Casino site Reviews

    Tracked from Find Your Finest Online Online casinos By means of Online Casino site Reviews 2013/05/10 12:56  삭제

    Hybrid :: SVOGI - 2. Geometry Shader

  17. Subject: lån penge nu

    Tracked from lån penge nu 2013/05/10 20:58  삭제

    Hybrid :: SVOGI - 2. Geometry Shader

  18. Subject: Super Beta prostate

    Tracked from Super Beta prostate 2013/05/12 08:12  삭제

    Hybrid :: SVOGI - 2. Geometry Shader

  19. Subject: http://peoplewhopray.com

    Tracked from http://peoplewhopray.com 2013/05/12 20:53  삭제

    Hybrid :: SVOGI - 2. Geometry Shader

댓글을 달아 주세요