protected unsafe override void loadUnmanagedResources() { Viewport vp = renderSys.Viewport; Size blmSize = new Size(vp.Width / 2, vp.Height / 2); Size scrnSize = new Size(vp.Width, vp.Height); blurredRt1 = factory.CreateRenderTarget(blmSize.Width, blmSize.Height, ImagePixelFormat.A8R8G8B8); blurredRt2 = factory.CreateRenderTarget(blmSize.Width, blmSize.Height, ImagePixelFormat.A8R8G8B8); colorBuffer = factory.CreateRenderTarget(scrnSize.Width, scrnSize.Height, ImagePixelFormat.A8R8G8B8); nrmDepthBuffer = factory.CreateRenderTarget(scrnSize.Width, scrnSize.Height, ImagePixelFormat.A8R8G8B8); edgeResultBuffer = factory.CreateRenderTarget(scrnSize.Width, scrnSize.Height, ImagePixelFormat.A8R8G8B8); #region 计算参数 guassFilter = new GuassBlurFilter(SampleCount, BlurAmount, blmSize.Width, blmSize.Height); #endregion #region 建立屏幕quad quad = factory.CreateVertexBuffer(4, vtxDecl, BufferUsage.Static); float adj = -0.5f; RectVertex* vdst = (RectVertex*)quad.Lock(0, 0, LockMode.None); vdst[0].Position = new Vector4(adj, adj, 0, 1); vdst[0].TexCoord = new Vector2(0, 0); vdst[1].Position = new Vector4(scrnSize.Width + adj, adj, 0, 1); vdst[1].TexCoord = new Vector2(1, 0); vdst[2].Position = new Vector4(adj, scrnSize.Height + adj, 0, 1); vdst[2].TexCoord = new Vector2(0, 1); vdst[3].Position = new Vector4(scrnSize.Width + adj, scrnSize.Height + adj, 0, 1); vdst[3].TexCoord = new Vector2(1, 1); quad.Unlock(); #endregion #region 建立小quad smallQuad = factory.CreateVertexBuffer(4, vtxDecl, BufferUsage.Static); vdst = (RectVertex*)smallQuad.Lock(0, 0, LockMode.None); vdst[0].Position = new Vector4(adj, adj, 0, 1); vdst[0].TexCoord = new Vector2(0, 0); vdst[1].Position = new Vector4(blmSize.Width + adj, adj, 0, 1); vdst[1].TexCoord = new Vector2(1, 0); vdst[2].Position = new Vector4(adj, blmSize.Height + adj, 0, 1); vdst[2].TexCoord = new Vector2(0, 1); vdst[3].Position = new Vector4(blmSize.Width + adj, blmSize.Height + adj, 0, 1); vdst[3].TexCoord = new Vector2(1, 1); smallQuad.Unlock(); #endregion indexBuffer = factory.CreateIndexBuffer(IndexBufferType.Bit32, 6, BufferUsage.Static); int* idst = (int*)indexBuffer.Lock(0, 0, LockMode.None); idst[0] = 3; idst[1] = 1; idst[2] = 0; idst[3] = 2; idst[4] = 3; idst[5] = 0; indexBuffer.Unlock(); quadOp = new GeomentryData(); quadOp.BaseIndexStart = 0; quadOp.BaseVertex = 0; quadOp.IndexBuffer = indexBuffer; quadOp.PrimCount = 2; quadOp.PrimitiveType = RenderPrimitiveType.TriangleList; quadOp.VertexBuffer = quad; quadOp.VertexCount = 4; quadOp.VertexDeclaration = vtxDecl; quadOp.VertexSize = RectVertex.Size; smallQuadOp = new GeomentryData(); smallQuadOp.BaseIndexStart = 0; smallQuadOp.BaseVertex = 0; smallQuadOp.IndexBuffer = indexBuffer; smallQuadOp.PrimCount = 2; smallQuadOp.PrimitiveType = RenderPrimitiveType.TriangleList; smallQuadOp.VertexBuffer = smallQuad; smallQuadOp.VertexCount = 4; smallQuadOp.VertexDeclaration = vtxDecl; smallQuadOp.VertexSize = RectVertex.Size; }
protected unsafe override void loadUnmanagedResources() { Viewport vp = renderSys.Viewport; Size blmSize = new Size(vp.Width / 2, vp.Height / 2); Size scrnSize = new Size(vp.Width, vp.Height); blurredRt1 = factory.CreateRenderTarget(blmSize.Width, blmSize.Height, ImagePixelFormat.A8R8G8B8); blurredRt2 = factory.CreateRenderTarget(blmSize.Width, blmSize.Height, ImagePixelFormat.A8R8G8B8); colorBuffer = factory.CreateRenderTarget(scrnSize.Width, scrnSize.Height, ImagePixelFormat.A8R8G8B8); nrmDepthBuffer = factory.CreateRenderTarget(scrnSize.Width, scrnSize.Height, ImagePixelFormat.A8R8G8B8); edgeResultBuffer = factory.CreateRenderTarget(scrnSize.Width, scrnSize.Height, ImagePixelFormat.A8R8G8B8); #region 计算参数 guassFilter = new GuassBlurFilter(SampleCount, BlurAmount, blmSize.Width, blmSize.Height); #endregion #region 建立屏幕quad quad = factory.CreateVertexBuffer(4, vtxDecl, BufferUsage.Static); float adj = -0.5f; RectVertex *vdst = (RectVertex *)quad.Lock(0, 0, LockMode.None); vdst[0].Position = new Vector4(adj, adj, 0, 1); vdst[0].TexCoord = new Vector2(0, 0); vdst[1].Position = new Vector4(scrnSize.Width + adj, adj, 0, 1); vdst[1].TexCoord = new Vector2(1, 0); vdst[2].Position = new Vector4(adj, scrnSize.Height + adj, 0, 1); vdst[2].TexCoord = new Vector2(0, 1); vdst[3].Position = new Vector4(scrnSize.Width + adj, scrnSize.Height + adj, 0, 1); vdst[3].TexCoord = new Vector2(1, 1); quad.Unlock(); #endregion #region 建立小quad smallQuad = factory.CreateVertexBuffer(4, vtxDecl, BufferUsage.Static); vdst = (RectVertex *)smallQuad.Lock(0, 0, LockMode.None); vdst[0].Position = new Vector4(adj, adj, 0, 1); vdst[0].TexCoord = new Vector2(0, 0); vdst[1].Position = new Vector4(blmSize.Width + adj, adj, 0, 1); vdst[1].TexCoord = new Vector2(1, 0); vdst[2].Position = new Vector4(adj, blmSize.Height + adj, 0, 1); vdst[2].TexCoord = new Vector2(0, 1); vdst[3].Position = new Vector4(blmSize.Width + adj, blmSize.Height + adj, 0, 1); vdst[3].TexCoord = new Vector2(1, 1); smallQuad.Unlock(); #endregion indexBuffer = factory.CreateIndexBuffer(IndexBufferType.Bit32, 6, BufferUsage.Static); int *idst = (int *)indexBuffer.Lock(0, 0, LockMode.None); idst[0] = 3; idst[1] = 1; idst[2] = 0; idst[3] = 2; idst[4] = 3; idst[5] = 0; indexBuffer.Unlock(); quadOp = new GeomentryData(); quadOp.BaseIndexStart = 0; quadOp.BaseVertex = 0; quadOp.IndexBuffer = indexBuffer; quadOp.PrimCount = 2; quadOp.PrimitiveType = RenderPrimitiveType.TriangleList; quadOp.VertexBuffer = quad; quadOp.VertexCount = 4; quadOp.VertexDeclaration = vtxDecl; quadOp.VertexSize = RectVertex.Size; smallQuadOp = new GeomentryData(); smallQuadOp.BaseIndexStart = 0; smallQuadOp.BaseVertex = 0; smallQuadOp.IndexBuffer = indexBuffer; smallQuadOp.PrimCount = 2; smallQuadOp.PrimitiveType = RenderPrimitiveType.TriangleList; smallQuadOp.VertexBuffer = smallQuad; smallQuadOp.VertexCount = 4; smallQuadOp.VertexDeclaration = vtxDecl; smallQuadOp.VertexSize = RectVertex.Size; }