SIMD 처리는 데이터를 SIMD 레지스터에 load하고 결과를 추출하기 전에 완전히 처리할 때 가장 효율적이다.
SIMD processing is most efficient when data is loaded into the SIMD registers and fully processed before extracting the results.
스칼라와 벡터 형식 간의 변환은 비효율적이므로 필요할 때만 수행하는 것이 좋다.
Conversion between scalar and vector forms is inefficient, so we recommend that you do it only when required.
이러한 이유로 스칼라 값을 생성하는 DirectXMath 라이브러리의 함수는 스칼라 결과가 결과 벡터에 복제되는 벡터 형태로 리턴된다.
For this reason, functions in the DirectXMath library that produce a scalar value are returned in a vector form where the scalar result is replicated across the resulting vector
그래서 스칼라 값이 필요한 경우에 이와 같은 내용을 수행하는 방법에 대한 몇 가지 선택사항으로 XMFLOAT를 이용해 벡터를 메모리 구조에 저장하고 다시 읽어오는 방식을 사용.
SIMD의 장점을 이용하려면 함수에 XMVECTOR 형식의 매개변수를 전달할 때 지켜야 할 규칙이 있다.
이 규칙들은 플랫폼바다 다른데 플랫폼 독립적 코드를 위해 XMVECOTR 형식의 매개변수에 대해 CXMVECTOR, FXMVECTOR 형식을 사용한다.
Windows의 경우
// 32비트 Windows
typedef const XMVECTOR FXMVECTOR;
typedef const XMVECTOR& CXMVECTOR;
//64비트 Windows
typedef const XMVECTOR& FXMVECTOR;
typedef const XMVECTOR& CXMVECTOR;
이 둘의 차이는 XMVECTOR의 복사본을 직접 전달할 수 있는지, 참조를 전달해야 하는지이다.
구체적인 또 하나의 규칙은 한 함수의 처음 세 개의 XMVECTOR 매개변수는 반드시 FXMVECTOR형식이어야 한다. 그 외의 XMVECTOR 매개변수는 반드시 CXMVECOTR 형식이여야 한다.
예를 들어 7개의 매개변수를 받는 함수가 있으면 위의 규칙에 따라 처음 세 개는 FXMVECTOR, 나머지 네 개는 CXMVECOTR 형식이어야 하며 XMVECTOR 매개변수들 사이에 다른 매개변수가 끼어있을 경우에도 처음 세 개의 XMVECTOR 매개변수는 반드시 FXMVECTOR 형식이고 나머지 XMVECTOR 매개변수는 CXMVECOTR 형식이어야 한다.
또한 상수(const) XMVECTOR 인스턴스에는 반드시 XMVECTORF32 형식을 사용해야 한다.
초기화 구문을 사용하고자 할 때에는 항상 XMVECTORF32를 사용해야 한다.
XMVECTORF32는 16바이트 경계로 정렬된 구조체로, XMVECTOR로의 변환 연산자를 지원한다.
◎ 기타 제공 함수
XNA Math 라이브러리는 XMVECTOR를 이용한 벡터 덧셈, 뺄셈, 스칼라 곱셈을 위해 중복적재된 연산자들을 제공한다.
또한 XNA Math 라이브러리는 벡터의 길이, 벡터 길이의 제곱, 두 벡터의 내적, 두 벡터의 외적, 벡터 정규화를 위한 편의용 함수들도 제공한다.
Direct3D에서의 정점은 공간적 위치, 즉 위치 값 이외의 정보를 담고 있으며 이를 통해 좀 더 복잡한 렌더링 효과를 구현할 수 있다. 예를 들면 조명 구현을 위해 정점에 법선 벡터를 추가하거나 텍스처를 적용하기 위해 텍스처 좌표를 추가하는 식으로 사용할 렌더링 효과에 따라 특정 정보를 추가할 수 있는 유연성을 갖고 있다.
◎ 정점 쉐이더 (Vertext Shader) 단계
이 단계에서는 입력 조립 단계에서 출력되는 Primitive의 각 정점에 대한 연산을 수행한다.
이 정점 쉐이더는 항상 모든 정점들에 대해 한 번씩 실행된다. 또한 하나의 정점에 대해 한 번만 호출되며 하나의 출력 정점을 생성될 뿐 아니라 파이프라인 단계에서 항상 수행이 되어야 하는 단계이다. 따라서 정점에 대한 변환이 필요하지 않아도 정점 쉐이더를 생성해 연결해야 한다.
이 정점 셰이더 함수의 구체적인 내용은 프로그래머가 구현해서 GPU에 전달하게 된다. 그 함수는 각 정점에 대해 GPU에서 실행되기 때문에 속도가 빠르다.
변환(Transformation), 스키닝(Skinning), 조명(Vertex Lighting) 등 수많은 특수 효과를 정점 쉐이더에서 수행할 수 있다. 정점 쉐이더에서 입력 정점 자료는 텍스쳐라든가 변환 행렬, 장면 광원 정보 등 GPU 메모리에 담긴 다른 자료에도 접근할 수 있다.