private void GLElement_GLRenderStarted(object sender, EventArgs e) { #region FBO start if (UseFrameBuffer) { FBO.Activate(); FBO.FBOInitializeView(GLElement1.PerspectiveProjection, TransformOuter.Location.Z); } else { FBO.Deactivate(); } #endregion RenderToBuffer(); #region FBO finish if (UseFrameBuffer) { FBO.Deactivate(); GLElement1.InitializeView(); GL.ClearColor(0, .3f, .5f, 1); GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); GL.LoadIdentity(); // Now bind the texture to use it GL.ActiveTexture(TextureUnit.Texture0); FBO.Bind(); GLHelpers.Color4(Colors.Black); // to prevent it from being transparent // Tranform TransformOuter.Apply(); // Render with shader LightingShaderProgram.Texture1 = FBO.Texture; LightingShaderProgram.Activate(); //GLHelpers.Plane(1.3, 1.3, 0); // put it on a plane GLHelpers.Cube2D(1.7); // put it on a cube // Do some cleanup TransformOuter.Remove(); Texture2D.Disable2DTextures(); ShaderProgram.DisableShaders(); } #endregion }
void init() { //Shadow map renderpass shadowPass = new RenderPass(dev, VkSampleCountFlags.SampleCount1); shadowPass.AddAttachment(SHADOWMAP_FORMAT, VkImageLayout.DepthStencilReadOnlyOptimal, SHADOWMAP_NUM_SAMPLES); shadowPass.ClearValues.Add(new VkClearValue { depthStencil = new VkClearDepthStencilValue(1.0f, 0) }); SubPass subpass0 = new SubPass(); subpass0.SetDepthReference(0); shadowPass.AddSubpass(subpass0); shadowPass.AddDependency(Vk.SubpassExternal, 0, VkPipelineStageFlags.FragmentShader, VkPipelineStageFlags.EarlyFragmentTests, VkAccessFlags.ShaderRead, VkAccessFlags.DepthStencilAttachmentWrite); shadowPass.AddDependency(0, Vk.SubpassExternal, VkPipelineStageFlags.LateFragmentTests, VkPipelineStageFlags.FragmentShader, VkAccessFlags.DepthStencilAttachmentWrite, VkAccessFlags.ShaderRead); descLayoutShadow = new DescriptorSetLayout(dev, new VkDescriptorSetLayoutBinding(0, VkShaderStageFlags.Geometry, VkDescriptorType.UniformBuffer), //matrices new VkDescriptorSetLayoutBinding(1, VkShaderStageFlags.Geometry, VkDescriptorType.UniformBuffer)); //lights using (GraphicPipelineConfig cfg = GraphicPipelineConfig.CreateDefault(VkPrimitiveTopology.TriangleList)) { cfg.rasterizationState.cullMode = VkCullModeFlags.Front; cfg.rasterizationState.depthBiasEnable = true; cfg.dynamicStates.Add(VkDynamicState.DepthBias); cfg.RenderPass = shadowPass; cfg.Layout = new PipelineLayout(dev, descLayoutShadow); cfg.AddVertexBinding <PbrModelTexArray.Vertex> (0); cfg.AddVertexAttributes(0, VkFormat.R32g32b32Sfloat); cfg.AddVertexBinding <VkChess.InstanceData> (1, VkVertexInputRate.Instance); cfg.vertexAttributes.Add(new VkVertexInputAttributeDescription(1, 1, VkFormat.R32g32b32a32Sfloat, 16)); cfg.vertexAttributes.Add(new VkVertexInputAttributeDescription(1, 2, VkFormat.R32g32b32a32Sfloat, 32)); cfg.vertexAttributes.Add(new VkVertexInputAttributeDescription(1, 3, VkFormat.R32g32b32a32Sfloat, 48)); cfg.vertexAttributes.Add(new VkVertexInputAttributeDescription(1, 4, VkFormat.R32g32b32a32Sfloat, 64)); cfg.AddShader(dev, VkShaderStageFlags.Vertex, "#vkChess.net.shadow.vert.spv"); cfg.AddShader(dev, VkShaderStageFlags.Geometry, "#vkChess.net.shadow.geom.spv"); shadowPipeline = new GraphicPipeline(cfg, "shadow"); } //shadow map image shadowMap = new Image(dev, SHADOWMAP_FORMAT, VkImageUsageFlags.DepthStencilAttachment | VkImageUsageFlags.Sampled, VkMemoryPropertyFlags.DeviceLocal, SHADOWMAP_SIZE, SHADOWMAP_SIZE, VkImageType.Image2D, SHADOWMAP_NUM_SAMPLES, VkImageTiling.Optimal, 1, (uint)renderer.lights.Length); shadowMap.CreateView(VkImageViewType.ImageView2DArray, VkImageAspectFlags.Depth, shadowMap.CreateInfo.arrayLayers); shadowMap.CreateSampler(VkSamplerAddressMode.ClampToBorder); shadowMap.Descriptor.imageLayout = VkImageLayout.DepthStencilReadOnlyOptimal; fbShadowMap = new FrameBuffer(shadowPass, SHADOWMAP_SIZE, SHADOWMAP_SIZE, (uint)renderer.lights.Length); fbShadowMap.attachments.Add(shadowMap); fbShadowMap.Activate(); dsShadow = descriptorPool.Allocate(descLayoutShadow); DescriptorSetWrites dsWrite = new DescriptorSetWrites(dsShadow, descLayoutShadow); dsWrite.Write(dev, renderer.uboMatrices.Descriptor, renderer.uboLights.Descriptor); shadowMap.SetName("shadowmap"); fbShadowMap.SetName("fbShadow"); }