DirectX Graphics 프로그래밍 가이드 고도의 주제 정점 파이프라인 포인트 스프라이트   [목차열람] [주소복사] [슬롯비우기]
포인트 스프라이트
 
Microsoft DirectX 9.0

포인트 스프라이트


Microsoft® Direct3D® for Microsoft DirectX® 9.0 에서는, 포인트 스프라이트가 지원 되고 있기 (위해)때문에, 포인트 (파티클 시스템)의 고성능 렌더링이 가능하다. 포인트 스프라이트란, 임의의 형상에 텍스처로 정의되었던 대로 렌더링 시키는, 범용적인 포인트 생성이다.

포인트 기본도형의 렌더링 제어

DirectX 9.0 의 Direct3D 는, 포인트 스프라이트 (포인트 기본도형)의 렌더링을 제어하기 위한 추가 파라미터를 지원 하고 있다. 이러한 파라미터에 의해, 포인트에 가변 사이즈를 설정할 수 있어 텍스처 맵을 완전하게 적용할 수 있다. 각 포인트의 사이즈는, 애플리케이션으로 지정된 사이즈와 Direct3D 가 계산하는 거리 베이스의 함수를 조합해 결정된다. 애플리케이션은, 포인트 사이즈의 정점 단위의 설정도 할 수 있어 또, 정점 단위에는 설정을 실시하지 않고,D3DRS_POINTSIZE 를 설정해 포인트에 적용할 수도 있다. 포인트 사이즈는 카메라 공간 단위로 표현된다. 다만, 애플리케이션이 변환 후의 유연한 정점 포맷 (FVF) 정점을 건네주고 있을 때는, 거리 베이스의 함수는 적용되지 않고, 포인트 사이즈는 렌더링 타겟 위에의 픽셀의 단위로 표현된다.

포인트의 렌더링시에 계산해 사용하는 텍스처 좌표는,D3DRS_POINTSPRITEENABLE 의 설정에 따라서 다르다. 이 값이 TRUE 로 설정되어 있는 경우는, 각 포인트가 텍스처 전체를 표시하도록(듯이) 텍스처 좌표가 설정된다. 이것은 일반적으로, 포인트가 1 픽셀보다 매우 큰 경우에만 사용한다. D3DRS_POINTSPRITEENABLE 가 FALSE 로 설정되어 있는 경우는, 각 포인트의 정점 텍스처 좌표가 포인트 전체에 사용된다.

포인트 사이즈의 계산

포인트 사이즈는 D3DRS_POINTSCALEENABLE 에 의해 결정한다. 이 값이 FALSE 로 설정되어 있는 경우는, 애플리케이션으로 지정된 사이즈가 스크린 공간 (변환 후) 사이즈로서 사용된다. 스크린 공간에서 Direct3D 에게 건네지는 정점은, 포인트 사이즈를 계산하지 않고, 지정된 포인트 사이즈가 스크린 공간의 사이즈로서 해석된다.

D3DRS_POINTSCALEENABLE 가 TRUE 의 경우는, Direct3D 가, 다음의 식에 따라 스크린 공간의 포인트 사이즈를 계산한다. 애플리케이션으로 지정된 포인트 사이즈는, 카메라 공간 단위로 표현된다.

S s = Vh * S i * sqrt(1/(A + B * D e + C *( D e2 )))

이 식안의 입력 포인트 사이즈 Si 는, 정점마다 값인가, 또는 D3DRS_POINTSIZE 렌더링 스테이트의 값이다. 포인트 스케일 계수 D3DRS_POINTSCALE_A ,D3DRS_POINTSCALE_B ,D3DRS_POINTSCALE_C 는, 포인트 A, B, 및 C 로 나타낸다. 뷰포트의 높이 V h 는, 뷰포트를 나타내는 D3DVIEWPORT9 구조체의 Height 멤버이다. 시점에서 위치 좌표에의 거리 (원점의 눈) De는, 포인트 (Xe, Ye, Ze)의 시점 공간 위치를 잡아, 다음의 처리를 실행하는 것에 의해 계산된다.

D e = sqrt (Xe2 + Y e2 + Z e2)

최대 포인트 사이즈 Pmax 는,D3DCAPS9 구조체의 MaxPointSize 멤버 또는 D3DRS_POINTSIZE_MAX 렌더링 스테이트의 어느 쪽인지 작은 (분)편을 취해 결정된다. 최소 포인트 사이즈 Pmin 는,D3DRS_POINTSIZE_MIN 의 값을 조사하는 것에 의해 결정된다. 즉, 최종적인 스크린 공간 포인트 사이즈 S 는 다음의 규칙에 따라 결정된다.

포인트 렌더링

스크린 공간 사이즈 S 의 스크린 공간 포인트 P = ( X, Y, Z, W)는, 다음의 4 개의 정점을 가지는 사각형으로서 래스터화 된다.

(( X+ S/2, Y+ S/2, Z, W), ( X+ S/2, Y- S/2, Z, W), ( X- S/2, Y- S/2, Z, W), ( X- S/2, Y+ S/2, Z, W))

정점색속성은 정점 각각으로 복제되기 (위해)때문에, 각 포인트는 항상 일정한 색으로 렌더링 된다.

텍스처 인덱스의 할당은, D3DRS_POINTSPRITEENABLE 렌더링 스테이트 설정에 의해 제어된다. D3DRS_POINTSPRITEENABLE 가 FALSE 로 설정되어 있는 경우는, 정점 텍스처 좌표는 정점 각각으로 복제된다. D3DRS_POINTSPRITEENABLE 가 TRUE 로 설정되어 있는 경우는, 4 개의 정점의 텍스처 좌표는 다음의 값으로 설정된다.

(0. F, 0. F), (0. F, 1. F), (1. F, 0. F), (1. F, 1. F)

이것을 다음의 그림에 나타낸다.

좌표값 (u,v) 및 (x,y) 으로 나타내지는 정점을 가지는 정방형

클리핑이 유효하게 되어 있는 경우는, 다음의 규칙에 따라 포인트가 클리핑 된다. 장면(scene)가 렌더링 되는 깊이의 범위 (D3DVIEWPORT9 구조체의 MinZMaxZ)를 정점이 넘고 있는 경우, 포인트는 절두체의 밖에 존재해, 렌더링 되지 않는다. 포인트 사이즈를 고려에 넣어, 포인트가 완전하게 X 및 Y 의 뷰포트의 밖에 존재하는 경우, 그 포인트는 렌더링 되지 않고, 나머지의 포인트는 렌더링 된다. 포인트의 위치가 X 또는 Y 의 뷰포트의 밖에 있어도, 부분적으로 표시할 수 있는 경우가 있다.

포인트는, 사용자 정의 클립면에 올바르고 클립 되는 경우와 그렇지 않은 경우가 있다. D3DCAPS9 구조체의 PrimitiveMiscCaps 멤버내에서 D3DPMISCCAPS_CLIPPLANESCALEDPOINTS 가 설정되지 않은 경우, 포인트는, 정점 위치에만 기초를 두어, 포인트 사이즈는 무시해, 사용자 정의 클립면에 클립 된다. 이 때, 스케일링 된 포인트는, 정점 위치가 클립면안에 있는 경우는 완전하게 렌더링 되어 정점 위치가 클립면의 밖에 있는 경우는 파기된다. 애플리케이션에서는, 최대 포인트 사이즈와 같은 크기의 경계 지오메트리를 클립면에 추가하는 것으로, 부자연스러운 효과의 발생을 막을 수가 있다.

D3DPMISCCAPS_CLIPPLANESCALEDPOINTS 비트가 설정되어 있는 경우는, 스케일링 된 포인트는, 사용자 정의 클립면에 정확하게 클립 된다.

하드웨어 정점 처리는, 포인트 사이즈를 지원 하고 있는 경우와 그렇지 않은 경우가 있다. 예를 들어,D3DCAPS9 구조체의 MaxPointSize 멤버가 1.0 또는 0.0 으로 설정되어 있는, HAL 장치 (D3DDEVTYPE_HAL) 위에의 D3DCREATE_HARDWARE_VERTEXPROCESSING 로 장치를 생성 하면, 모든 포인트는 단일 픽셀이 된다. 1.0 보다 작은 픽셀 포인트 스프라이트를 렌더링 하려면 , FVF 의 TL (변환이 끝난 조명이 끝난) 정점, 또는 소프트웨어 정점 처리 (D3DCREATE_SOFTWARE_VERTEXPROCESSING)를 사용할 필요가 있어, 이 경우 Direct3D 런타임이 포인트 스프라이트 렌더링을 에뮬레이트 한다.

정점 처리를 실행해 (MaxPointSize 가 1.0f 보다 큰 값으로 설정된) 포인트 스프라이트를 지원 하는 하드웨어 장치는, 변환 되지 않는 스프라이트의 사이즈 계산에 필요하고, 또 TL 정점의 정점마다 또는 D3DRS_POINTSIZE 의 설정을 올바르게 실시하기 위해서(때문에)도 필요하다.

포인트, 라인, 및 삼각형의 렌더링 규칙 대해 더 자세한 것은, 「래스터화 규칙」을 참조할것.

.


© 2002 Microsoft Corporation. All rights reserved.
↑TOP