2013-03-09 3 views
2

현재 렌더링 백엔드로 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는 메모리 위치가 아닌 레지스터처럼 생각하십시오.

+0

어떤 VC 컴파일러 버전을 사용하고 있습니까? –

+0

GLM을 사용해 보셨습니까? 그것의 이름에 GL을 가지고 있지만 DX로 잘 작동합니다. – Cubic

+0

@AndyProwl Visual Studio Express 2012 버전 11.0.51106.01 업데이트 1 –

답변

1

DirectX::XMVECTORF32이 집합 클래스 인 경우 코드는 C++ 11에서 잘 작동합니다 (해당 용도를 보여주는 live example 참조).

그러나, 당신이 사용하는 컴파일러 (this Q&A on StackOverflow에 의해 명확히로) 하지 지원 균일 초기화를 수행하고 변수를 복사 초기화하는 것처럼 C++ 03이 기본 집계 클래스를 초기화 할 수있다.

따라서 초기화 목록에서 명시 적으로 기본 클래스의 멤버를 초기화하거나 같은 것을 vector4 생성자 본문에 호출해야합니다.

+0

감사합니다. GCC에서 C++ 11로 작업하는 것이 더 좋았지 만,이 새로운 "메트로 앱"과 Windows 요구 사항 때문에 MSVC가 붙어 있습니다. 최종 용액 : \t \t 인라인 vector4 (스칼라 V0, V1 스칼라, 스칼라 V2, V3 라) \t \t \t \t { \t F [0] = V0을; \t \t \t f [1] = v1; \t \t \t f [2] = v2; \t \t \t f [3] = v3; \t \t} –