HLSL и ID3DXFont / ID3DXSprite - PullRequest
       14

HLSL и ID3DXFont / ID3DXSprite

0 голосов
/ 23 февраля 2010

Я начал с самого начала, и мой код будет отображать общую сумму текста. Я добавил поддержку спрайтов. Проблема, с которой я столкнулся, заключается в том, что он, похоже, не распознает мой HLSL. Я установил технику, начал ее, начал проход, нарисовал спрайтов, очистил их, закончил проход, технику. И D3D предлагает этот маленький «Использование преобразователя FF в PS» на выходе VS. То же самое для 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 - простая шаблонная функция, которая перебирает спрайты, уничтожает те, которые должны быть, и обрабатывает остальные, а общие-> спрайты - это простой вектор всех объектов спрайтов. Поскольку 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();
  }
}

Это родной C ++, смотрящий на Direct3D9.

1 Ответ

0 голосов
/ 14 сентября 2014

AFAIR Рендеринг D3DXSprite и D3DXFont реализован внутри самого D3DX. Таким образом, он устанавливает свои собственные шейдеры, состояния (эмулирует конвейер с фиксированной функцией) и отображает текст / спрайты. Итак, ваши шейдеры и состояния не влияют на эти объекты. Вы можете реализовать свою собственную подсистему рендеринга текста / спрайта, это не так сложно. Еще один голос за это - Microsoft официально осудила D3DX.

...