다음을 통해 공유


점 스프라이트(Direct3D 9)

Direct3D 9에서 점 스프라이트를 지원하면 포인트(파티클 시스템)의 고성능 렌더링이 가능합니다. 점 스프라이트는 텍스처에 정의된 대로 임의 셰이프를 렌더링할 수 있는 제네릭 점의 일반화입니다.

지점 기본 렌더링 컨트롤

Direct3D 9는 점 스프라이트(점 기본형)의 렌더링을 제어하는 추가 매개 변수를 지원합니다. 이러한 매개 변수를 사용하면 점의 크기가 가변적이고 전체 텍스처 맵이 적용됩니다. 각 지점의 크기는 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 + C *( D ² )))

이 수식에서 입력 지점 크기인 S i는 꼭짓점당 또는 D3DRS_POINTSIZE 렌더링 상태의 값입니다. 점 배율 계수(D3DRS_POINTSCALE_A, D3DRS_POINTSCALE_B 및 D3DRS_POINTSCALE_C)는 점 A, B 및 C로 표시됩니다. 뷰포트의 높이 V h는 뷰포트를 나타내는 D3DVIEWPORT9 구조체의 Height 멤버입니다. 눈에서 위치(원점의 눈)까지의 거리인 D는 점(X, Y, Z)의 눈 공간 위치를 취하고 다음 연산을 수행하여 계산됩니다.

D = sqrt(X² + Y ² + Z ²)

최대 포인트 크기 Pm은 D3DCAPS9 구조체의 MaxPointSize 멤버 또는 D3DRS_POINTSIZE_MAX 렌더링 상태를 더 작게 사용하여 결정됩니다. 최소 지점 크기인 P은 D3DRS_POINTSIZE_MIN 값을 쿼리하여 결정됩니다. 따라서 최종 화면 공간 지점 크기인 S는 다음과 같은 방식으로 결정됩니다.

  • Ss > Pm이면 S = P m
  • SP <min이면 S = P
  • 그렇지 않으면 S = S 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) 좌표 값에 대해 레이블이 지정된 꼭짓점이 있는 사각형 다이어그램

클리핑을 사용하도록 설정하면 다음과 같은 방식으로 점이 잘립니다. 꼭짓점이 장면을 렌더링할 깊이 값( D3DVIEWPORT9 구조의 MinZ 및 MaxZ)을 초과하는 경우 점이 뷰 frustum 외부에 존재하며 렌더링되지 않습니다. 점 크기를 고려하여 점이 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_POINTSIZED3DRS_POINTSIZE 올바르게 설정해야 합니다.

점, 선 및 삼각형에 대한 렌더링 규칙에 대한 자세한 내용은 래스터화 규칙(Direct3D 9)을 참조하세요.

꼭짓점 파이프라인