2012-12-14 1 views
2

dx11에서 스프라이트를 렌더링하는 데 문제가 있습니다. 이제 막 기본부터 시작했습니다.DX11 스프라이트 문제

//Shader Model 4.0 
//Default shaders for rendering a point sprite 

Texture2D DiffuseTexture : register(t0); 

SamplerState DiffuseTextureSampler : register(s0); 

cbuffer cbViewProj : register(b0) 
{ 
    float3x3 ViewProjection; 
} 

struct VS_INPUT 
{ 
    float2 Pos : POSITION; 
    float2 Tex : TEXCOORD0; 
}; 

struct PS_INPUT 
{ 
    float4 Pos : SV_POSITION; 
    float2 Tex : TEXCOORD0; 
}; 

PS_INPUT VS(VS_INPUT input) 
{ 
    PS_INPUT output; 
    float3 oVec = float3(input.Pos.x, input.Pos.y, 1.0f); 
    oVec = mul(oVec, ViewProjection); 

    output.Pos = float4(oVec.x, oVec.y, 0.0f, 1.0f); 
    output.Tex = input.Text; 

    return output; 
} 

float4 PS(PS_INPUT input) : SV_Target 
{ 
    return DiffuseTexture.Sample(DiffuseTextureSampler, input.Tex); 
} 

당신이 최소한의, 아니 아직 스프라이트를 이동하는 월드 행렬을 가지고 볼 수 있듯이 : 여기 내 간단한 쉐이더 코드입니다. 내 "ViewProjection"행렬은 2D 직교 행렬입니다. directx9와 함께이 설정을 사용했고 모든 것이 잘 작동했습니다.

dx11로 이동하는 중 문제가 발생했습니다. ViewProjection 행렬을 설정하는 방식이나 셰이더에서 읽는 방식에 문제가 있다고 생각합니다. BadSprite1

그래서 좋은 듯 :

먼저 내 버텍스 버퍼/순서 정점은 정점 셰이더를 입력 한을 확인하기 위해 PIX를 사용했다. 다음으로, 내가 게시 한 셰이더 코드에서 볼 수 있듯이 vertices를 스크린 공간에 투영하기 위해 viewprojection 행렬을 추가했습니다. 그 결과 ... BadSprite1

여러분도 알다시피, 정점이 올바르게 투영되지 않습니다. 선발 투수의 경우 :

  • prim0vert0 = prim0vert1
  • prim1vert4 = prim1vert5 처리되고 다른 정점 값이 있기 때문에

이 나에게 이해가되지 않습니다. UV 좌표를보고 초기 테스트와 동일한 순서로 정점이 입력되었다고 말할 수 있습니다. 이 내 3 × 3 viewprojection 매트릭스 버퍼 모습입니다 :

enter image description here

내가 수동으로 버퍼 값에 해당 상단 무엇 매트릭스 행/열 이상 썼다. 컬럼 1,

  • M00 = 매트릭스 ROW1
  • 는 M01 = 매트릭스 ROW1는
  • 을 열 2 : 하단의 세 값 내 버퍼 크기를 보장하기 위해 패딩은 다이렉트처럼 .. 그래서 16의 배수 인

우측 적색 값 내 ViewProjection 행렬은 HLSL 코드 버퍼에 액세스하는 방법을 나타낸다.

어떤 이유인지 그것은 float4x4로 취급하고 있습니까? 그 ... 저 문제를 수 또는 내가

-UPDATE-

내가 약간의 연구를 수행 한하고있는 경우 지금 float3x3가 조각화 가정하에하고 있어요 내 문제를 해결 wayyyy 트랙입니다 수 레지스터에 저장됩니다 (4 개의 부동 소수점 그룹으로 묶음).

이제 응용 프로그램이 완전히 2D인데도 불구하고이 성가신 동작으로 인해 4x4 매트릭스를 사용해야합니다. 이게 맞습니까? 아니면 내가 모르고있는 몇 가지 해결 방법이 있습니까?

+0

매트릭스를 쉐이더로 보내는 방법을 볼 기회가 있습니까? 잘림/자리 바꿈 문제 일 수 있습니다. – catflier

+0

'float3x3 ViewProjection'이'Matrix ViewProjection'이 아니고, 입력 위치가 float4입니까? ViewProjection 행렬을 3D 행렬 코드면으로 처리 할 가능성이 있습니다.이 행은 2 차원 행렬로 취급됩니다. – SlxS

+0

당신의 업데이트에 답하기 위해, 나는 2D와 함께 항상 4x4 매트릭스를 사용합니다 - 파이프 라인에서 2D의 '개념'을 정사영 매트릭스의 설정으로 제한하려고했습니다. 부수적으로, 미리 변형 된 버텍스의 개념이 적용되지 않는만큼 미리 변형 된 버텍스 형식 (D3DFVF_XYZRHW 또는 D3DDECLUSAGE_POSITIONT 사용)으로 인해 FFP에서 쉐이더로 이동하는 데 많은 어려움이있었습니다. DX10 +. DX9에서 FFP의 일부를 켜기 때문에 DX10/11에서 겉으로보기에는 비슷한 코드가 작성 될 수 있습니다. – Kit10

답변

1

최신 그래픽 하드웨어는 4x4 바이트 벡터와 함께 작동하도록 설계/최적화되어 있으며 4 가지 부동 소수점 값입니다. float3 벡터를 사용하는 경우에도 내부적으로 float4를 보유하는 단일 레지스터를 차지합니다.벡터 수학이 제대로 작동하려면

는 각 지점, 당신은 float3xN이있을 때 문제가 16 바이트 정렬 주소에서 시작 바이트에서 12

그래서 당신이이를 시작할 것에 2 점을 야기한다 데이터를 16 바이트 정렬로 채 웁니다. float4x3을 사용해보십시오. 내부적으로 float3x3 연산은 여전히 ​​float4x3의 공간을 차지합니다.