HLSL和ID3DXFont / ID3DXSprite

时间:2010-02-23 20:26:42

标签: c++ hlsl direct3d9

我从头开始,我的代码将能够显示一些文本的总计。我一直在增加对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 ++。

1 个答案:

答案 0 :(得分:0)

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