Как вы применяете вершинный шейдер в C # для D3D9? - PullRequest
0 голосов
/ 12 февраля 2019

Я пытаюсь написать программу ac # для применения вершинного шейдера с помощью SharpDx.Я не уверен, какие функции нужно вызывать.Цель шейдера - сделать графику немного лучше, потому что она выглядит пиксельной.

Я написал программу на c ++ и доказал, что мой вершинный шейдер работает.Теперь я хочу попробовать написать на c # с помощью SharpDx, но похоже, что шейдер никогда не применяется.Я должен использовать Direct3D9 и не могу обновить до 11.

Вот код шейдера:

//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------

float4x4 gWorldViewProjMatrix;

//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
void spriteVS(in  float4 inPos       : POSITION0,
          in  float2 inTex0      : TEXCOORD0,

          out float4 oPos        : POSITION0,
          out float2 oTex0       : TEXCOORD0
         )
{
  //-- fix half pixel offset problem with sprites.
  inPos.x -= 0.5f;
  inPos.y += 0.5f;

  inPos.w  = 1.0f;

  //-- transform into screenspace
  oPos    = mul(inPos, gWorldViewProjMatrix);

  oTex0   = inTex0;
}

//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
technique Shader
{
   pass
   {
      VertexShader = compile vs_3_0 spriteVS();
      PixelShader = NULL;
   }
}

Вот как я инициализирую шейдер:

public class StandardVertexShader
  {
    public Effect m_vertexShaderEffect { get; set; }

    public BaseEffect m_baseEffect { get; set; }

    public EffectHandle m_EffectParamWorldMatrix { get; set; }

    public VertexShader m_vertexShader { get; set; }

    public EffectHandle shaderFunction { get; set; }

    public void InitEffect( Device d3dDevice )
    {
      // Read the shader binary
      ShaderBytecode VertexShaderByteCode = ShaderBytecode.FromFile("..\\DirectX\\Shaders\\shader.bin");

      // Store the effect read from the file
      m_vertexShaderEffect = Effect.FromStream(d3dDevice, VertexShaderByteCode.Data, ShaderFlags.None);

      // At this point I think the technique is already chosen. No need to validate?

      // pass the effect over to the base effect class
      m_baseEffect = new BaseEffect(m_vertexShaderEffect.NativePointer);

      // Get the technique from the base effect class
      m_vertexShaderEffect.Technique = m_baseEffect.GetTechnique("Shader");

      // validate the technique
     m_vertexShaderEffect.ValidateTechnique(m_vertexShaderEffect.Technique);

      // get the world matrix from the binary
      m_EffectParamWorldMatrix = m_vertexShaderEffect.GetParameter(null, "gWorldViewProjMatrix");

    }

Вот где я на самом деле пытаюсь использовать шейдер:

// Setup the world matrix (Identity)
Matrix worldMatrix = new Matrix();
worldMatrix.SetIdentity();
RawMatrix rawWorldMatrix = worldMatrix.GetRawMatrix();

// Setup View Matrix
RawMatrix viewMatrix = D3DDevice.GetTransform(TransformState.View);

// Setup Projection Matrix
Matrix projectionMatrix = new Matrix();
projectionMatrix.SetOrthographicProjection(clientWidth, clientHeight, 0.1f, 1000.0f);
RawMatrix rawProjMatrix = projectionMatrix.GetRawMatrix();

// Set all of the transforms
D3DDevice.SetTransform(TransformState.World, rawWorldMatrix);
D3DDevice.SetTransform(TransformState.View, viewMatrix);
D3DDevice.SetTransform(TransformState.Projection, rawProjMatrix); 

// Setup the WorldViewProj Matrix
worldViewProjMatrix = projectionMatrix.GetTranspose();
RawMatrix tempMatrix = worldViewProjMatrix.GetRawMatrix();
m_vertexShader.m_vertexShaderEffect.SetValue(
      m_vertexShader.m_EffectParamWorldMatrix, tempMatrix);

m_vertexShader.SetTechnique("Shader");

m_vertexDeclaration.Set();
m_vertexShader.m_vertexShaderEffect.Begin();
m_vertexShader.m_vertexShaderEffect.BeginPass(0);

Render();

m_vertexShader.m_vertexShaderEffect.EndPass();
m_vertexShader.m_vertexShaderEffect.End();

Я ожидал, что графика будет выглядеть чище, как это было для моей программы на С ++, но похоже, что ничего не происходит.Я даже попробовал большее смещение на inPos.x и inPos.y, установив их в 100.0f в реальном шейдере, чтобы доказать себе, что это не работает

...