2011-02-16 84 views
1

這是關係到Setting up the constant buffer using SlimDX在SlimDX傳遞參數給定緩衝區的Direct3D 11

我有個着色器,這是非常簡單的,看起來像這樣:

cbuffer ConstantBuffer : register(b0) 
{ 
    float4 color; 
} 

float4 VShader(float4 position : POSITION) : SV_POSITION 
{ 
    return position; 
} 

float4 PShader(float4 position : SV_POSITION) : SV_Target 
{ 
    return color; 
} 

它所做的就是應用的顏色通過常量緩衝區傳遞給每個繪製的像素,非常簡單。

在我的代碼,我定義我的常量緩衝區如下:

[StructLayout(LayoutKind.Explicit)] 
     struct ConstantBuffer 
     { 
      [FieldOffset(0)] 
      public Color4 Color; 
     } 

在這裏設置它,在我的渲染循環。

ConstantBuffer cb = new ConstantBuffer(); 
cb.Color = new Color4(Color.White); 
using (DataStream data = new DataStream(Marshal.SizeOf(typeof(ConstantBuffer)), true, true))   
{ 
    data.Write(cb); 
    data.Position = 0; 
    D3D.Buffer buffer = new D3D.Buffer(device,data, new BufferDescription 
    { 
     Usage = ResourceUsage.Default, 
     SizeInBytes = Marshal.SizeOf(typeof(ConstantBuffer)), 
     BindFlags = BindFlags.ConstantBuffer 
    }); 
    context.UpdateSubresource(new DataBox(0, 0, data), buffer, 0); 
} 

上下文是我的device.ImmediateContext和設備是我的Direct3D設備。然而,當它運行時,它將我的像素繪製爲黑色,儘管已經通過了白色的顏色,所以顯然沒有設置值。

有人有什麼想法嗎?

回答

1

您必須創建D3D.Buffer對象一次,根據需要隨時更新它(您將初始數據指定爲構造函數參數,因此如果您要始終有一個白色對象,則無需調用UpdateSubresource),並在發出繪圖調用之前將其綁定到管道(context.PixelShader.SetConstantBuffer(buffer, 0))。

+0

完美,非常感謝! – 2011-02-16 15:40:14