我从头开始,我的代码将能够显示一些文本的总计。我一直在增加对sprite的支持。我遇到的麻烦是它似乎没有认出我的HLSL。我设定了技术,开始了它,开始了传球,画了精灵,冲了他们,结束了传球,技术。 D3D在VS输出中提出了这个小小的“使用FF到PS转换器”。同样的VS.我不是想用我的HLSL做任何先进的事 - 只需使用它并熟悉它并确保我知道如何实现它。顺便说一句,那就是C ++ 0x auto,所以自动类型扣除(因为我很懒)。
#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是一个简单的模板化函数,它遍历精灵,破坏那些需要的东西,并渲染其余的,而common->精灵是所有精灵对象的简单向量。由于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 :(得分:0)
AFAIR D3DXSprite和D3DXFont渲染在D3DX内部实现。因此,它设置自己的着色器,状态(模拟固定功能管道)并呈现文本/精灵。因此,着色器和状态对这些对象没有影响。 您可以实现自己的文本/精灵渲染子系统,但这并不难。对此的另一个投票是微软正式弃用D3DX。