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 행렬을 설정하는 방식이나 셰이더에서 읽는 방식에 문제가 있다고 생각합니다.
그래서 좋은 듯 :
먼저 내 버텍스 버퍼/순서 정점은 정점 셰이더를 입력 한을 확인하기 위해 PIX를 사용했다. 다음으로, 내가 게시 한 셰이더 코드에서 볼 수 있듯이 vertices를 스크린 공간에 투영하기 위해 viewprojection 행렬을 추가했습니다. 그 결과 ...![BadSprite1](https://i.stack.imgur.com/HC3Us.png)
여러분도 알다시피, 정점이 올바르게 투영되지 않습니다. 선발 투수의 경우 :
- prim0vert0 = prim0vert1
- prim1vert4 = prim1vert5 처리되고 다른 정점 값이 있기 때문에
이 나에게 이해가되지 않습니다. UV 좌표를보고 초기 테스트와 동일한 순서로 정점이 입력되었다고 말할 수 있습니다. 이 내 3 × 3 viewprojection 매트릭스 버퍼 모습입니다 :
내가 수동으로 버퍼 값에 해당 상단 무엇 매트릭스 행/열 이상 썼다. 컬럼 1,
- M00 = 매트릭스 ROW1
- 는 M01 = 매트릭스 ROW1는 을 열 2 : 하단의 세 값 내 버퍼 크기를 보장하기 위해 패딩은 다이렉트처럼 .. 그래서 16의 배수 인 등
우측 적색 값 내 ViewProjection 행렬은 HLSL 코드 버퍼에 액세스하는 방법을 나타낸다.
어떤 이유인지 그것은 float4x4로 취급하고 있습니까? 그 ... 저 문제를 수 또는 내가
-UPDATE-
내가 약간의 연구를 수행 한하고있는 경우 지금 float3x3가 조각화 가정하에하고 있어요 내 문제를 해결 wayyyy 트랙입니다 수 레지스터에 저장됩니다 (4 개의 부동 소수점 그룹으로 묶음).
이제 응용 프로그램이 완전히 2D인데도 불구하고이 성가신 동작으로 인해 4x4 매트릭스를 사용해야합니다. 이게 맞습니까? 아니면 내가 모르고있는 몇 가지 해결 방법이 있습니까?
매트릭스를 쉐이더로 보내는 방법을 볼 기회가 있습니까? 잘림/자리 바꿈 문제 일 수 있습니다. – catflier
'float3x3 ViewProjection'이'Matrix ViewProjection'이 아니고, 입력 위치가 float4입니까? ViewProjection 행렬을 3D 행렬 코드면으로 처리 할 가능성이 있습니다.이 행은 2 차원 행렬로 취급됩니다. – SlxS
당신의 업데이트에 답하기 위해, 나는 2D와 함께 항상 4x4 매트릭스를 사용합니다 - 파이프 라인에서 2D의 '개념'을 정사영 매트릭스의 설정으로 제한하려고했습니다. 부수적으로, 미리 변형 된 버텍스의 개념이 적용되지 않는만큼 미리 변형 된 버텍스 형식 (D3DFVF_XYZRHW 또는 D3DDECLUSAGE_POSITIONT 사용)으로 인해 FFP에서 쉐이더로 이동하는 데 많은 어려움이있었습니다. DX10 +. DX9에서 FFP의 일부를 켜기 때문에 DX10/11에서 겉으로보기에는 비슷한 코드가 작성 될 수 있습니다. – Kit10