현재 렌더링 백엔드로 DirectX/Direct3D11을 사용하는 C++ 11/VC11에서 다른 게임 엔진을 작성하고 있습니다. DirectX 유형을 공용 인터페이스에서 숨기고 (나중에 OpenGL 백엔드 구현이 가능할 수 있도록), 당분간 DirectX Math를 여전히 사용하는 선형 대수 라이브러리를 독자적으로 사용하고 있습니다. DirectX Math는 C++ SIMD 내장 함수 (__m128 등)를 중심으로 많은 typedef를 제공합니다. 인다이 딩 (indirection)의 레벨을 낮게 유지하고 가능한 한 인라인 된 "원자 적"인 스터디를 가지기 위해 DirectX 수학 유형 (이 경우 XMVECTORF32)을 상속받는 것을 선호합니다. 즉, 멤버 변수 :C++ 11 DirectX Math : 기본 구조로 XMVECTORF32
struct vector4 : private DirectX::XMVECTORF32
MSDN주는 XMVECTORF32 구조의 정확한 초기화 예 다음
XMVECTOR data;
XMVECTORF32 floatingVector = { 0.f, 0.f, 0.1f, 1.f };
data = floatingVector;
가 그러나, 기본 구조로서 XMVECTORF32 초기화 내 시도가 컴파일러에 의해 이해되지 않는다.
struct vector4 : private DirectX::XMVECTORF32 // not XMFLOAT4 due to possible conversation overhead
{
friend class matrix44;
inline vector4(scalar v0, scalar v1, scalar v2, scalar v3)
: DirectX::XMVECTORF32{v0, v1, v2, v3} // ERROR: ';' expected
{
}
};
나는 뭔가가 있습니까? 기본 초기화를 올바르게 수행하는 방법? 나를 도와 줄 새로운 C++ 11 초기화 설탕이 있습니까? 몇 가지 이유를 들어
------------ 편집 -----------
, 나는 명백한보고되지 않았다. XMVECTORF32의 정의를 검토 한 결과, 기본 union-float-array "f"가 나에게 접근 가능하다는 것이 명백 해졌다. 그래서 초기화는 다음과 같다.
struct vector4 : private DirectX::XMVECTORF32
{
friend struct matrix44;
inline vector4(scalar v0, scalar v1, scalar v2, scalar v3)
{
f[0] = v0;
f[1] = v1;
f[2] = v2;
f[3] = v3;
}
};
캐스트, 공용체, C 배열이 없습니다. 인라이닝을 사용하면 성능이 최적 수준에 근접해야합니다.
EDIT ------------ ----------- 2
XMVECTORF32은 가 데이터를 저장하기위한 것은 아니다. 따라서 벡터는 XMFLOAT4에서 상속해야합니다. 그렇지 않으면 특히 최적화가 설정된 상태에서 재생할 수없는 액세스 위반 예외가 발생합니다. 여기에 더 배경은 다음과 같습니다 http://www.asawicki.info/news_1429_xna_math_and_access_violation.html
내 마지막 코드는 다음과 같습니다
struct vector4 : private DirectX::XMFLOAT4
{
friend struct matrix44;
inline vector4(scalar v0, scalar v1, scalar v2, scalar v3)
: DirectX::XMFLOAT4(v0, v1, v2, v3)
{
}
inline scalar& v0() { return x; }
inline scalar& v1() { return y; }
inline scalar& v2() { return z; }
inline scalar& v3() { return w; }
};
벡터 데이터는 XMLoadFloat4 이전 SIMD 연산을 사용하여 XMVECTOR에로드해야 - 주위 안돼. XMVECTOR는 메모리 위치가 아닌 레지스터처럼 생각하십시오.
어떤 VC 컴파일러 버전을 사용하고 있습니까? –
GLM을 사용해 보셨습니까? 그것의 이름에 GL을 가지고 있지만 DX로 잘 작동합니다. – Cubic
@AndyProwl Visual Studio Express 2012 버전 11.0.51106.01 업데이트 1 –