我正在编写一个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)。
这是我第一次在此处发布内容。抱歉,我做错了什么。