2010-02-23 2 views
0

처음부터 시작 했으므로 코드에 일부 텍스트의 총계가 표시 될 것입니다. 스프라이트 지원을 추가했습니다. 내가 만난 문제는 내 HLSL을 인식하지 못하는 것입니다. 나는 기술을 설정하고, 시작하고, 패스를 시작하고, 스프라이트를 그리고, 플러시하고, 패스를 끝내고, 기술을 사용했다. 그리고 D3D는 VS 출력에서이 작은 "Use FF to PS converter"를 제공합니다. VS와 동일합니다. 저는 HLSL로 진보 된 것을하려고하지 않고 있습니다. 단지 그것을 사용하고 좀 더 익숙해 져서 그것을 구현하는 방법을 확실히 알고 있어야합니다. 그것은 C++ 0x 자동입니다. 그렇기 때문에 자동 타입 공제 (저는 게으 르기 때문에)입니다. RenderAndCleanUp가 스프라이트를 순환 간단한 템플릿 함수HLSL 및 ID3DXFont/ID3DXSprite

#define D3DCALL(a) { auto __ = a; if (FAILED(__)) DXTrace(__FILE__, __LINE__, __, WIDEN(#a), TRUE); } 

D3DCALL(spriteeffect->SetTechnique(spritetechnique)); 
D3DCALL(spriteeffect->Begin(&passes, NULL)); 
D3DCALL(spriteeffect->BeginPass(0)); // We know this is zero. 
D3DCALL(sprite->Begin(D3DXSPRITE_OBJECTSPACE | D3DXSPRITE_DO_NOT_ADDREF_TEXTURE | D3DXSPRITE_SORT_TEXTURE | D3DXSPRITE_ALPHABLEND | D3DXSPRITE_SORT_DEPTH_FRONTTOBACK)); 
RenderAndCleanUp(common->sprites); 
D3DCALL(sprite->End()); 
D3DCALL(spriteeffect->EndPass()); 
D3DCALL(spriteeffect->End()); 

가되어야한다는 것과 파괴, 나머지를 표현하며 커먼> 스프라이트 모든 스프라이트 객체의 단순한 벡터이다. DXTrace는 절대로 작동하지 않으므로 함수가 실패하지 않는다는 것을 보증합니다. 또한 컨트롤 패널을 최대 디버깅으로 설정했습니다.

D3DXHANDLE을 검사했으며 모두 NULL이 아닙니다. 컴파일 오류 또는 오류나 경고를보고하지 않습니다.

// Contains the HLSL for sprites. 

// Based on transform.fx, by Frank Luna. 

// FX parameter (global variable to the shader). 
uniform extern float4x4 gWVP; 

// Structure 
struct OutputVS 
{ 
     float4 posH : POSITION0; 
float4 color : COLOR0; 
}; 

// Vertex shader 
OutputVS SpriteVS(float3 post : POSITION0, 
    float4 col : COLOR0) 
{ 
    // Zero out our output. 
    OutputVS outVS = (OutputVS)0; 

    outVS.posH = mul(float4(post, 1.0f), gWVP); // Transform 
    outVS.color = col; 

    // Done--return the output. 
    return outVS; 
} 

// Pixel shader - take the original colour of the pixel and just return it. Nothing fancy. 
float4 SpritePS(float4 col : COLOR0) : COLOR 
{ 
    return col; 
} 

technique Sprite 
{ 
    pass P0 
    { 
     // Specify the vertex and pixel shader associated 
     // with this pass. 
     vertexShader = compile vs_3_0 SpriteVS(); 
     pixelShader = compile ps_3_0 SpritePS(); 
    } 
} 

이것은 Direct3D9를 본 네이티브 C++입니다.

+0

왜냐하면 나는 게으르다. 왜냐하면 당신이 올바르게하고 있기 때문이다. : P – GManNickG

+0

내가 놓친 경우가 아니면 예상대로 작동하지 않는 것을 정확히 말하지 않는 것 같습니다 ... – jcoder

+0

그들은 실제로 어떤 방식 으로든 HLSL을로드하거나 호출하지 않기 때문입니다. 그들은 단지 FF를 사용합니다. 예를 들어 픽셀 쉐이더를 항상 파란색으로 변경했지만 효과가 없습니다. – DeadMG

답변

0

AFAIR D3DXSprite 및 D3DXFont 렌더링은 D3DX 자체 내에서 구현됩니다. 따라서 자체 셰이더, 상태 (고정 함수 파이프 라인을 에뮬레이트 함) 및 텍스트/스프라이트를 렌더링합니다. 따라서 쉐이더 및 상태는 이러한 객체에 아무런 영향을 미치지 않습니다. 텍스트/스프라이트 렌더링 서브 시스템을 구현할 수도 있습니다. 이에 대한 또 하나의 표결은 Microsoft가 공식적으로 D3DX를 사용 중단한다는 것입니다.

관련 문제