如何将场景渲染到cubemaptexture,然后在另一个着色器中使用cubemaptexture作为cubesampler?

时间:2019-06-23 09:43:17

标签: c# opengl shadow opentk

我正在编写一个3D引擎,该引擎使用OpenTK库(OpenGL)在C#中使用Phong着色器和点光源。我现在正在尝试为我拥有的每个光源创建一个场景的阴影贴图(立方体贴图),但是我不知道如何查看立方体贴图的渲染是否有效,而且我不知道如何将立方体贴图统一传递CubeSampler到着色器。

我尝试(针对每种光源)使用GenTexture创建新的立方体贴图纹理,然后绑定该纹理并在立方体贴图的每个面上使用TexImage2D。然后使用多维数据集纹理和深度缓冲区创建一个帧缓冲区。然后使用所述帧缓冲区将场景着色为Attachment0。

要在着色器中使用它,我只需获得统一的位置并绑定立方体贴图纹理的id。

我在哪里创建立方体贴图

Date
Temperature_city_1
Temperature_city_2
Temperature_city_3
Which_destination

20140910
80
32
40
1

20140911
100
50
36
2
...

渲染立方体贴图

 public Light Init(Scene scene)
        {
            texId = GL.GenTexture();
            GL.BindTexture(TextureTarget.TextureCubeMap, texId);
            for (int i = 0; i < 6; i++)
            {
                GL.TexImage2D(TextureTarget.TextureCubeMapPositiveX + i, 0, PixelInternalFormat.Rgba8, 512, 512, 0, PixelFormat.Rgba, PixelType.UnsignedByte, (IntPtr)null);
            }
            GL.TexParameter(TextureTarget.TextureCubeMap, TextureParameterName.TextureMagFilter, (float)TextureMagFilter.Linear);
            GL.TexParameter(TextureTarget.TextureCubeMap, TextureParameterName.TextureMinFilter, (float)TextureMinFilter.Linear);
            GL.TexParameter(TextureTarget.TextureCubeMap, TextureParameterName.TextureWrapS, (float)TextureWrapMode.ClampToEdge);
            GL.TexParameter(TextureTarget.TextureCubeMap, TextureParameterName.TextureWrapT, (float)TextureWrapMode.ClampToEdge);
            GL.TexParameter(TextureTarget.TextureCubeMap, TextureParameterName.TextureWrapR, (float)TextureWrapMode.ClampToEdge);
            GL.BindTexture(TextureTarget.TextureCubeMap, 0);

            fbo = GL.GenFramebuffer();
            GL.BindFramebuffer(FramebufferTarget.Framebuffer, fbo);
            GL.DrawBuffer(DrawBufferMode.ColorAttachment0);


            fbo_depth = GL.GenRenderbuffer();
            GL.BindRenderbuffer(RenderbufferTarget.Renderbuffer, fbo_depth);
            GL.RenderbufferStorage(RenderbufferTarget.Renderbuffer, RenderbufferStorage.DepthComponent24, 512, 512);
            GL.FramebufferRenderbuffer(FramebufferTarget.Framebuffer, FramebufferAttachment.DepthAttachment, RenderbufferTarget.Renderbuffer, fbo_depth);
            GL.Viewport(0, 0, 512, 512);

            for (int i = 0; i < 6; i++)
            {
                GL.FramebufferTexture2D(FramebufferTarget.Framebuffer,
                    FramebufferAttachment.ColorAttachment0,
                    TextureTarget.TextureCubeMapPositiveX + i, texId, 0);
                cam.SwitchFace(i);
                scene.RenderLowRes(cam);
            }

            GL.BindFramebuffer(FramebufferTarget.Framebuffer, 0);
            GL.Viewport(0, 0, 1024, 1024);


            return this;

        }

渲染每个网格(我要在其中传递立方体贴图)

 public void RenderLowRes(CubeCamera cam)
        {
            GL.ClearColor(1, 1, 1, 1);
            GL.Clear(ClearBufferMask.ColorBufferBit);
            GL.Clear(ClearBufferMask.DepthBufferBit);
            sceneTree.RenderShade(shady, cam.view, cam.projection);

        }

完成所有操作后,着色器中的CubeSamplers似乎为空(所有值为0)。

这是我第一次在此处发布内容。抱歉,我做错了什么。

0 个答案:

没有答案