Skip to content

Instantly share code, notes, and snippets.

@SoulFireMage
Created December 24, 2015 08:55
Show Gist options
  • Save SoulFireMage/6f87b9b3815643026efa to your computer and use it in GitHub Desktop.
Save SoulFireMage/6f87b9b3815643026efa to your computer and use it in GitHub Desktop.
A quick attempt to learn to use Shaders
open SlimDX
open SlimDX.D3DCompiler
open SlimDX.Direct3D11
open SlimDX.Windows
open SlimDX.DXGI
open System.Windows.Forms
open System.Drawing
[<EntryPoint>]
let main args =
let form = new RenderForm("Test Window")
let width, height = 1280, 1280
do form.SetBounds(0, 0, width, height)
let swapChainDescription =
new SwapChainDescription(
BufferCount = 1,
Usage = (Usage.RenderTargetOutput ||| Usage.UnorderedAccess),
OutputHandle = form.Handle,
IsWindowed = true,
ModeDescription = ModeDescription(0, 0, Rational(60, 1), Format.R8G8B8A8_UNorm),
SampleDescription = SampleDescription(1, 0))
let result, device, swapChain =
Device.CreateWithSwapChain(
DriverType.Hardware,
DeviceCreationFlags.None,
[|FeatureLevel.Level_11_0|],
swapChainDescription)
let renderTarget =
use renderResource = Resource.FromSwapChain<Texture2D>(swapChain, 0)
new RenderTargetView(device, renderResource)
let computeShader =
let code = @"
RWTexture2D<float4> Output;
[numthreads(32, 32, 1)]
void main( uint3 threadID : SV_DispatchThreadID )
{
for (int i = 1.0f; i <= 1280.0f; i+=320.0f){
Output[threadID.xy] = float4(threadID.xy / i, 0, 1);
}
}
"
use bytecode = ShaderBytecode.Compile(code, "main", "cs_5_0", ShaderFlags.None, EffectFlags.None)
new ComputeShader(device, bytecode)
let computeResult = new UnorderedAccessView(device, renderTarget.Resource)
let context = device.ImmediateContext
context.ComputeShader.Set(computeShader);
context.ComputeShader.SetUnorderedAccessView(computeResult, 0);
// set viewport
context.Rasterizer.SetViewports(Viewport(0.0f, 0.0f, float32 width, float32 height, 0.0f, 1.0f))
// runs per frame
MessagePump.Run(form, MainLoop(fun () ->
// clear render buffer to black
context.ClearRenderTargetView(renderTarget, Color4())
// run compute shader
context.Dispatch(32, 32, 1);
// copy output buffer to screen
swapChain.Present(0, PresentFlags.None) |> ignore
))
0 // return an integer exit code
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment