public void Draw(Image texture, Rectangle area, float opacity = 1.0f) { //init the data we need uo upload Transform transform = new Transform(); RenderConfig renderConfig = new RenderConfig(); transform.World = Matrix4x4.CreateTranslation(new System.Numerics.Vector3(area.Left, area.Top, 0)); transform.World = Matrix4x4.CreateScale(new System.Numerics.Vector3(area.Right - area.Left, area.Bottom - area.Top, 1)) * transform.World; transform.Projection = Matrix4x4.CreateOrthographicOffCenter(0, mSwapChain.Size.Width, 0, mSwapChain.Size.Height, 0, 1); renderConfig.Opacity = new System.Numerics.Vector4(opacity); //upload it to gpu memory mTransformBuffer.Update(transform); mRenderConfigBuffer.Update(renderConfig); //set resource to shader mDevice.SetBuffer(mTransformBuffer, mTransformBufferSlot, GpuShaderType.VertexShader); mDevice.SetBuffer(mRenderConfigBuffer, mRenderConfigBufferSlot, GpuShaderType.PixelShader); mDevice.SetSamplerState(mGpuSamplerState, mSamplerStateSlot, GpuShaderType.PixelShader); mDevice.SetResourceUsage(texture.GpuResourceUsage, mTextureSlot, GpuShaderType.PixelShader); //draw mDevice.DrawIndexed(6, 0, 0); }
public virtual void BeginDraw(Image image) { //begin draw and we need set the render target before we draw anything //reset device and set render target mDevice.Reset(); mDevice.SetRenderTarget(image.GpuRenderTarget); //set blend state mDevice.SetBlendState(mBlendState); //set input layout ,vertex shader and primitive type mDevice.SetInputLayout(mInputLayout); mDevice.SetPixelShader(mPixelShader); mDevice.SetVertexShader(mVertexShader); mDevice.SetPrimitiveType(GpuPrimitiveType.TriangleList); //set view port mDevice.SetViewPort(new Rectanglef(0, 0, image.Size.Width, image.Size.Height)); mDevice.SetSamplerState(mSamplerState, mSamplerStateSlot, GpuShaderType.All); //set the project matrix, need set null when we end draw mProject = Matrix4x4.CreateOrthographicOffCenter( 0, image.Size.Width, 0, image.Size.Height, 0, 1); }
public virtual void DrawImage(Rectangle <float> rectangle, Image image, Color <float> color) { //fill rectangle with texture //the result color's alpha is equal texture.alpha * opacity MatrixData matrixData = new MatrixData(); RenderConfig renderConfig = new RenderConfig() { Color = color }; //1.scale the rectangle matrixData.World = Matrix4x4.CreateScale(rectangle.Right - rectangle.Left, rectangle.Bottom - rectangle.Top, 1.0f); //2.translate it matrixData.World *= Matrix4x4.CreateTranslation(rectangle.Left, rectangle.Top, 0.0f); //3.keep transform matrix data matrixData.World *= Transform; //set projection matrix matrixData.Project = mProject; mMatrixDataBuffer.Update(matrixData); mRenderConfigBuffer.Update(renderConfig); mDevice.SetPixelShader(mTexturePixelShader); mDevice.SetVertexBuffer(mSquareVertexBuffer); mDevice.SetIndexBuffer(mSquareIndexBuffer); mDevice.SetSamplerState(mSamplerState, mSamplerStateSlot, GpuShaderType.PixelShader); mDevice.SetBuffer(mMatrixDataBuffer, mMatrixDataBufferSlot, GpuShaderType.VertexShader); mDevice.SetBuffer(mRenderConfigBuffer, mRenderConfigBufferSlot, GpuShaderType.PixelShader); mDevice.SetResourceUsage(image.GpuResourceUsage, mTextureSlot, GpuShaderType.PixelShader); mDevice.DrawIndexed(6, 0, 0); }