I'm rather now to directx and slim dx and i'm trying to figure out a strange occurence i'm having. I trying to display a triangle but for some reason the viewport is empty. I have set the world and the camera. it's passing through the vertex shader but after that nothing.
Here is my code... be gentle this is a big WIP. I'm still grasping some of the basics of Directx.
Any help would be appreciated. Thanks
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using System.Windows.Forms;
using System.Drawing;
using SlimDX;
using SlimDX.D3DCompiler;
using SlimDX.Direct3D11;
using SlimDX.DXGI;
using SlimDX.Windows;
using SlimDX.Design;
using SlimDX.DirectInput;
using Device = SlimDX.Direct3D11.Device;
using Resource = SlimDX.Direct3D11.Resource;
using Buffer = SlimDX.Direct3D11.Buffer;
namespace WindowsFormsApplication7
{
class directx
{
// Direct X Variables
Device device;
SwapChain swapChain;
RenderTargetView renderTarget;
VertexShader vertexShader;
PixelShader pixelShader;
ShaderSignature inputSignature;
DataStream vertices;
Buffer vertexBuffer;
InputLayout layout;
InputElement[] elements;
DeviceContext context;
Viewport viewport;
DepthStencilView depthStencilView;
Texture2D depthStencilBuffer;
Texture2DDescription depthStencilDesc;
SampleDescription sampleDesc;
Buffer cbPerObjectBuffer;
BufferDescription cbbd;
DepthStencilStateDescription dssd;
DepthStencilState dss;
// World and Camera Matrix
Matrix WVP;
Matrix World;
Matrix camView;
Matrix camProjection;
Vector3 camPosition;
Vector3 camTarget;
Vector3 camUp;
Panel WhereToDraw;
Color BGColor;
// Depth Buffer Variables
struct cbPerObject
{
public Matrix WVP;
};
cbPerObject cbPerObj;
// Class Creator
public directx(Panel ptd)
{
WhereToDraw = ptd;
BGColor = Color.Blue;
Initialise3D();
SetCamera();
SetWorld();
}
// Class Desctructor
~directx()
{
layout.Dispose();
renderTarget.Dispose();
swapChain.Dispose();
vertexShader.Dispose();
pixelShader.Dispose();
vertices.Dispose();
context.Dispose();
inputSignature.Dispose();
depthStencilView.Dispose();
depthStencilBuffer.Dispose();
device.Dispose();
}
private void Initialise3D()
{
// Create the SwapChain Description
#region Swapchain
var description = new SwapChainDescription()
{
BufferCount = 1,
Usage = Usage.RenderTargetOutput,
OutputHandle = WhereToDraw.Handle,
IsWindowed = true,
ModeDescription = new ModeDescription(WhereToDraw.Width, WhereToDraw.Height, new Rational(60, 1), Format.R8G8B8A8_UNorm),
SampleDescription = new SampleDescription(1, 0),
Flags = SwapChainFlags.AllowModeSwitch,
SwapEffect = SwapEffect.Discard
};
// Create the SwapChain
Device.CreateWithSwapChain(DriverType.Hardware, DeviceCreationFlags.Debug, description, out device, out swapChain);
// create a view of our render target, which is the backbuffer of the swap chain we just created
using (var resource = Resource.FromSwapChain<Texture2D>(swapChain, 0))
{
renderTarget = new RenderTargetView(device, resource);
}
#endregion
//Setup the vertex shader and Pixel Shader
using (var bytecode = ShaderBytecode.CompileFromFile("vertexshader.vs", "VS", "vs_4_0", ShaderFlags.Debug, SlimDX.D3DCompiler.EffectFlags.None))
{
vertexShader = new VertexShader(device, bytecode);
inputSignature = ShaderSignature.GetInputSignature(bytecode);
}
using (var bytecode = ShaderBytecode.CompileFromFile("vertexshader.vs", "PS", "ps_4_0", ShaderFlags.Debug, SlimDX.D3DCompiler.EffectFlags.None))
pixelShader = new PixelShader(device, bytecode);
// Set Depth Stencil Buffer Description
dssd = new DepthStencilStateDescription();
dssd.IsDepthEnabled = true;
dssd.IsStencilEnabled =false;
dssd.DepthWriteMask = DepthWriteMask.All;
dssd.DepthComparison = Comparison.Less;
dss = DepthStencilState.FromDescription(device, dssd);
// Set the depth Buffer
#region depthbuffer
sampleDesc = new SampleDescription(1, 0);
depthStencilDesc = new Texture2DDescription();
depthStencilDesc.Width = WhereToDraw.Width;
depthStencilDesc.Height = WhereToDraw.Height;
depthStencilDesc.MipLevels = 1;
depthStencilDesc.ArraySize = 1;
depthStencilDesc.Format = Format.D32_Float;
depthStencilDesc.Usage = ResourceUsage.Default;
depthStencilDesc.BindFlags = BindFlags.DepthStencil;
depthStencilDesc.OptionFlags = ResourceOptionFlags.None;
depthStencilDesc.CpuAccessFlags = CpuAccessFlags.None;
depthStencilDesc.SampleDescription = sampleDesc;
depthStencilBuffer = new Texture2D(device, depthStencilDesc);
depthStencilView = new DepthStencilView(device, depthStencilBuffer);
#endregion
// setting a viewport is required if you want to actually see anything
#region Viewport
viewport = new Viewport(0.0f, 0.0f, WhereToDraw.Width, WhereToDraw.Height);
viewport.MaxZ = 1.0f;
viewport.MinZ = 0.0f;
context = device.ImmediateContext;
context.OutputMerger.DepthStencilState = dss;
context.OutputMerger.SetTargets(depthStencilView, renderTarget);
context.Rasterizer.SetViewports(viewport);
#endregion
}
private void SetWorld()
{
// Set Constant Buffer Description
cbbd = new BufferDescription();
cbbd.Usage = ResourceUsage.Default;
cbbd.SizeInBytes = Marshal.SizeOf(typeof(cbPerObject));
cbbd.BindFlags = BindFlags.ConstantBuffer;
cbbd.CpuAccessFlags = 0;
cbbd.OptionFlags = 0;
// Set The World
World = Matrix.Identity;
WVP = World * camView * camProjection;
cbPerObj.WVP = Matrix.Transpose(WVP);
Matrix.Translation(ref camPosition, out World);
DataStream ds = new DataStream(Marshal.SizeOf(typeof(cbPerObject)), true, true);
ds.Write(cbPerObj);
ds.Position = 0;
cbPerObjectBuffer = new Buffer(device,ds, cbbd);
context.VertexShader.SetConstantBuffer(cbPerObjectBuffer, 0);
}
private void SetCamera()
{
// Set The Camera
camPosition = new Vector3(0.0f, 0.0f, -0.5f);
camTarget = new Vector3(0.0f, 0.0f, 0.0f);
camUp = new Vector3(0.0f, 1.0f, 0.0f);
camView = Matrix.LookAtLH(camPosition, camTarget, camUp);
camProjection = Matrix.PerspectiveFovLH(0.4f *3.14f , (float)WhereToDraw.Width /WhereToDraw.Height, 1.0f, 1000.0f);
}
public void CreateShape()
{
int val = Marshal.SizeOf(typeof(Vector3));
vertices = new DataStream(val * 3, true, true);
vertices.Write(new Vector3(0.0f, 0.5f, 0.5f));
vertices.Write(new Vector3(0.5f, -0.5f, 0.5f));
vertices.Write(new Vector3(-0.5f, -0.5f, 0.5f));
// vertices.Write(new Vector3(0.5f, 0.5f, 0.0f));
vertices.Position = 0;
// create the vertex layout and buffer
elements = new[]
{
new InputElement("POSITION", 0, Format.R32G32B32_Float, 0, 0)
};
layout = new InputLayout(device, inputSignature, elements);
vertexBuffer = new Buffer(device, vertices, Marshal.SizeOf(typeof(Vector3)) * 3, ResourceUsage.Default, BindFlags.VertexBuffer, CpuAccessFlags.None, ResourceOptionFlags.None, 0);
// configure the Input Assembler portion of the pipeline with the vertex data
context.InputAssembler.InputLayout = layout;
context.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleList;
context.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(vertexBuffer, Marshal.SizeOf(typeof(Vector3)), 0));
context.VertexShader.Set(vertexShader);
context.PixelShader.Set(pixelShader);
}
public void DrawScene(Form1 formToRender)
{
MessagePump.Run(formToRender, () =>
{
// clear the render target to a soothing blue
context.ClearRenderTargetView(renderTarget, BGColor);
// clear the depth stencil buffer
context.ClearDepthStencilView(depthStencilView, DepthStencilClearFlags.Depth | DepthStencilClearFlags.Stencil, 1.0f, 0);
// draw the image
context.Draw(3, 0);
swapChain.Present(0, PresentFlags.None);
});
}
public void ChangeBGColor(Color bgcolor)
{
BGColor = bgcolor;
}
}
}
Here is my shader file :
cbuffer cbPerObject
{
float4x4 WVP;
};
float4 VS(float4 inPos : POSITION) : SV_POSITION
{
float4 output;
output = mul(inPos,WVP);
return output;
}
float4 PS(float4 position : SV_POSITION) : SV_Target
{
return float4(1.0f, 1.0f, 0.0f, 1.0f);
}
The PIX windows capture is attached to this topic.







