问题标签 [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 - Opengl 3.3+ 使用阴影映射时阴影不正确
我正在尝试使用 OpenGL 3.3+ 在我的景观编辑器上实现阴影映射。使用一些教程,我设法让我的代码编译和运行,但整个景观都处于阴影中,除了我的景观网格的后排(最小的 z)。
我目前正在为我的光使用与相机相同的投影、视图和模型矩阵(负 z 离相机最远)。
我的投影、视图和模型矩阵的初始化(来自 LWJGL 矩阵教程):
显示场景时绑定我的矩阵:
我已经通过在片段着色器中存储颜色测试了我的 FBO,高度图正确显示(我将 FBO 纹理绘制到屏幕角落的一个小四边形)并在我更改高度图时更新。
然后我修改了我的 FBO 以在第一遍时将深度存储到纹理中:
我的第一遍顶点着色器(创建阴影贴图):
我的第一遍片段着色器:
我的偏差矩阵:
第二遍的顶点着色器(使用阴影贴图渲染场景):
第二遍的片段着色器:
3d - 阴影贴图,woo 技巧,深度剥离
我正在尝试制作一个自阴影对象(opengl/glsl)。我做的步骤是:
1- 从灯光渲染场景以获得深度图
2- 从相机位置渲染并计算每个点到光源的距离,如果点到光源的距离大于存储在深度图中的深度,则该点处于阴影中。
但随之出现了暗影粉刺的问题。所以,第二步会像:
2- ...如果(abs(DISTANCE_OF_THE_POINT_TO_LIGHT - DEPTH_STORED_IN_THE_DEPTH_MAP)> BIAS)点在阴影中。
但它仍然没有给我很好的结果(没有合适的偏差值)。
所以,我实现了 woo 技巧(从光中找到第一个和第二个表面,然后将中点存储在深度缓冲区中)。为此,我进行了两次深度剥离。步骤是:
1- 像往常一样从灯光渲染场景以获得第一张深度图。
2- 从光照渲染场景得到第二张深度图,如果一个点到光照的距离等于第一张深度图中的距离,则丢弃该点(即不渲染第一层)。
3- 存储为您的最终深度图(第一个深度图 + 第二个深度图)/2
4- 从相机位置渲染并计算每个点到光源的距离,如果点到光源的距离大于深度图中存储的深度,则该点处于阴影中。
现在问题出现在第2步,我们之前遇到的SAME问题:当第一层和第二层接近时会出现舍入误差并且还会出现某种粉刺,并且也没有合适的偏差值。所以,我没有从 woo 算法中得到任何好处,它只是将问题转移到深度剥离部分。
你怎么能解决这个问题?
opengl - glsl 性能:tan(acos(x)) 与 sqrt(1-x*x)/x
我正在编写一个使用阴影映射的 glsl 片段着色器。按照本教程http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-16-shadow-mapping/,我写了这一行来评估 shaodw 偏差以避免阴影痤疮
但我从数学中知道
使用这样的身份而不是 tan 和 acos 会更快吗?在实践中,要使用这行代码
我认为我的问题类似于“gpu 在执行 sqrt 和除法或 tan 和 acos 方面是否更快?” ...还是我错过了什么?
opengl - OpenGL 3.3 两个 GPU 上的两个不同结果 nVidia Optimus 与阴影映射
因此,我正在使用 C++ 开发一个项目(在未来学习和创建游戏),而对于渲染,我选择了 OpenGL 3.3。我一直在研究我的处理器中内置的 Intel HD 4000,因为它会打开默认的新应用程序,一切都很顺利。但后来我尝试在我的第二个 GPU - nVidia GTX660m 上打开它,它要快得多,而且我预计它会有更多的 FPS。但是不,不仅我有几十个错误(例如 - 如果我在片段着色器中将 vec3 作为颜色输出,英特尔就可以了,但如果我没有输出 vec4,nVidia 就会完全疯狂的风格......)。当然编译时没有任何错误,所以它很难修复......
但是现在,当我解决了大部分问题时,我正在努力解决一个我无法按照我的意愿解决的问题(可能有一些肮脏的方法,但是......这不是重点)。
简而言之:我在两个 GPU 上生成有效深度图,但在 nVidia GPU 上它不是灰度的,bur red-to-black scale这非常奇怪,因为同一台机器上的相同代码(几乎)应该运行相同(也相同的 API!)。由于这个事实,我的片段着色器可能没有赶上它,并且在 nVidia 上没有检测到被照亮的区域并且它完全黑暗(至少在聚光灯下,定向光不起作用)。
图片:
重要 - 请注意 GTX660m 上的深度图是 redToBlack 比例,而不是像 Intel GPU 上的灰度。顶部的一个来自定向光,底部的一个当然来自点光源。
我的 FragmentShader:#version 330 核心
第一部分用于定向光 - 我在 5 个点中预采样深度图,如果所有点都相同,我不会进行更多采样(早期保释 - 很多性能优化!),或者如果有些不同,我会全部采样并计算当前片段上的阴影强度.
第二部分是简单地从点光深度图采样,然后我检查到光线中心的距离以模拟手电筒效果(中心更强)。
我认为不需要更多,但如果需要,请写,我会发布所需的代码。
还 - 阴影贴图只有 16 位精度(GL_DEPTH_COMPONENT16)英特尔 HD4000 比我的 GTX660m 更快(它更强大) - 这很奇怪。虽然我认为这是因为我不画任何高多边形,只是很多非常低的多边形。我对么?
c# - 使用 XNA 3.0 的软阴影技术
我正在使用 XNA 3.0(叹气,我知道),我正在编写一个教程,该教程有助于实现一个 3d 场景,其中的对象是聚光灯照射到圆环并投射出硬边阴影。现在,我想知道在哪里可以找到帮助(教程、源代码、片段)来柔化上述阴影?
opengl-es - 阴影贴图:在相同的 UV 上采样
当来自相机视图的 2 个像素位于阴影贴图上的相同 UV 上时,我在 OpenGL 中使用阴影贴图时遇到问题。这是这样的:
相同 UV 问题上的阴影贴图 http://img7.imageshack.us/img7/4459/ida9.png
两个可见阴影都出现在相同 UV 中的阴影贴图上,显然侧面的阴影是问题所在。有没有办法来解决这个问题 ?
这是我的片段着色器:
谢谢。
java - OpenGL 阴影映射双着色器
我正在尝试使用两个使用 OpenGL 和 LWJGL 的独立且不同的着色器编写一个简单的阴影映射引擎。它专门使用 VAO/VBO。旋转相机时会出现此问题。就好像阴影旋转了相机的两倍。
我首先在原点创建一个简单的立方体,并在立方体下方创建一个 2D 平面。
[因篇幅省略代码]
然后我创建了一个“太阳”(随时间移动),它使用正交投影来创建阴影贴图。
光源投影矩阵(近为1,远为100):
设置帧缓冲区/渲染缓冲区/纹理:
阴影贴图顶点着色器:
和阴影贴图片段着色器:
程序从灯光的角度渲染场景并创建阴影贴图,然后第二个渲染通道执行环境光照、镜面光照和尝试的阴影。
最终顶点着色器:
最终片段着色器:
我承认,在理解整个过程时,我觉得自己有点过头了,并且从各种来源拼凑起来。这个问题似乎很简单,但我无法弄清楚。
以下是图片:
未旋转:
旋转:
编辑:
将阴影贴图片段着色器更改为:
java - OpenGL 3+,具有定向光的正交投影
我目前遇到来自移动(类太阳)光源的定向光影贴图的问题。
当我最初实现时,光投影矩阵被计算为 3D,阴影贴图看起来很漂亮。然后我了解到,对于我正在尝试做的事情,正交投影会更好,但我很难替换正确的投影矩阵。
正如人们所期望的那样,每个滴答声,太阳都会沿着一个圆圈移动一定的量。我使用本土的“lookAt”方法来确定正确的查看矩阵。因此,例如,白天从早上 6 点到下午 6 点出现。当太阳位于上午 9 点的位置(45 度)时,它应该查看原点并将阴影贴图渲染到帧缓冲区。正交投影似乎发生的事情是它不会“向下倾斜”到原点。它只是继续直视 Z 轴。早上 6 点和下午 6 点看起来一切正常,但例如中午 12 点,就什么也没有了。
这是我设置的方式:
原始 3D 投影矩阵:
观察方法:
正交投影(使用宽度 100,高度 75,近 1.0,远 100)我已经尝试了许多不同的值:
阴影贴图顶点着色器:
阴影贴图片段着色器:
我觉得我在这里遗漏了一些非常简单的东西。正如我所说,这适用于 3D 投影矩阵,但我希望阴影在用户环游世界时保持不变,这对于定向照明和正交投影是有意义的。
opengl - 使用 GLSL 着色器的阴影映射的奇怪行为
我已经集成了基本的阴影贴图。但是我注意到渲染有一个奇怪的行为。总而言之,阴影映射技术需要 2 个步骤。第一个从光的角度渲染场景(填充深度纹理),第二个从相机的角度渲染。这是第一步的 C++ 代码:
这是输出:
地上长了痘痘。但是现在,如果我删除与将顶点发送到程序着色器对应的部分下方的代码:
我有以下输出(没有痤疮):
这是顶点着色器:
如您所见,我将顶点转换为光(视图)位置。因此,在我的 C++ 代码中,如果我不发送(在第二种情况下)顶点,我想知道它是如何工作的!(我只是发轻MVP矩阵!)最神奇的是没有粉刺了!你如何解释这种行为?我是否像第一种情况一样将顶点发送到着色器(并找到消除地板上痤疮的解决方案)?