protected override void CreateGpuBuffer(Buffer buffer) { ShaderStorageBuffer arrayBuffer = (ShaderStorageBuffer)buffer; // Create CPU buffer with 16 elements arrayBuffer.Create(_Context, 16); }
public void ShaderStorageBuffer_TestShaderProgram() { if (!_Context.Extensions.ComputeShader_ARB) { Assert.Inconclusive("GL_ARB_compute_shader not supported"); } if (!_Context.Extensions.ShaderStorageBufferObject_ARB) { Assert.Inconclusive("GL_ARB_shader_storage_buffer_object not supported"); } const uint Size = 1024; using (ShaderProgram program = new ShaderProgram("")) using (Shader computeShader = new Shader(ShaderType.ComputeShader)) using (ShaderStorageBuffer storageBuffer = new ShaderStorageBuffer(MapBufferUsageMask.MapReadBit)) { computeShader.LoadSource(new[] { "#version 430", "layout(local_size_x = 1, local_size_y = 1) in;", "layout(std430, binding = 3) buffer glo_Buffer {", " uint data[];", "};", "", "void main() {", " data[gl_WorkGroupID.x * gl_WorkGroupID.y] = uint(gl_WorkGroupID.x * gl_WorkGroupID.y);", "}" }); program.Attach(computeShader); program.Create(_Context); storageBuffer.Create(_Context, Size * Size * 4); program.SetStorageBuffer(_Context, "glo_Buffer", storageBuffer); program.Compute(_Context, Size, Size); program.MemoryBarrier(MemoryBarrierMask.ShaderStorageBarrierBit); uint[] storage = new uint[Size * Size]; storageBuffer.Load(_Context, storage, Size * Size * 4); for (uint x = 0; x < Size; x++) { for (uint y = 0; y < Size; y++) { Assert.AreEqual(x * y, storage[x * y]); } } } }
protected override void DoInitialize() { base.DoInitialize(); using (var buffer = new ShaderStorageBuffer <vec4>(BufferUsage.StaticDraw)) { buffer.Create(vertexCount); unsafe { var array = (vec4 *)buffer.Header.ToPointer(); array[0] = new vec4(0, 0, 1, 1); array[1] = new vec4(1, 0, 0, 1); array[2] = new vec4(-1, 0, 0, 1); array[3] = new vec4(0, 1, 0, 1); } var bufferPtr = buffer.GetBufferPtr() as ShaderStorageBufferPtr; bufferPtr.Binding(this.Program, "PositionBuffer", 0); bufferPtr.Unbind(); //this.shaderStorageBufferPtr = bufferPtr; } using (var buffer = new ShaderStorageBuffer <vec4>(BufferUsage.StaticDraw)) { buffer.Create(vertexCount); unsafe { var array = (vec4 *)buffer.Header.ToPointer(); array[0] = new vec4(+1, +0, +0, 0); array[1] = new vec4(+0, +1, +0, 0); array[2] = new vec4(+0, +0, +1, 0); array[3] = new vec4(+1, +1, +1, 0); //array[0] = new vec3(new vec3(0, 0, 0)); //array[1] = new vec3(new vec3(1, 1, +1)); //array[2] = new vec3(new vec3(0, +1, 0)); } var bufferPtr = buffer.GetBufferPtr() as ShaderStorageBufferPtr; bufferPtr.Binding(this.Program, "ColorBuffer", 1); bufferPtr.Unbind(); //this.shaderStorageBufferPtr = bufferPtr; } this.groundRenderer.Initialize(); }
protected override void DoInitialize() { base.DoInitialize(); { const int length = vertexCount; ShaderStorageBuffer buffer = ShaderStorageBuffer.Create(typeof(vec4), length, BufferUsage.StaticDraw); IntPtr pointer = buffer.MapBuffer(MapBufferAccess.WriteOnly); unsafe { var array = (vec4 *)pointer; array[0] = new vec4(0, 0, 1, 1); array[1] = new vec4(1, 0, 0, 1); array[2] = new vec4(-1, 0, 0, 1); array[3] = new vec4(0, 1, 0, 1); } buffer.UnmapBuffer(); buffer.Binding(this.Program, "PositionBuffer", 0); buffer.Unbind(); //this.shaderStorageBuffer = buffer; } { const int length = vertexCount; ShaderStorageBuffer buffer = ShaderStorageBuffer.Create(typeof(vec4), length, BufferUsage.StaticDraw); IntPtr pointer = buffer.MapBuffer(MapBufferAccess.WriteOnly); unsafe { var array = (vec4 *)pointer; array[0] = new vec4(+1, +0, +0, 0); array[1] = new vec4(+0, +1, +0, 0); array[2] = new vec4(+0, +0, +1, 0); array[3] = new vec4(+1, +1, +1, 0); } buffer.Binding(this.Program, "ColorBuffer", 1); buffer.Unbind(); //this.shaderStorageBuffer = buffer; } this.groundRenderer.Initialize(); }
protected override void DoInitialize() { base.DoInitialize(); var texture = new Texture(TextureTarget.Texture2D, new NullImageFiller(WIDTH, HEIGHT, OpenGL.GL_RGBA8, OpenGL.GL_RGBA, OpenGL.GL_UNSIGNED_BYTE), new SamplerParameters( TextureWrapping.Repeat, TextureWrapping.Repeat, TextureWrapping.Repeat, TextureFilter.Linear, TextureFilter.Linear)); texture.Initialize(); this.texture = texture; this.SetUniform("u_texture", texture); { var shaderCodes = new ShaderCode[] { new ShaderCode(File.ReadAllText(@"shaders\RayTracingRenderer\raytrace.comp.glsl"), ShaderType.ComputeShader), }; this.computeProgram = shaderCodes.CreateProgram(); this.computeProgram.Bind(); g_directionBuffer.glusRaytracePerspectivef( DIRECTION_BUFFER_PADDING, 30.0f, WIDTH, HEIGHT); using (var buffer = new ShaderStorageBuffer <float>(BufferUsage.StaticDraw)) { buffer.Create(g_directionBuffer.Length); unsafe { var array = (float *)buffer.Header.ToPointer(); for (int i = 0; i < g_directionBuffer.Length; i++) { array[i] = g_directionBuffer[i]; } } this.g_directionSSBO = buffer.GetBufferPtr() as ShaderStorageBufferPtr; } using (var buffer = new ShaderStorageBuffer <float>(BufferUsage.StaticDraw)) { buffer.Create(g_positionBuffer.Length); unsafe { var array = (float *)buffer.Header.ToPointer(); for (int i = 0; i < g_positionBuffer.Length; i++) { array[i] = g_positionBuffer[i]; } } this.g_positionSSBO = buffer.GetBufferPtr() as ShaderStorageBufferPtr; } using (var buffer = new ShaderStorageBuffer <float>(BufferUsage.StaticDraw)) { buffer.Create(g_stackBuffer.Length); unsafe { var array = (float *)buffer.Header.ToPointer(); for (int i = 0; i < g_stackBuffer.Length; i++) { array[i] = g_stackBuffer[i]; } } this.g_stackSSBO = buffer.GetBufferPtr() as ShaderStorageBufferPtr; } using (var buffer = new ShaderStorageBuffer <Sphere>(BufferUsage.StaticDraw)) { buffer.Create(g_sphereBuffer.Length); unsafe { var array = (Sphere *)buffer.Header.ToPointer(); for (int i = 0; i < g_sphereBuffer.Length; i++) { array[i] = g_sphereBuffer[i]; } } this.g_sphereSSBO = buffer.GetBufferPtr() as ShaderStorageBufferPtr; } using (var buffer = new ShaderStorageBuffer <PointLight>(BufferUsage.StaticDraw)) { buffer.Create(g_lightBuffer.Length); unsafe { var array = (PointLight *)buffer.Header.ToPointer(); for (int i = 0; i < g_lightBuffer.Length; i++) { array[i] = g_lightBuffer[i]; } } this.g_pointLightSSBO = buffer.GetBufferPtr() as ShaderStorageBufferPtr; } } }
public void ShaderStorageBuffer_TestCreation() { using (ShaderStorageBuffer ssbo = new ShaderStorageBuffer(BufferUsage.DynamicDraw)) { ssbo.Create(_Context, (uint)Math.Min(1024 * 1024, _Context.Limits.MaxShaderStorageBlockSize)); } }