Пример #1
0
        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
        }
Пример #2
0
        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");
        }