阴影贴图文物


16

我想尝试为3D XNA游戏添加阴影。我已经用一盏灯和一台摄像机设置了一些测试环境。但是,我的方法遇到了工件。

我使用来自http://pastebin.com/zXi0hmsU的着色器代码渲染最终结果,并使用http://pastebin.com/rY4Gcj9N创建阴影贴图。该代码非常简单,涉及从灯光角度生成深度图,然后将其投影到相机空间并检查遮挡。

但是,从大多数角度来看,我得到的结果都很丑陋喜欢这个萤幕撷取画面

场景由一些简单的立方体(手动构造,面向外部,背面被剔除),一盏灯(左上角所示的阴影图-看起来还可以)和一台摄像机组成。

我的阴影贴图的RenderTarget初始化为

int shadowMapSize = 512;
RenderTarget2D shadowMap = new RenderTarget2D(GraphicsDevice, shadowMapSize,
    shadowMapSize, true, GraphicsDevice.PresentationParameters.BackBufferFormat,
    DepthFormat.Depth24Stencil8);
GraphicsDevice.SetRenderTarget(shadowMap);
GraphicsDevice.Clear(Color.White);
GraphicsDevice.DepthStencilState = DepthStencilState.Default;

然后,应用该CreateShadowMap效果,然后应用LambertWithShadows效果。最后,使用绘制阴影图SpriteBatch

其余代码仅包含为着色器提供正确的值。如有必要,我可以提供。

Answers:


19

这是典型的问题,称为阴影贴图痤疮。这是因为阴影图的投影像素(深度)大于屏幕上的像素(等式无法正确表示深度)。

在此处输入图片说明

有很多解决方案。首先最容易做到的是偏见(我在您的代码中看到了,所以这不是问题)。第二个简单的解决方案是以更大的分辨率放置阴影贴图,在当前硬件上以2048x2048分辨率放置阴影贴图确实比典型的要多。(编辑:那不是真的,我在从事电影渲染时就已经写道。在游戏开发中,您希望使阴影贴图尽可能小)

一些资源可以研究更高级的技术。


编辑:


在工作中,我还有更多有关此主题的材料,如果您有兴趣,我也会分享。
Notabene 2011年

大分辨率的主要问题是,在最终游戏中,我有大约3-4个无向的灯光=>我将不得不在其中使用三次阴影贴图,这将产生24个阴影贴图。如果您还有其他材料,我将不胜感激与我分享它的努力:-)
Etan

我至少有兴趣的话:)
詹姆斯

1
@伊坦 是的,如果谈论阴影,则全向定向灯是真正的痛苦。(我对此有所了解:)gamedev.stackexchange.com/questions/6203/…)。尝试使用双抛物面贴图。或者,如果您喜欢立方体贴图,请尝试通过对每个面/渲染使用frustum-camera_frustum相交剔除来节省一些空间。您很有可能一直不需要所有方向的阴影(尤其是在外部)
Notabene 2011年

1
@Etan @James我为您添加了更多内容。如果您对此主题感兴趣,那么两者都值得阅读。
Notabene 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.