2010-02-23 21 views
0

我已经开始了,我的代码将能够显示一些文本的总数。我一直在加入对精灵的支持。我碰到的麻烦是,它似乎没有认出我的HLSL。我设定了技巧,开始了它,开始了传球,画出了精灵,冲过他们,结束了传球,技术。而D3D在VS输出中带来了这个小小的“使用FF到PS转换器”。 VS也一样。我并没有试图用我的HLSL做任何先进的事情 - 只是使用它并对它稍微熟悉一点,并确保我知道如何实现它。这是C++ 0x自动,顺便说一下,所以自动类型扣除(因为我很懒)。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()); 

其中RenderAndCleanUp是一个简单的模板函数,通过精灵循环,破坏那些需要是,并使其余部分,和共>精灵是所有子画面对象的简单向量。由于DXTrace永远不会关闭,我会保证没有任何功能失败。我还将控制面板设置为最大调试。

我检查了D3DXHANDLEs,它们都是非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 2010-02-23 20:30:21

+0

你似乎没有确切地说明它如何不如你所期望的那样工作,除非我错过了它...... – jcoder 2010-03-19 08:42:23

+0

因为它们实际上没有以任何方式加载或调用HLSL。他们只是使用FF。例如,我修改了像素着色器始终返回蓝色,但没有效果。 – DeadMG 2010-03-20 23:33:50

回答

0

AFAIR D3DXSprite和D3DXFont渲染是在D3DX内部实现的。所以,它设置了自己的着色器,状态(模拟固定功能管道)并呈现文本/精灵。所以,你的着色器和状态对这些对象没有影响。 你可以实现你自己的文本/精灵渲染子系统,这并不难。另一个投票是微软正式弃用D3DX。