2014-09-28 59 views
0

我有一個着色器不再繪製正確。它在XNA中工作,但必須重寫DX11和SharpDX,現在使用着色器模型5.沒有例外,着色器效果編譯得很好,沒有來自設備的調試層消息,除了無關的(?)默認採樣器 - 狀態投訴。這是一個普通的,全屏幕的四邊形做最簡單的紋理blit。 (使用用於測試的隨機噪聲紋理)SharpDX D3D11 VertexElement格式不匹配?

Vertex Problem Example

我饋送頂點着色器一個VertexPositionTexutre,其中包含一個SharpDX對象:

[VertexElement("SV_Position")] 
public Vector3 Position; 
[VertexElement("TEXCOORD0")] 
public Vector2 TextureCoordinate; 

我懷疑有簽名之間的失配。 VertexPositionTexture有一個爲「SV_Position」定義的Vector3位置組件。

D3D11 defines「SV_Position」作爲float4。它是一個帶有具體本地類型的系統值常量。我擔心着色器會在Vector3的float3結束之後吃額外的浮點數。這也可以解釋爲什麼我的UV在幾個頂點被破壞。

這是我的頂點着色器:

struct V2P 
{ 
    float4 vPosition : SV_Position; 
    float2 vTexcoord : TEXCOORD0; 
}; 

V2P VSCopy(float4 InPos : SV_Position, 
        float2 InTex : TEXCOORD0) 
{ 
    V2P Out = (V2P)0; 

    // transform the position to the screen 
    Out.vPosition = float4(InPos); 
    Out.vTexcoord = InTex; 

    return Out; 
} 

我曾嘗試的VSCopy()輸入從float4在結果沒有變化而變化,以float3。在重新編譯SharpDX VertexPositionTexture之後,我看不出如何解決這個問題,但SharpDX完全支持DirectX11,所以我必須做一些不正確的事情。

我定義我的頂點,並且將它們設置如下:

//using SharpDX.Toolkit.Graphics 
[...]//In the initialization 
    verts = new VertexPositionTexture[] 
    { 
     new VertexPositionTexture(
      new Vector3(1.0f,-1.0f,0), 
      new Vector2(1,1)), 
     new VertexPositionTexture(
      new Vector3(-1.0f,-1.0f,0), 
      new Vector2(0,1)), 
     new VertexPositionTexture(
      new Vector3(-1.0f,1.0f,0), 
      new Vector2(0,0)), 
     new VertexPositionTexture(
      new Vector3(1.0f,1.0f,0), 
      new Vector2(1,0)) 
    } 

    //vb is a Buffer<VertexPositionTexture> 
    short[] indeces = new short[] { 0, 1, 2, 2, 3, 0 }; 
     vb = SharpDX.Toolkit.Graphics.Buffer.Vertex.New(Game.Instance.GraphicsDevice, verts, SharpDX.Direct3D11.ResourceUsage.Dynamic); 
     ib = SharpDX.Toolkit.Graphics.Buffer.Index.New(Game.Instance.GraphicsDevice, indeces, dx11.ResourceUsage.Dynamic); 

     [...] //In the Render method, called every frame to draw the quad 
     Game.Instance.GraphicsDevice.SetVertexBuffer<VertexPositionTexture>(vb, 0); 
     Game.Instance.GraphicsDevice.SetIndexBuffer(ib, false); 
     Game.Instance.GraphicsDevice.DrawIndexed(PrimitiveType.TriangleList, 6); 
+0

你是如何創建頂點緩衝區和輸入佈局的? – megadan 2014-09-29 20:38:44

+0

我已經更新瞭如何設置頂點和索引緩衝區的問題 – selkathguy 2014-09-29 22:27:16

+1

您是否正在創建'VertexInputLayout'並調用'SetVertexInputLayout'? – megadan 2014-09-29 22:49:19

回答

0

SharpDX.Tookit提供用於指定InputLayout頂點着色器的方法。我錯過了這個方法,並錯誤地試圖通過屬性來設置頂點輸入佈局:

SharpDX.Direct3D11.ImmediateContext.InputAssembler.InputLayout 

必須通過SharpDX.Toolkit.Graphics.GraphicsDevice.SetVertexInputLayout();方法設置輸入佈局。