- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
一段时间以来,我一直在尝试将屏幕空间像素(由延迟 HLSL 着色器提供)转换为光空间。结果令我感到惊讶,因为我的光照渲染似乎平铺了深度缓冲区。
重要的是,场景相机(或眼睛)和从同一位置开始渲染的光线。
首先,我使用以下代码提取像素的世界位置:
float3 eye = Eye;
float4 position = {
IN.texCoord.x * 2 - 1,
(1 - IN.texCoord.y) * 2 - 1,
zbuffer.r,
1
};
float4 hposition = mul(position, EyeViewProjectionInverse);
position = float4(hposition.xyz / hposition.w, hposition.w);
float3 eyeDirection = normalize(eye - position.xyz);
结果似乎是正确的,因为将 XYZ 位置渲染为 RGB 分别产生了这个(显然正确的)结果:
红色组件似乎在向右移动时正确输出 X,蓝色组件显示 Z 向前移动。 Y 因子看起来也正确,因为地面略低于 Y 轴。
接下来(为了确保我不会发疯),我决定输出原始深度缓冲区。通常,我将深度缓冲区保存在名为 DepthMap
的 Texture2D 中,作为输入传递给着色器。然而,在这种情况下,我尝试通过将其偏移回正确位置并将其乘以眼睛的 View 投影矩阵来撤消像素变换:
float4 cpos = mul(position, EyeViewProjection);
cpos.xyz = cpos.xyz / cpos.w;
cpos.x = cpos.x * 0.5f + 0.5f;
cpos.y = 1 - (cpos.y * 0.5f + 0.5f);
float camera_depth = pow(DepthMap.Sample(Sampler, cpos.xy).r, 100); // Power 100 just to visualize the map since scales are really tiny
return float4(camera_depth, camera_depth, camera_depth, 1);
这也会产生正确的结果(尽管我不能 100% 确定 Z 值)。另请注意,我已将结果设为指数级以更好地可视化深度信息(尝试实时比较时不会这样做):
所以理论上,我可以使用相同的代码通过乘以光的 View 投影矩阵将该像素世界位置转换为光空间。正确的?这是我尝试过的:
float4 lpos = mul(position, ShadowLightViewProjection[0]);
lpos.xyz = lpos.xyz / lpos.w;
lpos.x = lpos.x * 0.5f + 0.5f;
lpos.y = 1 - (lpos.y * 0.5f + 0.5f);
float shadow_map_depth = pow(ShadowLightMap[0].Sample(Sampler, lpos.xy).r, 100); // Power 100 just to visualize the map since scales are really tiny
return float4(shadow_map_depth, shadow_map_depth, shadow_map_depth, 1);
结果如下:
另一个更好地展示它是如何映射到世界的:
我不明白这是怎么回事。看起来它可能与投影矩阵有关,但我的数学不太好,无法确定发生了什么。这绝对不是光照贴图的宽度/高度,因为我尝试了多种贴图尺寸,并且投影矩阵是使用 FOV 和纵横比计算的,从来没有输入过宽度/高度。
最后,这里有一些 C++ 代码显示了我的透视矩阵(用于眼睛和光线)是如何计算的:
const auto ys = std::tan((T)1.57079632679f - (fov / (T)2.0));
const auto xs = ys / aspect;
const auto& zf = view_far;
const auto& zn = view_near;
const auto zfn = zf - zn;
row1(xs, 0, 0, 0);
row2(0, ys, 0, 0);
row3(0, 0, zf / zfn, 1);
row4(0, 0, -zn * zf / zfn, 0);
return *this;
我在这里完全不知所措。任何指导或建议将不胜感激!
编辑 - 我还忘了提到平铺图像是颠倒的,就好像 y 翻转破坏了它一样。这对我来说很奇怪,因为它需要正确地回到眼睛纹理空间。
最佳答案
我在这里和那里做了一些调整和修复。最终,我最大的问题是意外的转置矩阵。矩阵如何转置有点复杂,但这就是翻转的原因。我还更改为 D32 深度缓冲区(虽然我不确定是否有帮助)并确保任何位置除以它们的 W 影响所有组件(包括 W)。
所以代码如下:hposition.xyz = hposition.xyz/hposition.w
变成了这样:hposition = hposition/hposition.w
经过所有这些调整后,它开始看起来更像一个阴影贴图。
哦,转置矩阵是光的 ViewProjection。
关于c++ - DirectX 将像素世界位置转换为阴影贴图位置会产生奇怪的平铺结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39284114/
尝试使用集成到 QTCreator 的表单编辑器,但即使我将插件放入 QtCreator.app/Contents/MacOS/designer 也不会显示。不过,相同的 dylib 文件确实适用于独
在此代码示例中。 “this.method2();”之后会读到什么?在返回returnedValue之前会跳转到method2()吗? public int method1(int returnedV
我的项目有通过gradle配置的依赖项。我想添加以下依赖项: compile group: 'org.restlet.jse', name: 'org.restlet.ext.apispark', v
我将把我们基于 Windows 的客户管理软件移植到基于 Web 的软件。我发现 polymer 可能是一种选择。 但是,对于我们的使用,我们找不到 polymer 组件具有表格 View 、下拉菜单
我的项目文件夹 Project 中有一个文件夹,比如 ED 文件夹,当我在 Eclipse 中指定在哪里查找我写入的文件时 File file = new File("ED/text.txt"); e
这是奇怪的事情,这个有效: $('#box').css({"backgroundPosition": "0px 250px"}); 但这不起作用,它只是不改变位置: $('#box').animate
这个问题在这里已经有了答案: Why does OR 0 round numbers in Javascript? (3 个答案) 关闭 5 年前。 Mozilla JavaScript Guide
这个问题在这里已经有了答案: Is the function strcmpi in the C standard libary of ISO? (3 个答案) 关闭 8 年前。 我有一个问题,为什么
我目前使用的是共享主机方案,我不确定它使用的是哪个版本的 MySQL,但它似乎不支持 DATETIMEOFFSET 类型。 是否存在支持 DATETIMEOFFSET 的 MySQL 版本?或者有计划
研究 Seam 3,我发现 Seam Solder 允许将 @Named 注释应用于包 - 在这种情况下,该包中的所有 bean 都将自动命名,就好像它们符合条件一样@Named 他们自己。我没有看到
我知道 .append 偶尔会增加数组的容量并形成数组的新副本,但 .removeLast 会逆转这种情况并减少容量通过复制到一个新的更小的数组来改变数组? 最佳答案 否(或者至少如果是,则它是一个错
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
noexcept 函数说明符是否旨在 boost 性能,因为生成的对象中可能没有记录异常的代码,因此应尽可能将其添加到函数声明和定义中?我首先想到了可调用对象的包装器,其中 noexcept 可能会产
我正在使用 Angularjs 1.3.7,刚刚发现 Promise.all 在成功响应后不会更新 angularjs View ,而 $q.all 会。由于 Promises 包含在 native
我最近发现了这段JavaScript代码: Math.random() * 0x1000000 10.12345 10.12345 >> 0 10 > 10.12345 >>> 0 10 我使用
我正在编写一个玩具(物理)矢量库,并且遇到了 GHC 坚持认为函数应该具有 Integer 的问题。是他们的类型。我希望向量乘以向量以及标量(仅使用 * ),虽然这可以通过仅使用 Vector 来实现
PHP 的 mail() 函数发送邮件正常,但 Swiftmailer 的 Swift_MailTransport 不起作用! 这有效: mail('user@example.com', 'test
我尝试通过 php 脚本转储我的数据,但没有命令行。所以我用 this script 创建了我的 .sql 文件然后我尝试使用我的脚本: $link = mysql_connect($host, $u
使用 python 2.6.4 中的 sqlite3 标准库,以下查询在 sqlite3 命令行上运行良好: select segmentid, node_t, start, number,title
我最近发现了这段JavaScript代码: Math.random() * 0x1000000 10.12345 10.12345 >> 0 10 > 10.12345 >>> 0 10 我使用
我是一名优秀的程序员,十分优秀!