问题标签 [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 - 阴影映射是否在单独的通道中?
在我的引擎中,我有很多处理指定纹理组合的着色器,例如 DiffTexShader、NoTexShader、DiffTexNormalMapShader、DiffTexLightmapShader 等。
现在我想添加阴影映射效果。做什么比较好?在单独的通道中进行阴影贴图然后将原始场景与仅阴影场景结合起来会更好吗?或者最好复制我所有的着色器并让它们能够使用阴影贴图来计算阴影?
我认为第一种方法更好维护(只有一个额外的着色器用于渲染阴影),但比第二种方法慢得多。
glsl - 在 WebGL 中将 Z 缓冲区渲染为纹理
当我像这样创建 z-buffer 纹理时:
我得到了一个合适的 z 缓冲区,然后我可以将其用于阴影(并且我的阴影渲染得很好)。但是,如果我创建一个颜色纹理,并使用 z 值为纹理着色,我的阴影会有很多伪影(即使偏差很大)。颜色缓冲区是这样创建的:
这是写入颜色缓冲区的片段着色器程序:
当我将这两个纹理渲染到某个表面时,它们看起来很相似。
所以我的问题是,为什么我的颜色纹理不起作用?gl_FragCoord.z 不是写入 z 缓冲区的正确 z 值吗?根据http://www.opengl.org/sdk/docs/manglsl/xhtml/gl_FragCoord.xml它是。绑定颜色缓冲区时,纹理协调是否不同?还是z值不正确?
javascript - Three.js 阴影投射在通畅的脸上,低分辨率启动
这是我的问题:
.
文本上的阴影不应该存在,尽管我更改了 shadowMap 分辨率,但没有任何变化。这是用于生成网格的代码:
我的渲染器是这样设置的:
欢迎任何帮助。
opengl - 阴影映射总是产生超出远平面的阴影
我正在我的引擎中开始全向阴影映射。现在我只制作一个阴影贴图作为测试。使用我当前的着色器时,我得到了一个奇怪的结果。这是显示问题的屏幕截图:
我在阴影贴图渲染的投影矩阵中使用了 0.5 的近值和 5.0 的远值。据我所知,任何光空间 z 大于我的远平面距离的值都由我的片段着色器计算,就像在阴影中一样。
这是我的片段着色器:
我该如何解决这个问题(除了增加我的远平面距离)?
另一个问题,因为这是我第一次尝试阴影映射:我是否正确地进行与阴影相关的照明?
c++ - 阴影映射。帧缓冲区错误 36060
我正在从教程中执行此操作,并且我拥有教程中的代码。但由于某种原因无法正常工作。因此,我进行了调试,发现它有一个 36060 错误,据我所知,也称为 GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER,但我真的不明白为什么。我搜索了答案,每个人都说 glReadBuffer(GL_NONE); 但即便如此,我也会遇到同样的错误。
编辑:似乎 glReadBuffer 根本不起作用,我不知道为什么。我试过 glGetError 并没有错误
opengl - 使用 GLSL 和 OpenGL 阴影映射无法正常工作
我有一个由 2 个网格(平面、立方体)、一个灯光和一个相机组成的场景。我想使用带有 GLSL 着色器和 OpenGL 的阴影映射技术在我的场景上显示阴影。
这是我得到的结果(为了简单起见,我的立方体和我的飞机都是蓝色和颜色):
这是 FBO 和深度纹理初始化:
这是我的顶点着色器的内容:
我的片段着色器之一:
如您所见,模型上有一些工件,我不知道如何撤回它们。但是阴影似乎是正确的,所以我的着色器中输入的变量也应该是正确的(我认为是这样)。
我在片段着色器中尝试了另一种技术,如下所示:
您会注意到我没有使用 sampler2DShadow,但现在使用的是 sampler2D。但正如您所见,没有显示任何阴影:
有人可以帮助我吗?
c++ - OpenGL阴影贴图问题
我实现了一个相当简单的阴影贴图。我有一个简单的 obj 导入平面作为地面和一堆树。
我在飞机上有一个奇怪的阴影,我认为这是飞机的自身阴影。我不确定要发布什么代码。如果有帮助,请告诉我,然后我会这样做。
第一张图像,场景的相机视图。奇怪的纹理低多边形球体仅供参考光的位置。
第二张图像,存储在帧缓冲区中的深度纹理。我用它从光的角度计算了阴影坐标。由于我不能发布超过 2 个链接,我会留下这个。
第三张图像,深度纹理,具有更好的平面视图,从整个场景上方的不同灯光位置投射阴影。
LE:第二张图片http://i41.tinypic.com/23h3wqf.jpg(第一张图片的深度纹理)尝试了一些修复,在第一遍绘制地面之前添加 glCullFace(GL_BACK) 将其从深度纹理中移除但仍然出现在最终渲染中(如第一张图片中,地面的后部) - 我也尝试在第二遍中添加 CullFace,仍然显示地面上的阴影,尝试了正面和背面的所有组合。可能是因为正投影中的值吗?
阴影片段着色器:
c++ - 点光源阴影立方体贴图
所以我设法为定向光(无限延伸)创建阴影贴图。现在我正在尝试创建点光阴影立方体贴图,因此阴影在光->片段的方向上传播。我像这样创建了一个新的 FBO:
这个函数在整形时调用(所以你可以在初始化时说)整形在程序启动时调用一次。
接下来我创建我的 light_view 矩阵,每个视图用于不同的立方体面,以及我的投影矩阵,如下所示:
投影矩阵好吗?在做立方体贴图而不是像我对定向光做的正交映射时,它应该是透视图吗?我不知道这些值是否正常:这就是我所拥有的,纹理的宽度和高度是 1366 x 768,这是我的窗口大小,我的整个场景在 z 轴上从 -70 到 70,所以总共 140 ,我选择了 pi/4 的 fov。
继续,第一遍 - 希望生成立方体贴图的 6 个面:
现在第二遍应该根据片段位置绘制阴影(我应该在绘图函数中还是在着色器中执行此操作?)
正如您在最后一部分中看到的那样,我从相机位置绘制并传递给着色器,立方体贴图从第一遍生成。到目前为止,我有一些误解,可能还有一些错误。
我从第一遍(从着色器)返回什么,当我为定向光进行阴影映射时,我返回了深度(glFragcoord.z)但现在我必须返回 vec3 方向?我如何计算它。我需要其他东西传递给着色器吗?
第二部好吗?我是否只是绘制对象并将立方体贴图传递给着色器并让他计算哪个片段相对于光在哪里?如果是这样,我该如何计算?
这是我的第一遍着色器(因此从 6 个光照视图生成立方体贴图):
以及第二遍的着色器(尝试通过从世界空间中的像素位置获取 vec3 来计算阴影 - 世界空间中的光位置)
对不起,代码墙,我想发布所有相关的东西,以便我能得到更好的帮助。我的问题是,一切都呈现半黑色,因为我将片段着色器中的输出颜色设置为 0.5,如果我不这样做,那么它全部呈现黑色。
glsl - OpenGL shadow mapping weirdness with uniform array
I was trying to run a little game/demo written by a friend of mine for mostly educational purposes, Land of Dreams. I noticed some extremely strange behaviour on my computer, even though the application was reportedly run successfully on several nVidia and ATI GPUs with relatively recent drivers.
The fragment shader is similar to the following:
Of course, the real fragment shader is more complicated, but Visibility()
is where the problems lie.
In particular, the following artefacts occur when multiple objects cast shadows to the same fragment.
In this case, the if (visibility <= 0.0)
early return is in effect, which is a bit unconventional, but I believe it is valid GLSL.
While experimenting a bit, we managed to remove the artefacts by removing the early return and replacing the last line of Visibility()
with
Now, an even stranger thing happened: one less shadows were cast then before. In fact, we managed to bring back the shadow by replacing the outer loop with
Of course, this does no make any sense at all! The uniform array of matrices was filled with data with the exactly same code as before, so there should not be any difference. Indexing a uniform array with negative indices is just plain invalid, anyway.
By adding the following statements to where the early return was, the indices came back to normal:
Of course, the branch above is effectively a no-op, since visibility starts from 1.0 and is always decreased in the loop. The fragment shader behaves the same way with #pragma optimize(off)
, i.e. the bogus branch is needed for proper operation.
The artefacts are only produced on my machine, with the following GPU and driver (relevant lines taken from glxinfo
):
The server glx is VirtualGL, because I am using Bumblebee/Primus to render with my Optimus graphics card. I run Arch Linux with the 3.11.6 kernel.
Could someone shed some light on what is going one? I tried different nVidia driver versions with the same results, so I think it is improbable that we are facing with a driver bug. What is wrong with the fragment shader above?
UPDATE: I realized the versions of the fragment shader with branches in the inner loop are examples of non-uniform control flow:
If the accessed texture uses mipmapping or anisotropic filtering of any kind, then any texture function that is not "Lod" or "Grad" will retrieve undefined results.
Because our shadow maps use no mip-mapping or texture filtering, I don't think this would apply. What fixes the broken indices is putting back the branch, so maybe we are triggering some driver behaviour connected to non-uniform control flow here?
c++ - Opengl-es 2.0 中的阴影贴图与立方体贴图
我对 OpenGL ES 很陌生,我正在尝试为我当前的场景添加一些阴影。我决定在立方体贴图的帮助下做到这一点。我使用的是 OpenGL es 2.0,所以几何着色器或 gl_FragDepth 变量对我来说不可用。我用谷歌搜索了一些,所以我对这个话题有了一些了解,阅读这个(http://www.cg.tuwien.ac.at/courses/Realtime/repetitorium/2010/OmnidirShadows.pdf)证明非常有用。基本上我依赖这个链接的文档。
但是我的代码有问题,因为在渲染场景中,每个像素都处于阴影之下。我认为问题可以在我的着色器中找到,但我将所有相关代码粘贴在这里以清楚地查看所有内容。
设置帧缓冲区并创建立方体贴图:
在 Display 函数中,我尝试实现 6 个渲染通道来填充阴影贴图(立方体的 6 个边)。
渲染:
所以这里有不同的着色器。我有一个顶点着色器和一个片段着色器用于深度计算,一个顶点着色器和一个片段着色器用于屏幕渲染。我的问题是我不确定如何写入立方体贴图,如果正在使用帧缓冲区,那么 gl_Position 会确定给定立方体面中的坐标吗?
用于深度计算的顶点着色器:
用于深度计算的片段着色器:
用于渲染到屏幕的顶点着色器:
用于渲染到屏幕的片段着色器:
同样,问题在于每个像素都处于阴影之下。从代码中我排除了一些统一传递给着色器,但它们没问题。你能给我一个建议,我应该在代码中修复什么吗?我的着色器(尤其是第一遍)是否正确,我是否正确设置了立方体映射的转换?谢谢你。
PS:这是我在这里的第一个问题,我希望它足够清楚并满足正确发布问题的要求。