Questions tagged «shadow-mapping»

1
为什么阴影贴图是标准的?
尽管我是一名程序员,但我几乎没有接触过游戏开发。我这个问题已有一段时间了,现在我正在研究游戏开发,所以我认为这是个好时机。 为什么阴影贴图似乎是游戏用来制作阴影的唯一方式?直言不讳,它看起来很糟糕。即使现代游戏的阴影设置已达到最大值,也会出现锯齿状的块状Y阴影,这非常分散注意力。 11年前制作的《毁灭战士3》使用的阴影体积看上去比我见过的任何阴影贴图实现都要好得多,其中包括在发布此问题的同一周发布的AAA游戏。《毁灭战士3》的第三方修改器甚至使阴影的边缘变得柔和,使它们在视觉上更加令人印象深刻。 实现诸如阴影卷之类的东西是否存在某种技术问题或限制?阴影贴图是否易于实施,以至于开发人员甚至不需要考虑其他任何东西? 我能够找到的关于该主题的唯一信息是,构成体积的多边形可能很大,从而要求更高。影子卷可能对系统有更高的要求,但是如果是这样的话,它们在2004年如何摆脱使用它们的困扰? 这个问题并非仅针对阴影映射与阴影体积,它们只是我在完整产品中使用过的仅有的两个,而我只是无法在其他任何技术上找到很多信息。

1
阴影贴图文物
我想尝试为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。 其余代码仅包含为着色器提供正确的值。如有必要,我可以提供。

2
延迟渲染中的阴影
我已经阅读了一些有关延迟渲染的材料,我想我对此有所了解。但是我不明白的是它如何实现阴影。据我所知,G缓冲区不涉及为每个光线创建一个阴影贴图,所以我对于光照通过如何知道每个像素是否被遮挡感到困惑。毕竟,从摄影机的角度可见的给定像素实际上可能从任何给定的光的角度都不可见,并且从摄影机的角度可能看不到遮挡的几何形状,因此在G缓冲区中没有任何内容。 如果开始渲染阴影贴图,则看起来与正向渲染几乎相同-为每个光源渲染场景中的所有几何图形以渲染阴影贴图。 那么延迟渲染如何完成与正向渲染等效的阴影?

2
延迟照明设置中的双抛物面点光源阴影
我一直在玩这个教程/示例代码,该代码演示了预照明的简单实现,这是一种延迟照明设置。 我正在使用双抛物线阴影贴图实现点光源阴影。我正在对DPM进行以下描述:http : //gamedevelop.eu/en/tutorials/dual-paraboloid-shadow-mapping.htm 我能够创建阴影贴图,它们看起来还不错。 我认为当前存在的问题是像素着色器,当渲染点光源时,该着色器会在阴影贴图中查找深度值。 这是我的点光源着色器代码:http : //olhovsky.com/shadow_mapping/PointLight.fx 感兴趣的像素着色器功能为PointLightMeshShadowPS。 有人在该功能中看到明显错误吗? 希望有人解决了这个问题:) 如您在上图中所看到的,帖子的阴影与帖子的位置不匹配,因此某些地方的转换是错误的... 当点光源非常靠近地面(几乎接触地面)时,它就是这样。 当点光源移近地面时,阴影会聚在一起并沿着两个阴影贴图相交的线(即,沿着光相机翻转以捕获两个阴影贴图的平面)接触。 编辑: 更多的信息: 当我将点光源移离原点时,有一条线平行于光摄像机的“右”矢量来裁剪阴影。上图显示了将点光源向左移动的结果。如果将点光源向右移动,则在右边有一条等效的剪切线。因此,我认为这表明我在像素着色器中进行了错误的转换,就像我想的那样。 编辑:为了使这个问题更清楚,这里有一些代码。 这是我当前用来绘制阴影聚光灯的代码。这可以正常工作,并且可以按照您的期望使用阴影映射。 VertexShaderOutputMeshBased SpotLightMeshVS(VertexShaderInput input) { VertexShaderOutputMeshBased output = (VertexShaderOutputMeshBased)0; output.Position = mul(input.Position, WorldViewProjection); //we will compute our texture coords based on pixel position further output.TexCoordScreenSpace = output.Position; return output; } ////////////////////////////////////////////////////// …

4
阴影贴图和透明四边形
阴影贴图使用深度缓冲区来计算应在何处绘制阴影。 我的问题是我想要一些半透明的纹理四边形来投射阴影-例如广告牌树。由于将在所有四边形上设置深度值,而不仅仅是可见部分,因此它将投射四边形阴影,这不是我想要的。 如何使用阴影贴图使透明四边形投射正确的阴影?

3
第一次阴影贴图问题
我第一次使用着色器在OpenGL中实现了基本的阴影映射,现在遇到了一些问题。在下面,您可以看到我渲染的场景的示例: 我要进行的阴影映射的过程是,我使用“视图矩阵”从光的角度以及用于正常渲染的投影和模型矩阵将场景渲染到帧缓冲区。 在第二遍中,我将上述MVP矩阵从光的角度发送到顶点着色器,该顶点着色器将位置转换为光空间。片段着色器进行透视划分,并将位置更改为纹理坐标。 这是我的顶点着色器, #version 150 core uniform mat4 ModelViewMatrix; uniform mat3 NormalMatrix; uniform mat4 MVPMatrix; uniform mat4 lightMVP; uniform float scale; in vec3 in_Position; in vec3 in_Normal; in vec2 in_TexCoord; smooth out vec3 pass_Normal; smooth out vec3 pass_Position; smooth out vec2 TexCoord; smooth out vec4 lightspace_Position; void main(void){ pass_Normal …
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.