고정 함수 꼭짓점 처리(Direct3D 9)

고정 함수 꼭짓점 파이프라인에서 꼭짓점 버퍼에서 꼭짓점을 처리하면 디바이스에 대한 현재 변환 행렬이 적용됩니다. 필요에 따라 조명, 클립 플래그 생성 및 익스텐트 업데이트와 같은 꼭짓점 작업을 적용할 수도 있습니다. 고정 함수 꼭짓점 처리를 사용하는 경우 대상 꼭짓점 버퍼의 요소 수정은 D3DPV_DONOTCOPYDATA 플래그에 의해 제어됩니다. 이 플래그는 고정 함수 꼭짓점 처리에만 적용됩니다. IDirect3DDevice9 인터페이스는 꼭짓점을 처리하기 위해 IDirect3DDevice9::P rocessVertices 메서드를 노출합니다. 꼭짓점 셰이더에서 입력 데이터 스트림 집합으로 꼭짓점을 처리하여 IDirect3DDevice9::P rocessVertices 메서드를 호출하여 인터리브된 꼭짓점 데이터의 단일 스트림을 대상 꼭짓점 버퍼로 생성합니다. 메서드는 메서드가 대상으로 하는 꼭짓점의 위치 및 수량, 대상 꼭짓점 버퍼 및 처리 옵션을 설명하는 5개의 매개 변수를 허용합니다. 호출 후 대상 버퍼에는 처리된 꼭짓점 데이터가 포함됩니다.

첫 번째, 두 번째 및 세 번째 매개 변수인 SrcStartIndex, DestIndex 및 VertexCount는 로드할 첫 번째 꼭짓점의 인덱스, 꼭짓점이 배치될 대상 버퍼 내의 인덱스 및 대상 버퍼에 처리하고 배치할 총 꼭짓점 수를 각각 반영합니다. 네 번째 매개 변수인 pDestBuffer는 원본 꼭짓점을 받을 꼭짓점 버퍼 개체의 IDirect3DVertexBuffer9 인터페이스의 주소로 설정해야 합니다. SrcStartIndex 매개 변수는 메서드가 꼭짓점 처리를 시작해야 하는 인덱스를 지정합니다.

마지막 매개 변수인 Flags는 메서드에 대한 특수 처리 옵션을 결정합니다. 기본 꼭짓점 처리를 위해 이 매개 변수를 0으로 설정하거나 D3DPV_DONOTCOPYDATA 경우에 따라 처리를 최적화할 수 있습니다. D3DPV_DONOTCOPYDATA 값을 대상 버퍼에 적합한 하나 이상의 D3DLOCK 값과 결합할 수도 있습니다. 플래그를 0으로 설정하면 꼭짓점 작업의 영향을 받지 않는 대상 꼭짓점 버퍼의 꼭짓점 형식의 꼭짓점 구성 요소는 여전히 꼭짓점 셰이더에서 복사되거나 0으로 설정됩니다. 그러나 D3DPV_DONOTCOPYDATA 사용하는 경우 이 데이터가 Direct3D에서 생성되지 않는 한 IDirect3DDevice9::P rocessVertices 는 대상 버퍼의 색 및 텍스처 좌표 정보를 덮어쓰지 않습니다. 확산 색은 조명을 사용할 때 생성됩니다. 즉, D3DRS_LIGHTING TRUE로 설정됩니다. 반사 색은 조명이 활성화되고 반사가 활성화되면 생성됩니다. 즉, D3DRS_SPECULARENABLE 및 D3DRS_LIGHTING TRUE로 설정됩니다. 안개를 사용하는 경우에도 반사 색이 생성됩니다. 텍스처 변환 또는 텍스처 생성을 사용하도록 설정하면 텍스처 좌표가 생성됩니다. IDirect3DDevice9::P rocessVertices 는 현재 렌더링 상태를 사용하여 수행해야 하는 꼭짓점 처리를 결정합니다.

대상 꼭짓점 버퍼에 대한 FVF 사용 설정

IDirect3DDevice9::P rocessVertices 메서드에는 대상 꼭짓점 버퍼의 D3DFVF에 대한 특정 설정이 필요합니다. FVF 사용 설정은 꼭짓점 처리를 위한 현재 설정과 호환되어야 합니다.

고정 함수 꼭짓점 처리의 경우 IDirect3DDevice9::P rocessVertices 에는 다음 FVF 설정이 필요합니다.

  • 위치 형식은 항상 D3DFVF_XYZRHW . 따라서 D3DFVF_XYZ 및 D3DFVF_XYZB1 D3DFVF_XYZB5 유효하지 않습니다.
  • D3DFVF_NORMAL, D3DFVF_RESERVED0 및 D3DFVF_RESERVED2 플래그를 설정하면 안 됩니다.
  • 다음 조건의 OR 작업이 true를 반환하는 경우 D3DFVF_DIFFUSE 플래그를 설정해야 합니다.
    • 조명을 사용할 수 있습니다. 즉, D3DRS_LIGHTING TRUE입니다.
    • 조명이 비활성화되고, 확산 색이 입력 꼭짓점 스트림에 있으며 , D3DPV_DONOTCOPYDATA 설정되지 않습니다.
  • 다음 조건의 OR 작업이 true를 반환하는 경우 D3DFVF_SPECULAR 플래그를 설정해야 합니다.
    • 조명을 사용하도록 설정하고 반사 색을 사용하도록 설정합니다. 즉, D3DRS_SPECULARENABLE TRUE입니다.
    • 조명이 비활성화되고, 입력 꼭짓점 스트림에 반사 색이 있으며 , D3DPV_DONOTCOPYDATA 설정되지 않습니다.
    • 꼭짓점 안개를 사용할 수 있습니다. 즉, D3DRS_FOGVERTEXMODE D3DFOG_NONE 설정되지 않습니다.

또한 텍스처 좌표 수는 다음과 같은 방식으로 설정해야 합니다.

  • 모든 활성 텍스처 스테이지에서 텍스처 변환 및 텍스처 생성을 사용하지 않도록 설정하고 D3DPV_DONOTCOPYDATA 설정되지 않은 경우 입력 꼭짓점 텍스처 좌표와 일치하려면 출력 텍스처 좌표의 수와 형식이 필요합니다. D3DPV_DONOTCOPYDATA 설정되고 텍스처 변환 및 텍스처 생성이 비활성화된 경우 출력 텍스처 좌표는 무시됩니다.
  • 모든 활성 텍스처 단계에 대해 텍스처 변환 또는 텍스처 생성을 사용하도록 설정한 경우 출력 꼭짓점은 입력 꼭짓점보다 더 많은 텍스처 좌표 집합을 포함해야 할 수 있습니다. 이는 텍스처 생성에 의해 생성되거나 텍스처 변환에 의해 파생되는 텍스처 좌표의 확산 때문입니다. IDirect3DDevice9::D rawPrimitive 호출 중에 유사한 텍스처 좌표가 확산되지만 애플리케이션 프로그래머에게 표시되지 않습니다. 이 경우 Direct3D는 새 텍스처 좌표 집합을 생성합니다. 새로운 텍스처 좌표 집합은 텍스처 단계를 단계별로 실행하고 텍스처 생성, 텍스처 변환 및 텍스처 좌표 인덱스에 대한 설정을 분석하여 해당 단계에 고유한 텍스처 좌표 집합이 필요한지 확인하여 파생됩니다. 새 집합이 필요할 때마다 순서대로 할당됩니다. D3DTSS_TEXCOORDINDEX 통해 변형되지 않은 텍스처 좌표를 공유하기 때문에 크기가 작을 수 있지만 최대 및 일반적인 요구 사항은 스테이지당 하나의 집합입니다.

따라서 각 텍스처 단계에 대해 텍스처가 해당 단계에 바인딩되고 다음 조건 중 어느 것이라도 true이면 새 텍스처 좌표 집합이 생성됩니다.

  • 텍스처 생성은 해당 단계에 대해 사용하도록 설정됩니다.
  • 텍스처 변환은 해당 단계에 대해 사용하도록 설정됩니다.
  • 변형되지 않은 입력 텍스처 좌표는 처음으로 D3DTSS_TEXCOORDINDEX 통해 참조됩니다.

Direct3D가 텍스처 좌표를 생성하는 경우 애플리케이션은 다음 작업을 수행해야 합니다.

  1. 적절한 FVF 사용량으로 대상 꼭짓점 버퍼를 사용합니다.
  2. 후처리된 텍스처 좌표의 배치에 따라 텍스처 단계의 D3DTSS_TEXCOORDINDEX 다시 프로그래밍합니다. D3DTSS_TEXCOORDINDEX 설정의 다시 프로그래밍은 처리된 꼭짓점 버퍼가 후속 IDirect3DDevice9::D rawPrimitiveIDirect3DDevice9::D rawIndexedPrimitive 호출에서 사용될 때 발생합니다.

마지막으로 텍스처 좌표 차원(D3DFVF_TEX8 D3DFVF_TEX0)을 다음과 같은 방식으로 설정해야 합니다.

  • 각 텍스처 좌표 집합에 대해 텍스처 변환 및 텍스처 생성을 사용하지 않도록 설정하면 출력 텍스처 좌표 차원이 입력과 일치해야 합니다. 텍스처 변환을 사용하는 경우 출력 차원은 D3DTTFF_COUNT1, D3DTTFF_COUNT2, D3DTTFF_COUNT3 또는 D3DTTFF_COUNT4 설정에 정의된 개수와 일치해야 합니다. 텍스처 변환을 사용하지 않도록 설정하고 텍스처 생성을 사용하도록 설정한 경우 출력 차원은 텍스처 생성 모드의 설정과 일치해야 합니다. 현재 모든 모드는 세 개의 부동 소수점 값을 생성합니다.

호환되지 않는 대상 꼭짓점 버퍼 FVF 코드 로 인해 IDirect3DDevice9::P rocessVertices 가 실패하면 예상 코드가 디버그 출력에 출력됩니다(디버그 빌드만 해당).

꼭짓점 버퍼