static GraphicsBufferView CreateVertexBufferView(GraphicsCopyContext copyContext, GraphicsBuffer vertexBuffer, GraphicsBuffer uploadBuffer, float aspectRatio) { var uploadBufferView = uploadBuffer.CreateBufferView <IdentityVertex>(3); var vertexBufferSpan = uploadBufferView.Map <IdentityVertex>(); { vertexBufferSpan[0] = new IdentityVertex { Color = Colors.Red, Position = Vector3.Create(0.0f, 0.25f * aspectRatio, 0.0f), }; vertexBufferSpan[1] = new IdentityVertex { Color = Colors.Lime, Position = Vector3.Create(0.25f, -0.25f * aspectRatio, 0.0f), }; vertexBufferSpan[2] = new IdentityVertex { Color = Colors.Blue, Position = Vector3.Create(-0.25f, -0.25f * aspectRatio, 0.0f), }; } uploadBufferView.UnmapAndWrite(); var vertexBufferView = vertexBuffer.CreateBufferView <IdentityVertex>(3); copyContext.Copy(vertexBufferView, uploadBufferView); return(vertexBufferView); }
static GraphicsBufferView CreateVertexBufferView(GraphicsCopyContext copyContext, GraphicsBuffer vertexBuffer, GraphicsBuffer uploadBuffer, float aspectRatio) { var uploadBufferView = uploadBuffer.CreateBufferView <TextureVertex>(3); var vertexBufferSpan = uploadBufferView.Map <TextureVertex>(); { vertexBufferSpan[0] = new TextureVertex { Position = Vector3.Create(0.0f, 0.25f * aspectRatio, 0.0f), UV = Vector2.Create(0.5f, 0.0f) }; vertexBufferSpan[1] = new TextureVertex { Position = Vector3.Create(0.25f, -0.25f * aspectRatio, 0.0f), UV = Vector2.Create(1.0f, 1.0f) }; vertexBufferSpan[2] = new TextureVertex { Position = Vector3.Create(-0.25f, -0.25f * aspectRatio, 0.0f), UV = Vector2.Create(0.0f, 1.0f) }; } uploadBufferView.UnmapAndWrite(); var vertexBufferView = vertexBuffer.CreateBufferView <TextureVertex>(3); copyContext.Copy(vertexBufferView, uploadBufferView); return(vertexBufferView); }
static GraphicsBufferView CreateVertexBufferView(GraphicsCopyContext copyContext, GraphicsBuffer vertexBuffer, GraphicsBuffer uploadBuffer, float aspectRatio) { var uploadBufferView = uploadBuffer.CreateBufferView <Texture3DVertex>(4); var vertexBufferSpan = uploadBufferView.Map <Texture3DVertex>(); { vertexBufferSpan[0] = new Texture3DVertex { // Position = Vector3.Create(-0.5f, 0.5f, 0.0f), // y in this setup UVW = Vector3.Create(0, 1, 0.5f), // ^ z the origin o }; // | / is in the middle // | / of the rendered scene vertexBufferSpan[1] = new Texture3DVertex { // o------>x Position = Vector3.Create(0.5f, 0.5f, 0.0f), // UVW = Vector3.Create(1, 1, 0.5f), // 0 ----- 1 }; // | \ | // | \ | vertexBufferSpan[2] = new Texture3DVertex { // | \ | Position = Vector3.Create(0.5f, -0.5f, 0.0f), // 3-------2 UVW = Vector3.Create(1, 0, 0.5f), // }; vertexBufferSpan[3] = new Texture3DVertex { Position = Vector3.Create(-0.5f, -0.5f, 0.0f), UVW = Vector3.Create(0, 0, 0.5f), }; } uploadBufferView.UnmapAndWrite(); var vertexBufferView = vertexBuffer.CreateBufferView <Texture3DVertex>(4); copyContext.Copy(vertexBufferView, uploadBufferView); return(vertexBufferView); }
static GraphicsBufferView CreateVertexBufferView(GraphicsCopyContext copyContext, GraphicsBuffer vertexBuffer, GraphicsBuffer uploadBuffer, float aspectRatio) { var uploadBufferView = uploadBuffer.CreateBufferView <IdentityVertex>(4); var vertexBufferSpan = uploadBufferView.Map <IdentityVertex>(); { vertexBufferSpan[0] = new IdentityVertex { // Color = Colors.Red, // y in this setup Position = Vector3.Create(-0.25f, 0.25f * aspectRatio, 0.0f), // ^ z the origin o }; // | / is in the middle // | / of the rendered scene vertexBufferSpan[1] = new IdentityVertex { // o------>x Color = Colors.Blue, // Position = Vector3.Create(0.25f, 0.25f * aspectRatio, 0.0f), // 0 ----- 1 }; // | \ | // | \ | vertexBufferSpan[2] = new IdentityVertex { // | \ | Color = Colors.Lime, // 3-------2 Position = Vector3.Create(0.25f, -0.25f * aspectRatio, 0.0f), // }; vertexBufferSpan[3] = new IdentityVertex { Color = Colors.Blue, Position = Vector3.Create(-0.25f, -0.25f * aspectRatio, 0.0f), }; } uploadBufferView.UnmapAndWrite(); var vertexBufferView = vertexBuffer.CreateBufferView <IdentityVertex>(4); copyContext.Copy(vertexBufferView, uploadBufferView); return(vertexBufferView); }
private unsafe GraphicsPrimitive CreateSierpinskiPrimitive(GraphicsCopyContext copyContext) { var renderPass = RenderPass; var surface = renderPass.Surface; var graphicsPipeline = CreateGraphicsPipeline(renderPass, "Sierpinski", "main", "main"); var constantBuffer = _constantBuffer; var uploadBuffer = _uploadBuffer; (var vertices, var indices) = (_sierpinskiShape == SierpinskiShape.Pyramid) ? SierpinskiPyramid.CreateMeshTetrahedron(_recursionDepth) : SierpinskiPyramid.CreateMeshQuad(_recursionDepth); var normals = SierpinskiPyramid.MeshNormals(in vertices); var sierpinskiPrimitive = new GraphicsPrimitive( graphicsPipeline, CreateVertexBufferView(copyContext, _vertexBuffer, uploadBuffer, in vertices, in normals), CreateIndexBufferView(copyContext, _indexBuffer, uploadBuffer, in indices), new GraphicsResourceView[3] { CreateConstantBufferView(constantBuffer), CreateConstantBufferView(constantBuffer), CreateTexture3DView(copyContext, _texture3D, uploadBuffer), } ); normals.Dispose(); indices.Dispose(); vertices.Dispose(); return(sierpinskiPrimitive);
private unsafe GraphicsPrimitive CreateTrianglePrimitive(GraphicsCopyContext copyContext) { var renderPass = RenderPass; var surface = renderPass.Surface; var graphicsPipeline = CreateGraphicsPipeline(renderPass, "Identity", "main", "main"); var uploadBuffer = _uploadBuffer; return(new GraphicsPrimitive( graphicsPipeline, CreateVertexBufferView(copyContext, _vertexBuffer, uploadBuffer, aspectRatio: surface.PixelWidth / surface.PixelHeight) ));
private unsafe GraphicsPrimitive CreateTrianglePrimitive(GraphicsCopyContext copyContext) { var renderPass = RenderPass; var surface = renderPass.Surface; var graphicsPipeline = CreateGraphicsPipeline(renderPass, "Texture", "main", "main"); var uploadBuffer = _uploadBuffer; return(new GraphicsPrimitive( graphicsPipeline, CreateVertexBufferView(copyContext, _vertexBuffer, uploadBuffer, aspectRatio: surface.PixelWidth / surface.PixelHeight), resourceViews: new GraphicsResourceView[1] { CreateTexture2DView(copyContext, _texture2D, uploadBuffer) } ));
static GraphicsTextureView CreateTexture3DView(GraphicsCopyContext copyContext, GraphicsTexture texture3D, GraphicsBuffer uploadBuffer) { var uploadBufferView = uploadBuffer.CreateBufferView <byte>(checked ((uint)texture3D.ByteLength)); var textureDataSpan = uploadBufferView.Map <byte>(); { var width = texture3D.PixelWidth; var height = texture3D.PixelHeight; var bytesPerRow = texture3D.BytesPerRow; var depth = texture3D.PixelDepth; var bytesPerLayer = texture3D.BytesPerLayer; for (var z = 0u; z < depth; z++) { var layerIndex = z * bytesPerLayer; for (var y = 0u; y < height; y++) { var rowIndex = layerIndex + (y * bytesPerRow); var row = (uint *)textureDataSpan.GetPointer(rowIndex); for (var x = 0u; x < width; x++) { var red = x * 256u / width; var blue = y * 256u / height; var green = z * 256u / depth; var alpha = 0xFFu; row[x] = (alpha << 24) | (green << 16) | (blue << 8) | (red << 0); } } } } uploadBufferView.UnmapAndWrite(); var texture3DView = texture3D.CreateView(0, 1); copyContext.Copy(texture3DView, uploadBufferView); return(texture3DView); }
private unsafe GraphicsPrimitive CreateQuadPrimitive(GraphicsCopyContext copyContext) { var renderPass = RenderPass; var surface = renderPass.Surface; var graphicsPipeline = CreateGraphicsPipeline(renderPass, "Texture3D", "main", "main"); var constantBuffer = _constantBuffer; var uploadBuffer = _uploadBuffer; return(new GraphicsPrimitive( graphicsPipeline, CreateVertexBufferView(copyContext, _vertexBuffer, uploadBuffer, aspectRatio: surface.PixelWidth / surface.PixelHeight), CreateIndexBufferView(copyContext, _indexBuffer, uploadBuffer), new GraphicsResourceView[3] { CreateConstantBufferView(constantBuffer), CreateConstantBufferView(constantBuffer), CreateTexture3DView(copyContext, _texture3D, uploadBuffer), } ));
private unsafe GraphicsPrimitive CreateInstancedTrianglePrimitive(GraphicsCopyContext copyContext, uint instanceCount) { var renderPass = RenderPass; var surface = renderPass.Surface; var graphicsPipeline = CreateGraphicsPipeline(renderPass, "Instancing", "main", "main"); var constantBuffer = _constantBuffer; var uploadBuffer = _uploadBuffer; _aspectRatio = surface.PixelWidth / surface.PixelHeight; return(new GraphicsPrimitive( graphicsPipeline, CreateVertexBufferView(copyContext, _vertexBuffer, uploadBuffer, _aspectRatio), resourceViews: new GraphicsResourceView[2] { CreateConstantBufferView(constantBuffer, 1), CreateConstantBufferView(constantBuffer, instanceCount), } ));
static GraphicsTextureView CreateTexture2DView(GraphicsCopyContext copyContext, GraphicsTexture texture2D, GraphicsBuffer uploadBuffer) { var uploadBufferView = uploadBuffer.CreateBufferView <byte>(checked ((uint)texture2D.ByteLength)); var textureDataSpan = uploadBufferView.Map <byte>(); { var width = texture2D.PixelWidth; var height = texture2D.PixelHeight; var bytesPerRow = texture2D.BytesPerRow; var cellWidth = width / 8; var cellHeight = height / 8; for (var y = 0u; y < height; y++) { var rowIndex = y * bytesPerRow; var row = (uint *)textureDataSpan.GetPointer(rowIndex); for (var x = 0u; x < width; x++) { if ((x / cellWidth % 2) == (y / cellHeight % 2)) { row[x] = 0xFF000000; } else { row[x] = 0xFFFFFFFF; } } } } uploadBufferView.UnmapAndWrite(); var texture2DView = texture2D.CreateView(0, 1); copyContext.Copy(texture2DView, uploadBufferView); return(texture2DView); }
static GraphicsBufferView CreateIndexBufferView(GraphicsCopyContext copyContext, GraphicsBuffer indexBuffer, GraphicsBuffer uploadBuffer) { var uploadBufferView = uploadBuffer.CreateBufferView <ushort>(6); var indexBufferSpan = uploadBufferView.Map <ushort>(); { // clockwise when looking at the triangle from the outside indexBufferSpan[0] = 0; indexBufferSpan[1] = 1; indexBufferSpan[2] = 2; indexBufferSpan[3] = 0; indexBufferSpan[4] = 2; indexBufferSpan[5] = 3; } uploadBufferView.UnmapAndWrite(); var indexBufferView = indexBuffer.CreateBufferView <ushort>(6); copyContext.Copy(indexBufferView, uploadBufferView); return(indexBufferView); }
static GraphicsBufferView CreateIndexBufferView(GraphicsCopyContext copyContext, GraphicsBuffer indexBuffer, GraphicsBuffer uploadBuffer, in UnmanagedValueList <uint> indices)
static GraphicsTextureView CreateTexture3DView(GraphicsCopyContext copyContext, GraphicsTexture texture3D, GraphicsBuffer uploadBuffer, bool isQuickAndDirty) { var uploadBufferView = uploadBuffer.CreateBufferView <byte>(checked ((uint)texture3D.ByteLength)); var textureDataSpan = uploadBufferView.Map <byte>(); { var random = new Random(Seed: 20170526); var isOnBlurring = true; var width = texture3D.PixelWidth; var height = texture3D.PixelHeight; var bytesPerRow = texture3D.BytesPerRow; var depth = texture3D.PixelDepth; var bytesPerLayer = texture3D.BytesPerLayer; // start with random speckles for (var z = 0u; z < depth; z++) { var layerIndex = z * bytesPerLayer; for (var y = 0u; y < height; y++) { var rowIndex = layerIndex + (y * bytesPerRow); var row = (uint *)textureDataSpan.GetPointer(rowIndex); for (var x = 0u; x < width; x++) { // convert indices to fractions in the range [0, 1) var fx = (float)x / width; var fz = (float)z / depth; // make x,z relative to texture center fx -= 0.5f; fz -= 0.5f; // get radius from center, clamped to 0.5 var radius = MathF.Abs(fx); // MathF.Sqrt(fx * fx + fz * fz); if (radius > 0.5f) { radius = 0.5f; } // scale as 1 in center, tapering off to the edge var scale = 2 * MathF.Abs(0.5f - radius); // random value scaled by the above var rand = random.NextSingle(); if (isOnBlurring && (rand < 0.99)) { rand = 0; } uint value = (byte)(rand * scale * 255); row[x] = value | (value << 8) | (value << 16) | (value << 24); } } } if (isOnBlurring) { // now smear them out to smooth smoke splotches var falloffFactor = isQuickAndDirty ? 0.9f : 0.95f; for (var z = 0u; z < depth; z++) { var layerIndex = z * bytesPerLayer; for (var y = 0u; y < height; y++) { var rowIndex = layerIndex + (y * bytesPerRow); var row = (uint *)textureDataSpan.GetPointer(rowIndex); for (var x = 1u; x < width; x++) { if ((row[x] & 0xFF) < falloffFactor * (row[x - 1] & 0xFF)) { uint value = (byte)(falloffFactor * (row[x - 1] & 0xFF)); row[x] = value | (value << 8) | (value << 16) | (value << 24); } } for (var x = width - 2; x != uint.MaxValue; x = unchecked (x - 1)) { if ((row[x] & 0xFF) < falloffFactor * (row[x + 1] & 0xFF)) { uint value = (byte)(falloffFactor * (row[x + 1] & 0xFF)); row[x] = value | (value << 8) | (value << 16) | (value << 24); } } } } for (var z = 0u; z < depth; z++) { var layerIndex = z * bytesPerLayer; for (var x = 0u; x < width; x++) { for (var y = 1u; y < height; y++) { var rowIndex = layerIndex + (y * bytesPerRow); var row = (uint *)textureDataSpan.GetPointer(rowIndex); var previousRowIndex = rowIndex - bytesPerRow; var previousRow = (uint *)textureDataSpan.GetPointer(previousRowIndex); if ((row[x] & 0xFF) < falloffFactor * (previousRow[x] & 0xFF)) { uint value = (byte)(falloffFactor * (previousRow[x] & 0xFF)); row[x] = value | (value << 8) | (value << 16) | (value << 24); } } for (var y = 0u; y <= 0; y++) { var rowIndex = layerIndex + (y * bytesPerRow); var row = (uint *)textureDataSpan.GetPointer(rowIndex); var previousRowOfNextLayerIndex = rowIndex + bytesPerLayer - bytesPerRow; var previousRowOfNextLayer = (uint *)textureDataSpan.GetPointer(previousRowOfNextLayerIndex); if ((row[x] & 0xFF) < falloffFactor * (previousRowOfNextLayer[x] & 0xFF)) { uint value = (byte)(falloffFactor * (previousRowOfNextLayer[x] & 0xFF)); row[x] = value | (value << 8) | (value << 16) | (value << 24); } } for (var y = 1u; y < height; y++) { var rowIndex = layerIndex + (y * bytesPerRow); var row = (uint *)textureDataSpan.GetPointer(rowIndex); var previousRowIndex = rowIndex - bytesPerRow; var previousRow = (uint *)textureDataSpan.GetPointer(previousRowIndex); if ((row[x] & 0xFF) < falloffFactor * (previousRow[x] & 0xFF)) { uint value = (byte)(falloffFactor * (previousRow[x] & 0xFF)); row[x] = value | (value << 8) | (value << 16) | (value << 24); } } for (var y = height - 2; y != uint.MaxValue; y = unchecked (y - 1)) { var rowIndex = layerIndex + (y * bytesPerRow); var row = (uint *)textureDataSpan.GetPointer(rowIndex); var nextRowIndex = rowIndex + bytesPerRow; var nextRow = (uint *)textureDataSpan.GetPointer(nextRowIndex); if ((row[x] & 0xFF) < falloffFactor * (nextRow[x] & 0xFF)) { uint value = (byte)(falloffFactor * (nextRow[x] & 0xFF)); row[x] = value | (value << 8) | (value << 16) | (value << 24); } } for (var y = height - 1; y >= height - 1; y--) { var rowIndex = layerIndex + (y * bytesPerRow); var row = (uint *)textureDataSpan.GetPointer(rowIndex); var nextRowOfPreviousLayerIndex = rowIndex + bytesPerRow - bytesPerLayer; var nextRowOfPreviousLayer = (uint *)textureDataSpan.GetPointer(nextRowOfPreviousLayerIndex); if ((row[x] & 0xFF) < falloffFactor * (nextRowOfPreviousLayer[x] & 0xFF)) { uint value = (byte)(falloffFactor * (nextRowOfPreviousLayer[x] & 0xFF)); row[x] = value | (value << 8) | (value << 16) | (value << 24); } } for (var y = height - 2; y != uint.MaxValue; y = unchecked (y - 1)) { var rowIndex = layerIndex + (y * bytesPerRow); var row = (uint *)textureDataSpan.GetPointer(rowIndex); var nextRowIndex = rowIndex + bytesPerRow; var nextRow = (uint *)textureDataSpan.GetPointer(nextRowIndex); if ((row[x] & 0xFF) < falloffFactor * (nextRow[x] & 0xFF)) { uint value = (byte)(falloffFactor * (nextRow[x] & 0xFF)); row[x] = value | (value << 8) | (value << 16) | (value << 24); } } } } for (var y = 0u; y < height; y++) { for (var x = 0u; x < width; x++) { if (x != 0) { for (var z = 1u; z < depth; z++) { var layerIndex = z * bytesPerLayer; var rowIndex = layerIndex + (y * bytesPerRow); var row = (uint *)textureDataSpan.GetPointer(rowIndex); var sameRowOfPreviousLayerIndex = rowIndex - bytesPerLayer; var sameRowOfPreviousLayer = (uint *)textureDataSpan.GetPointer(sameRowOfPreviousLayerIndex); if ((row[x] & 0xFF) < falloffFactor * (sameRowOfPreviousLayer[x] & 0xFF)) { uint value = (byte)(falloffFactor * (row[x - 1] & 0xFF)); row[x] = value | (value << 8) | (value << 16) | (value << 24); } } } if (x != (width - 1)) { for (var z = depth - 1u; z != uint.MaxValue; z = unchecked (z - 1)) { var layerIndex = z * bytesPerLayer; var rowIndex = layerIndex + (y * bytesPerRow); var row = (uint *)textureDataSpan.GetPointer(rowIndex); if ((row[x] & 0xFF) < falloffFactor * (row[x + bytesPerLayer] & 0xFF)) { uint value = (byte)(falloffFactor * (row[x + 1] & 0xFF)); row[x] = value | (value << 8) | (value << 16) | (value << 24); } } } } } } } uploadBufferView.UnmapAndWrite(); var texture3DView = texture3D.CreateView(0, 1); copyContext.Copy(texture3DView, uploadBufferView); return(texture3DView); }