Created
December 24, 2015 08:55
-
-
Save SoulFireMage/6f87b9b3815643026efa to your computer and use it in GitHub Desktop.
A quick attempt to learn to use Shaders
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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