问题标签 [shadow-mapping]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
opengl - Multi lights shadow mapping does not work correctly using GLSL
I have implemented the basic shadow mapping algorithm but it works correctly with only one light.
I want to render a scene with two following point lights :
- Light_1 - position : vec3(-8.0f, 5.0f, 8.0f), direction : vec3(1.3f, -1.0f, -1.0f)
- Light_2 - position : vec3(8.0f, 5.0f, 8.0f), direction : vec3(1.3f, -1.0f, -1.0f)
If I render separately the two lights I have the following results:
Rendering with Light_1 :
Rendering with Light_2 :
But the two light together it looks like this :
As you can see the first shadow seems to be rendered correctly, but it is below the shadow of the light_2 which is not correct. To sum up the situation I have the texture of my box which is bound to the texture unit 0. The shadow depth texture is bound from the texture unit 1 and if there are more than one depth texture (so at least two ligths, like in this example), there are bound to the texture unit 1 + 1 (GL_TEXTURE1 + 1). Here's the code that represent what I said :
It corresponds in our case to :
The vertex shader is the following (available for just 2 lights):
And a piece of code of the fragment shader :
It's look like a texture unit problem because separatly the two shadows have been rendered perfectly and I use glActiveTexture correctly (I think so). Plus, I noticed that if I change the loading order of the lights, the bad shadow is caused by 'the other light' (it's the contrary). So it seems to comes from the texture unit 2, but I don't understand why. Does anyone can help me, please ? Thanks a lot in advance for your help.
opengl - GLSL 1.20 阴影映射,扭曲阴影
一个星期以来,我一直在试图找出我的应用程序中的一个奇怪问题。我实现了一个非常简单的阴影映射应用程序,我得到了一个阴影,但是随着游戏摄像机的移动,它会以一种奇怪的方式移动和扭曲。
我认为一个明显的解释是矩阵的计算方式错误,但我已经证实这不是原因。我的着色器非常简单,我得到了正确渲染的深度图,我在应用程序中将其可视化。
这是我从该应用程序中获得最多想法的地方: http ://www.opengl-tutorial.org/intermediate-tutorials/tutorial-16-shadow-mapping/
这是我的阴影着色器:
shadow_shader.frag
shadow_shader.vert
如果我在片段着色器的开头写这个,我可以让代码工作
我认为我的 FBO 创作非常标准。以下是创建 FBO 和渲染内容的最重要的代码行:
我开始怀疑这里存在驱动程序错误,但在很多情况下,错误通常在代码中。
我在 Linux Mint Debian 版中运行这个应用程序,我的 lspci 说:
英特尔公司移动 945GM/GMS、943/940GML Express 集成图形控制器(修订版 03)
和 glxinfo 说:
我花了几个小时在谷歌上搜索类似的问题,但没有任何运气。我很有信心我的阴影贴图数学没问题,但这里还有一些我没有看到的其他问题。如果有人能阐明这一点,我会很高兴在这里谈论它。
opengl - 阴影贴图和深度值混淆
我正在为延迟的 OpenGL 4.3 渲染器中的聚光灯做阴影映射。
我一直在尝试遵循有关该主题的一些教程,并在其后通过片段着色器进行建模,但我不明白的是计算阴影因子的最终比较。我从深度图(“”)中采样的值unifShadowTexture
在 [0, 1] 的范围内,因为它直接来自深度缓冲区,但如何projCoords.z
钳制到 [0, 1]?.w
是否通过将其钳位到 [0,1] 来进行除法?我面临的问题是场景的主要部分是阴影,即使它不应该是,例如底层,在下图中(忽略光伪影,由于缺乏偏差 - 重点是模型亮了,但一楼没有):
opengl - Rendering orthographic shadowmap to screen?
I have a working shadow map implementation for directional lights, where I construct the projection matrix using orthographic projection. My question is, how do I visualize the shadow map? I have the following shader I use for spot lights (which uses a perspective projection) but when I try to apply it to a shadow map that was made with an orthographic projection all I get is a completely black screen (even though the shadow mapping works when renderering the scene itself)
java - 阴影贴图的光通不适用于细分?
我目前正在实现阴影映射,并且在我的程序中遇到了一些奇怪的逻辑,我使用以下程序:
light.vs.glsl
light.fs.glsl
但是我得出的结论是我实际上是在做 Tesselation,所以我真的不知道现在发生了什么,在Terrain.java
:
同样对于lightProgram
传递给 的drawLightPass
,已确保lightProgram.use()
在此之前已调用过 ,这从代码中可能看起来并不明显。
正如你所看到的,我用 as argument调用drawArrays
,现在这真的应该出错了,因为在我的整个程序中,我发现每个部分都被认为是在阴影中,所以我有这些问题:drawLightPass
GL_PATCHES
1) 我当前的设置有问题吗?(我个人认为是。)
GL_PATCHES
2) 如果我在附加的着色器没有启用 Tesselation 时传入,OpenGL 如何不给出错误?
3)如何修复它,使其也适用于 Tesselation?
如果需要更多代码,那么我会发布它,我只是不想用不必要的代码使帖子过于混乱。
opengl - 阴影贴图着色器
我有一个实现阴影映射的着色器,如下所示:
我想要做的是首先检查片段是否确实在阴影中,然后才更改颜色(将其减半,使其变为全黑和原始颜色之间的一半)。
但是如何检查textureProj(...)
结果是否确实在阴影中,据我所知它返回一个标准化float
值。
类似的东西textureProj(...) > 0.9999
已经足够了吗?我知道如果您使用多重采样,它可以返回零或一以外的值,并且我希望行为不会只在某一点中断。
输出顶点着色器:
请注意,片段着色器用于地形,顶点着色器用于地板,因此两者之间可能存在细微的不一致,但它们应该是不相关的。
shadow_matrix
是作为 传入的制服bias_matrix * light_projection_matrix * light_view_matrix * light_model_matrix
。
opengl - opengl 使用深度缓冲区进行阴影 - 有什么理由不只是将 z 渲染到 tex 而不是使用深度缓冲区?
所以我正在努力实现阴影映射。到目前为止,我已经从相机的角度将几何体(深度、法线、颜色)渲染到帧缓冲区,并从光的角度渲染了几何体的深度。现在,我从相机的角度渲染光照,对于每个片段,我将比较它与光照的距离,与 render-from-the-lights-pov 通道中的深度 tex 值。如果距离较远,则它处于阴影中。(只是在这里重述以确保没有任何我没有意识到我不明白的东西)。
所以,要完成这最后一步,我需要将深度值 [0-1] 转换为其眼睛空间值 [0.1-100](我的近/远平面)。(这里的解释——从深度缓冲区获取真正的 z 值)。
是否有任何理由不让render-from-the-lights-pov 传递直接将片段到相机(z 组件)的距离写入纹理?那么我们就不必处理荒谬的转换了吗?还是我错过了什么?
three.js - 三.js shadowCascade DirectionalLight
我正在尝试将 shadowCascade 功能从http://threejs.org/examples/webgl_morphtargets_md2_control.html复制到我的项目中。我以 1:1 的比例进行了此操作,但是在某些角度和旋转时我只得到一点阴影,并且经常被切断。此外,从一开始就启用 shadowCascade 会引发着色器错误。我必须等待一段时间才能设置 shadowCascade = true。
我试图找到解释 shadowCascade 如何工作以及所有这些参数的作用的文档、链接或提示,但到目前为止没有成功。
总而言之,我很困惑,我真的不明白发生了什么以及为什么。在此先感谢您的澄清和帮助!
编辑:这是效果的视频
opengl - glsl sampler2DShadow 和 shadow2D 澄清
我所在位置的快速背景(以确保我们在同一页面上,并检查我是否遗漏/假设一些愚蠢的东西):
- 目标:我想使用延迟光照和阴影贴图来渲染我的场景。
- 奋斗:找到关于如何使用 shadow2D 和 sampler2DShadow 的清晰一致的文档。
这是我目前正在做的事情:
在我的最终渲染通道的片段着色器(实际计算最终片段值的那个)中,我有来自灯光的通道的 MVP 矩阵,来自所述通道的深度纹理(又名“阴影贴图”),以及我的几何缓冲区中的位置/法线/颜色纹理。
据我了解,我需要找到当前片段的位置对应的阴影贴图的UV。我通过以下方式做到这一点:
现在我有了这个紫外线,我可以从光线的 pov 中获得感知的“深度”
并将其与当前片段位置与灯光之间的距离进行比较:
问题来自“深度”存储在值 0-1 中,而实际距离位于世界坐标中。我尝试手动进行转换,但无法正常工作。在网上搜索时,看起来我应该这样做的方式是使用 sampler2DShadow ...
所以这是我的问题:
我需要进行哪些更改才能使用 shadow2D?shadow2D 甚至可以做什么?它或多或少只是一种从深度到世界的自动转换纹理?我可以使用相同的深度纹理吗?还是我需要以不同的方式渲染深度纹理?我将什么传递给 shadow2D?我要检查的片段的世界空间位置?还是和以前一样的紫外线?
如果所有这些问题都可以在一个简单的文档页面中得到解答,我希望有人可以发布它。但我发誓我已经搜索了好几个小时,但找不到任何能简单说明 shadow2D 到底发生了什么的东西!
谢谢!
c++ - 为阴影贴图计算的纹理坐标不正确
我在获取正确的纹理坐标以对我的阴影贴图进行采样时遇到问题。查看我的代码,问题似乎来自不正确的矩阵。这是我做阴影的渲染通道的片段着色器:
我已经从这个着色器中删除了所有与阴影无关的代码(照明等)。这是我用来渲染最终通道的代码:
如果它与我的问题相关,这里是我如何为深度和阴影贴图生成深度帧缓冲区附件:
我的数学或代码中的问题在哪里,我能做些什么来解决它?