2013-02-27 2 views
0

화면에 그래픽을 렌더링하는 응용 프로그램을 작성하고 있습니다. 응용 프로그램은 Direct3D9 및 Direct3D10 그래픽 모듈간에 전환 할 수 있습니다 (D3D9와 D3D10을 모두 감싸는 DLL을 작성했습니다). 테스트 메쉬 (D3DX9와 DirectX10 샘플에서 찾을 수있는 DXUT 라이브러리에있는 스톡 메쉬로 제공되는 토러스)를 렌더링하려고 할 때, Direct3D10 모듈은 다소 이상하게 동작합니다. 여기 내가 얻는 것이있다.Direct3D10을 사용한 이상한 렌더링

D3D9 : Torus rendered by D3D9 module.

D3D10 : Torus rendered by D3D10 module

뷰, 프로젝션 세계 행렬은 두 경우 모두 동일합니다. 유일한 차이점은 장치 초기화 코드와 HLSL 효과 파일입니다 (단순하게 앰비언트 색상을 적용하고 고급 조명, 텍스처링 등은 사용하지 않습니다). 장치 초기화가 잘못되었거나 쉐이더가 좋지 않기 때문일 수 있습니까? 나는 어떤 힌트를 주셔서 감사하겠습니다. 요청으로 모든 코드 조각을 게시 할 수 있습니다.

Game Dev StackExchange에있는 사람은 아마도 전치 행렬이 바뀌었기 때문일 것이라고 제안했습니다. 나는 매트릭스가 쉐이더 파일에서 곱 해지는 순서를 바꾸려고 시도했다. 나는 거의 모든 순열을 시도했지만 화면에는 올바른 출력이 없다.

미리 감사드립니다. EDIT : .fx 파일은 다음과 같습니다. 추 신을 무시할 수 있습니다. 흥미로운 점은 없습니다.

//Basic ambient light shader with no textures 
matrix World; 
matrix View; 
matrix Projection; 
float4 AmbientColor : AMBIENT = float4(1.0, 1.0, 1.0, 1.0); 
float AmbientIntensity = 1.0; 

struct VS_OUTPUT 
{ 
    float4 Position : SV_POSITION; // vertex position 
    float4 Color : COLOR0; // vertex color  
}; 

RasterizerState rsWireframe { FillMode = WireFrame; }; 

VS_OUTPUT RenderSceneVS(float4 vPos : POSITION) 
{ 
    VS_OUTPUT output; 
    matrix WorldProjView = mul(World, mul(View, Projection)); 
    vPos = mul(vPos, WorldProjView);   
    output.Position = vPos; 
    output.Color.rgb = AmbientColor * AmbientIntensity; 
    output.Color.a = AmbientColor.a; 

    return output; 
} 

struct PS_OUTPUT 
{ 
    float4 RGBColor : SV_Target; // Pixel color 
}; 

PS_OUTPUT RenderScenePS(VS_OUTPUT In) 
{ 
    PS_OUTPUT output; 
    output.RGBColor = In.Color; 
    return output; 
} 

technique10 Ambient 
{ 
    pass P0 
    { 
     SetRasterizerState(rsWireframe); 
     SetVertexShader(CompileShader(vs_4_0, RenderSceneVS())); 
      SetGeometryShader(NULL); 
      SetPixelShader(CompileShader(ps_4_0, RenderScenePS()));    
    } 
} 
+0

셰이더 코드를 게시 할 수 있습니까? 이것은 크게 도움이 될 것입니다. 또한 "전치 된"은 곱셈의 순서를 의미하지 않습니다. 그것은 매트릭스가 형성되는 방법을 의미합니다 : http://en.wikipedia.org/wiki/Row-major_order – Stardidi

+0

쉐이더 플래그 매개 변수를 사용하여 매트릭스 순서를 행 주요에서 행 메이저로 변경하려고했습니다. . –

+0

이러한 매트릭스 문제는 다루기가 힘들며 세계 및보기 매트릭스를 신원으로 설정해보십시오.그래도 문제가 해결되지 않으면 투영 행렬을 만드는 방식에 문제가 있음을 분명히 알 수 있습니다. – Stardidi

답변

2

vPos.w = 1.0f인지 확인하십시오. 그렇지 않은 경우 행렬 곱셈이 비정상적으로 발생하고 이상한 결과가 발생합니다.

1

는 확실하지 무슨 문제가 발생하지만 다음과 같은 확인할 수 있습니다

  • 는 "뭔가 초기화"하는 어트 변환 행렬에 있는지 일정한 버퍼가 아닌 일부 쓰레기 데이터
  • 당신이 사용하는 경우합니다 Vertex 버퍼의 normal/tangent 또한 거기에 (버텍스 당) 약간의 가비지 데이터를 넣지는 않겠지 만, 텍스처링에 문제가 생길 것입니다.
  • vertex 레이아웃 설명이 vertexshader (.hlsl)의 입력과 일치하는지 확인하십시오. 때로는 일치하지 않더라도 컴파일되고 실행되지만 예상치 못한 메쉬가 표시됩니다.
  • 나는에 의해 -1

편집 도움이 될 DX9에서 그것을 어떻게 아무 생각하지만 어쩌면 약간의 변형 행렬에서의 버텍스 버퍼에 Z를 곱도 좌표 뭔가가있다 : 그것은 또한 좋은 생각이 될 수도 있습니다 예를 들어 큐브 (예 : 삼각형)에 간단한 메쉬를 넣고 제대로 draw하는지 확인하십시오.

+0

메쉬는 DirectX SDK와 함께 제공되는 DXUT 샘플에 의해 생성됩니다. 그래서 나는 그것에 대한 통제력이별로 없다. –

+0

그러나 메쉬에 POSITION보다 많은 정보가 포함되지 않도록해야합니다. 실제로 그것을 긁어 라, 그것은 단지 정말로 이상한 메쉬를 만들 것이다. – Stardidi

0

매트릭스를 쉐이더 ​​상수로 설정하기 전에 매트릭스를 조 변경해야합니다. xnamath를 사용하는 경우 상수 버퍼에 설정하기 전에 각 세계, 뷰 및 투영 행렬에 대해 XMMatrixTranspose() 함수를 사용하십시오.