public virtual void Cleanup() { Context?.ClearState(); Context?.Flush(); BackBuffer?.Dispose(); BackBuffer = null; ZBuffer?.Dispose(); ZBuffer = null; RenderTargetViewRef?.Dispose(); RenderTargetViewRef = null; DepthStencilSRVRef?.Dispose(); DepthStencilSRVRef = null; DepthStencilViewRef?.Dispose(); DepthStencilViewRef = null; FactoryDWrite?.Dispose(); FactoryDWrite = null; Factory2D?.Dispose(); Factory2D = null; RenderTarget2D?.Dispose(); RenderTarget2D = null; Context?.Dispose(); DeviceRef?.Dispose(); DeviceRef = null; }
protected override void Init() { base.Init(); this.CurrentZBuffer = new ZBuffer(); this.CurrentZBuffer.Reset(); }
private void InitializeRenderers() { Renderers = new Dictionary <string, Renderer>(); Renderer raytracing = new Raytracing( canvas: Canvas, scene: CurrentScene, cameraPos: CameraPos, maxDepth: 10 ); Renderers.Add("Raytracing", raytracing); Renderer raycasting = new Raycasting( canvas: Canvas, scene: CurrentScene, cameraPos: CameraPos ); Renderers.Add("Raycasting", raycasting); Renderer zbuffer = new ZBuffer( canvas: Canvas, scene: CurrentScene ); Renderers.Add("ZBuffer", zbuffer); RendererComboBox.DataSource = new BindingSource(Renderers, null); RendererComboBox.DisplayMember = "Key"; RendererComboBox.ValueMember = "Value"; }
private async Task <List <Pixel> > GetListAsync(Group group, int dx, int dy, int viceVersa, int width, int height, Bgr24Bitmap bitmap) { return(await Task.Run(() => { List <Pixel> pixels = new List <Pixel>(); int count = 0; ZBuffer zBuf = new ZBuffer(width, height); Parallel.ForEach(group.Faces, face => { if (IsFaceVisible(group.Vertices, face)) { List <Pixel> pixelsForSide = new List <Pixel>(); List <Pixel> pixelsInSide = new List <Pixel>(); Vertex vertex0, vertex1; int index0, index1; Vector3 lightingVector = new Vector3(0, 0, 1); int ind0 = (face.FaceElements.ElementAt(0).VertexNormalIndex != null) ? (int)face.FaceElements.ElementAt(0).VertexNormalIndex : 1; Vector3 point0Normal = new Vector3(group.VertexNormals[ind0 - 1].X, group.VertexNormals[ind0 - 1].Y, group.VertexNormals[ind0 - 1].Z); int ind1 = (face.FaceElements.ElementAt(1).VertexNormalIndex != null) ? (int)face.FaceElements.ElementAt(1).VertexNormalIndex : 1; Vector3 point1Normal = new Vector3(group.VertexNormals[ind1 - 1].X, group.VertexNormals[ind1 - 1].Y, group.VertexNormals[ind1 - 1].Z); int ind2 = (face.FaceElements.ElementAt(2).VertexNormalIndex != null) ? (int)face.FaceElements.ElementAt(2).VertexNormalIndex : 1; Vector3 point2Normal = new Vector3(group.VertexNormals[ind2 - 1].X, group.VertexNormals[ind2 - 1].Y, group.VertexNormals[ind2 - 1].Z); Color color = Color.FromArgb(255, 255, 0, 0); Color point1Color = Lambert.GetPointColor(point0Normal, lightingVector, color); Color point2Color = Lambert.GetPointColor(point1Normal, lightingVector, color); Color point3Color = Lambert.GetPointColor(point2Normal, lightingVector, color); Color faceColor = PlaneShading.GetAverageColor(point1Color, point2Color, point3Color); for (int i = 0; i < face.FaceElements.Count - 1; i++) { index0 = (face.FaceElements.ElementAt(i).VertexIndex != -2) ? face.FaceElements.ElementAt(i).VertexIndex : (group.Vertices.Count - 1); index1 = (face.FaceElements.ElementAt(i + 1).VertexIndex != -2) ? face.FaceElements.ElementAt(i + 1).VertexIndex : (group.Vertices.Count - 1); vertex0 = group.Vertices.ElementAt(index0); vertex1 = group.Vertices.ElementAt(index1); pixelsForSide.AddRange(Bresenham.GetPixels((int)(vertex0.X + dx), (int)(vertex0.Y * viceVersa + dy), (int)(vertex0.Z), (int)(vertex1.X + dx), (int)(vertex1.Y * viceVersa + dy), (int)(vertex1.Z), windowWidth, windowHeight, bitmap, zBuf, faceColor)); } index0 = (face.FaceElements.ElementAt(0).VertexIndex != -2) ? face.FaceElements.ElementAt(0).VertexIndex : (group.Vertices.Count - 1); index1 = (face.FaceElements.ElementAt(face.FaceElements.Count - 1).VertexIndex != -2) ? face.FaceElements.ElementAt(face.FaceElements.Count - 1).VertexIndex : (group.Vertices.Count - 1); vertex0 = group.Vertices.ElementAt(index0); vertex1 = group.Vertices.ElementAt(index1); pixelsForSide.AddRange(Bresenham.GetPixels((int)(vertex0.X + dx), (int)(vertex0.Y *viceVersa + dy), vertex0.Z, (int)(vertex1.X + dx), (int)(vertex1.Y *viceVersa + dy), vertex1.Z, windowWidth, windowHeight, bitmap, zBuf, faceColor)); RastAlgorithm.DrawPixelForRasterization(pixelsForSide, bitmap, zBuf, faceColor); //pixels.AddRange(pixelsForSide); //pixelsInSide.AddRange(RastAlgorithm.DrawPixelForRasterization(pixelsForSide, bitmap, zBuf)); //pixels.AddRange(pixelsInSide); count++; } }); return pixels; })); }
public void InitRenderTargetSurface(IntPtr Resource) { ZBuffer?.Dispose(); DepthStencilViewRef?.Dispose(); RenderTargetViewRef?.Dispose(); RenderTarget2D?.Dispose(); SharpDX.DXGI.Resource dxgiResource; using (var r = new SharpDX.ComObject(Resource)) { dxgiResource = r.QueryInterface <SharpDX.DXGI.Resource>(); } Texture2D OutputResource = DeviceRef.OpenSharedResource <Texture2D>(dxgiResource.SharedHandle); using (var surface = DeviceRef.OpenSharedResource <Surface>(dxgiResource.SharedHandle)) { RenderTarget2D = new RenderTarget(Factory2D, surface, RenderTarget2DProperites); } //Crash everything //dxgiResource.Dispose(); RenderTarget2D.AntialiasMode = AntialiasMode.PerPrimitive; RenderTarget2D.TextAntialiasMode = TextAntialiasMode.Cleartype; RenderTargetViewRef = new RenderTargetView(DeviceRef, OutputResource); Texture2DDescription OutputDesc = OutputResource.Description; if (OutputDesc.Width != Width || OutputDesc.Height != Height) { Width = OutputDesc.Width; Height = OutputDesc.Height; SetUpViewport(); } ZBufferTextureDescription.Width = Width; ZBufferTextureDescription.Height = Height; ZBuffer = new Texture2D(DeviceRef, ZBufferTextureDescription); DepthStencilViewRef = new DepthStencilView(DeviceRef, ZBuffer, new DepthStencilViewDescription { Format = Format.D32_Float, Dimension = DepthStencilViewDimension.Texture2D, Flags = DepthStencilViewFlags.None, }); Context.OutputMerger.SetRenderTargets(DepthStencilViewRef, RenderTargetViewRef); OnInitRenderTarget?.Invoke(); OutputResource?.Dispose(); }
/// <summary> /// The forms resize handler get called whenever the form is resized. /// When the form resizes we have to redefine the projection matrix /// as well as the viewport matrix. /// </summary> private void frmHelloCube_Resize(object sender, EventArgs e) { float aspect = (float)ClientRectangle.Width / (float)ClientRectangle.Height; m_projectionMatrix.Perspective(50, aspect, 1.0f, 3.0f); m_viewportMatrix.Viewport(0, 0, ClientRectangle.Width, ClientRectangle.Height, 0, 1); // set up zBuffer with the size of the window, near and far settup zBuffer = new ZBuffer(ClientRectangle.Width, ClientRectangle.Height, 1.0f, 1.4f); controlBox.Update(); this.Invalidate(); }
public Renderer(WriteableBitmap baseBitmap, BaseLighting lighting) { bmp = new Bgr24Bitmap(baseBitmap); zBuf = new ZBuffer(baseBitmap.PixelWidth, baseBitmap.PixelHeight); // 4 stands for RGBA backBuffer = new byte[baseBitmap.PixelWidth * baseBitmap.PixelHeight * 4]; this.lighting = lighting; if (lighting.AmbientColor != null) { bgColor = lighting.AmbientColor.ToColor(); } else { lighting.AmbientColor = bgColor.ToVector3(); } }
protected override void Actualizar(ref ZBuffer ZBuffer) { if (!ZBuffer.Vacio) { g.Clear(Color.Black); foreach (Poligono2D Poligono in ZBuffer.Represenatciones) { b.Color = Poligono.Color; g.FillPolygon(b, Poligono.VerticesToPoint); } mCanvas.Refresh(); if (Actualizado != null) { Actualizado(this); } } }
public PlaneShading(Bgr24Bitmap bitmap, Model model, ILighting lighting) : base(bitmap, model) { _lighting = lighting; _zBuffer = new ZBuffer(_bitmap.PixelWidth, _bitmap.PixelHeight); }
protected abstract void Actualizar(ref ZBuffer ZBuffer);
public override void InitRenderTarget() { BackBuffer?.Dispose(); RenderTargetViewRef?.Dispose(); DepthStencilSRVRef?.Dispose(); ZBuffer?.Dispose(); DepthStencilViewRef?.Dispose(); RenderTarget2D?.Dispose(); SwapChainRef.ResizeBuffers(1, Width, Height, Format.R8G8B8A8_UNorm, SwapChainFlags.None); using (Surface surface = SwapChainRef.GetBackBuffer <Surface>(0)) { RenderTarget2D = new RenderTarget(Factory2D, surface, RenderTarget2DProperites); } RenderTarget2D.AntialiasMode = AntialiasMode.PerPrimitive; RenderTarget2D.TextAntialiasMode = TextAntialiasMode.Cleartype; BackBuffer = SwapChainRef.GetBackBuffer <Texture2D>(0); BackBuffer.DebugName = "BackBuffer"; RenderTargetViewRef = new RenderTargetView(DeviceRef, BackBuffer); RenderTargetViewRef.DebugName = "BackBufferRenderTargetView"; ZBufferTextureDescription.Width = Width; ZBufferTextureDescription.Height = Height; ZBuffer = new Texture2D(DeviceRef, ZBufferTextureDescription); ZBuffer.DebugName = "ZBuffer"; DepthStencilViewRef = new DepthStencilView(DeviceRef, ZBuffer, new DepthStencilViewDescription { Format = Format.D32_Float, Dimension = MSamplesCount > 1 ? DepthStencilViewDimension.Texture2DMultisampled : DepthStencilViewDimension.Texture2D, Flags = DepthStencilViewFlags.None, }); DepthStencilViewRef.DebugName = "ZBufferDepthStencilView"; ShaderResourceViewDescription SRVDesc = new ShaderResourceViewDescription() { Format = Format.R32_Float, }; if (MSamplesCount > 1) { SRVDesc.Dimension = ShaderResourceViewDimension.Texture2DMultisampled; SRVDesc.Texture2DMS = new ShaderResourceViewDescription.Texture2DMultisampledResource(); } else { SRVDesc.Dimension = ShaderResourceViewDimension.Texture2D; SRVDesc.Texture2D = new ShaderResourceViewDescription.Texture2DResource() { MostDetailedMip = 0, MipLevels = 1, }; } DepthStencilSRVRef = new ShaderResourceView(DeviceRef, ZBuffer, SRVDesc); DepthStencilSRVRef.DebugName = "ZBufferDepthStencilSRV"; SetUpViewport(); OnInitRenderTarget?.Invoke(); }