I have attempted to convert the SimpleTriangle sample to VB with mixed success. While I can create a Window to draw to and clear it to a background colour, I cannot seem to actually draw my triangle. I cannot for the life of me tell where the code is falling over. When I run it, I get the window (with a red background as expected) but now triangle. Can any one shed some light? Code is below - the TEMP.RunMe method is called from Sub Main.
Imports SlimDX.Direct3D11
Imports SlimDX
Imports SlimDX.D3DCompiler
Imports SlimDX.DXGI
Imports SlimDX.Windows
Imports Device = SlimDX.Direct3D11.Device
Imports Resource = SlimDX.Direct3D11.Resource
Namespace Test
Class TEMP
Public form = New RenderForm("MyTest")
Public device As Device
Public swapChain As SwapChain
Public viewport As New Viewport
Public renderTarget As RenderTargetView
Public context As DeviceContext
Public Sub New()
Dim Vertices As DataStream
Dim vertexBuffer As Buffer
Dim vertexShader As VertexShader
Dim pixelShader As PixelShader
Dim inputSignature As ShaderSignature
Dim description As New SwapChainDescription()
Dim elements() As InputElement
Dim layout As InputLayout
With description
.BufferCount = 1
.Usage = Usage.RenderTargetOutput
.OutputHandle = form.handle
.IsWindowed = True
.ModeDescription = New ModeDescription(0, 0, New Rational(60, 1), DXGI.Format.R8G8B8A8_UNorm)
.SampleDescription = New SampleDescription(1, 0)
.Flags = DXGI.SwapChainFlags.AllowModeSwitch
.SwapEffect = DXGI.SwapEffect.Discard
End With
Direct3D11.Device.CreateWithSwapChain(DriverType.Hardware, DeviceCreationFlags.None, description, device, swapChain)
viewport = New Viewport(0.0F, 0.0F, form.clientsize.width, form.clientsize.height)
context = device.ImmediateContext
context.OutputMerger.SetTargets(renderTarget)
context.Rasterizer.SetViewports(viewport)
Using resource As Resource = Direct3D11.Resource.FromSwapChain(Of Texture2D)(swapChain, 0)
renderTarget = New RenderTargetView(device, resource)
End Using
Using bytecode = ShaderBytecode.CompileFromFile("triangle.fx", "VShader", "vs_4_0", ShaderFlags.None, EffectFlags.None)
inputSignature = ShaderSignature.GetInputSignature(bytecode)
vertexShader = New VertexShader(device, bytecode)
End Using
Using bytecode = ShaderBytecode.CompileFromFile("triangle.fx", "PShader", "ps_4_0", ShaderFlags.None, EffectFlags.None)
pixelShader = New PixelShader(device, bytecode)
End Using
Vertices = New DataStream(12 * 3, True, True)
With Vertices
.Write(New Vector3(0.0F, 0.5F, 0.5F))
.Write(New Vector3(0.5F, -0.5F, 0.5F))
.Write(New Vector3(-0.5F, -0.5F, 0.5F))
.Position = 0
End With
elements = {New InputElement("POSITION", 0, Format.R32G32B32_Float, 0)}
layout = New InputLayout(device, inputSignature, elements)
vertexBuffer = New Buffer(device, Vertices, 12 * 3, ResourceUsage.Default, BindFlags.VertexBuffer, CpuAccessFlags.None, ResourceOptionFlags.None, 0)
With context
.InputAssembler.InputLayout = layout
.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleList
.InputAssembler.SetVertexBuffers(0, New VertexBufferBinding(vertexBuffer, 12, 0))
.VertexShader.Set(vertexShader)
.PixelShader.Set(pixelShader)
End With
vertexBuffer.Dispose()
layout.Dispose()
vertexShader.Dispose()
pixelShader.Dispose()
inputSignature.Dispose()
End Sub
Private Sub mainLp()
With context
.ClearRenderTargetView(renderTarget, New Color4(1.0F, 0.0F, 0.0F))
.Draw(3, 0)
End With
swapChain.Present(0, PresentFlags.None)
End Sub
Public Sub RunMe()
MessagePump.Run(form, New MainLoop(AddressOf mainLp))
End Sub
Public Overloads Sub Dispose()
renderTarget.Dispose()
swapChain.Dispose()
device.Dispose()
End Sub
End Class
End Namespace
Traingle.fx contents are:
float4 VShader(float4 position : POSITION) : SV_POSITION
{
return position;
}
float4 PShader(float4 position : SV_POSITION) : SV_Target
{
return float4(1.0f, 1.0f, 0.0f, 1.0f);
}
I have just found my problem. I try to use the renderTarget variable in the statement context.OutputMerger.SetTargets(renderTarget) before renderTarget has been initialized. Moving the statement after renderTarget=New RenderTargetView(device,resource) solves the problem.
Don't know how I missed that!