草庐IT

c++ - 实时动态阴影来补充延迟着色?

coder 2024-02-17 原文

我目前有一个延迟渲染系统设置,可以渲染点光源和平行光。我的问题是,对于不同形式的阴影我有哪些选择,这些阴影可以基于点光源和定向光源制作阴影,这可能会使用延迟着色设置?

最佳答案

需要独特阴影技术的延迟渲染并没有什么特别之处。大多数产生阴影的标准方法都适用于延迟渲染方案。

阴影贴图是当今游戏等实时应用中最常用的阴影算法。模板阴影在几年前很流行,但由于各种限制而有点失宠。阴影映射适用于延迟着色。阴影映射的基本算法相当简单:

  1. 从光的角度渲染渲染目标纹理的深度(您需要为点光源渲染立方体贴图的 6 个面)。
  2. 当您对灯光执行照明 channel 时,对于每个像素,将世界空间位置转换为灯光的 View 空间,并将深度与存储在阴影贴图中的深度进行比较。如果它大于阴影贴图深度,则该点处于阴影中,否则正常点亮。

与渲染一样,细节决定成败。为了获得高质量的阴影,您需要仔细设置阴影贴图投影,以充分利用阴影贴图中可用的像素(搜索透视阴影贴图、级联阴影贴图)。由于精度问题,您会得到各种带有自阴影表面的伪像(“阴影痤疮”是最常见的一种),并且有多种策略可以减少这些伪像的发生率(深度偏差、投影矩阵调整)。为了减少分辨率不足的阴影贴图的 block 状、像素化外观,您可能需要执行一些阴影贴图过滤。百分比接近过滤是标准方法,执行 PCF 有多种方法。

您还面临阴影的标准质量/性能权衡,而动态阴影往往是场景渲染中最昂贵的方面之一。有许多技巧和技术可以尝试最大限度地提高阴影贴图的性能。

最近,基本阴影贴图算法出现了许多变体,这些变体试图通过不同方式解决过滤问题,从而为给定的阴影贴图分辨率提供更好看的结果。 Variance Shadow Maps 和 Exponential Shadow Maps 是两种最新的技术,它们具有一些不错的优点,但也存在一些独特的问题。

Nvidia 的 developer site是一般图形编程的好资源,有很多关于阴影的文章。查看网站上提供的 GPU Gems 书籍的 HTML 版本,它们有各种关于阴影的文章,包括关于 GPU Gems 3 中方差阴影贴图的权威文章。

关于c++ - 实时动态阴影来补充延迟着色?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1212859/

有关c++ - 实时动态阴影来补充延迟着色?的更多相关文章

  1. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  2. ruby - 使用 `+=` 和 `send` 方法 - 2

    如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:

  3. ruby - 如何计算 Liquid 中的变量 +1 - 2

    我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我

  4. ruby - 在 Ruby 中动态创建数组 - 2

    有没有办法在Ruby中动态创建数组?例如,假设我想遍历用户输入的书籍数组:books=gets.chomp用户输入:"TheGreatGatsby,CrimeandPunishment,Dracula,Fahrenheit451,PrideandPrejudice,SenseandSensibility,Slaughterhouse-Five,TheAdventuresofHuckleberryFinn"我把它变成一个数组:books_array=books.split(",")现在,对于用户输入的每一本书,我想用Ruby创建一个数组。伪代码来做到这一点:x=0books_array.

  5. ruby - 是否可以将 IRB 提示配置为动态更改? - 2

    我想在IRB中浏览文件系统并让提示更改以反射(reflect)当前工作目录,但我不知道如何在每个命令后进行提示更新。最终,我想在日常工作中更多地使用IRB,让bash溜走。我在我的.irbrc中试过这个:require'fileutils'includeFileUtilsIRB.conf[:PROMPT][:CUSTOM]={:PROMPT_N=>"\e[1m:\e[m",:PROMPT_I=>"\e[1m#{pwd}>\e[m",:PROMPT_S=>"FOO",:PROMPT_C=>"\e[1m#{pwd}>\e[m",:RETURN=>""}IRB.conf[:PROMPT_MO

  6. ruby-on-rails - 在所有延迟的作业之前 Hook - 2

    是否可以在所有delayed_job任务之前运行一个方法?基本上,我们试图确保每个运行delayed_job的服务器都有我们代码的最新实例,所以我们想运行一个方法来在每个作业运行之前检查它。(我们已经有了“check”方法并在别处使用它。问题只是关于如何从delayed_job中调用它。) 最佳答案 现在有一种官方方法可以通过插件来做到这一点。这篇博文通过示例清楚地描述了如何执行此操作http://www.salsify.com/blog/delayed-jobs-callbacks-and-hooks-in-rails(本文中描述

  7. arrays - Ruby 数组 += vs 推送 - 2

    我有一个数组数组,想将元素附加到子数组。+=做我想做的,但我想了解为什么push不做。我期望的行为(并与+=一起工作):b=Array.new(3,[])b[0]+=["apple"]b[1]+=["orange"]b[2]+=["frog"]b=>[["苹果"],["橙子"],["Frog"]]通过推送,我将推送的元素附加到每个子数组(为什么?):a=Array.new(3,[])a[0].push("apple")a[1].push("orange")a[2].push("frog")a=>[[“苹果”、“橙子”、“Frog”]、[“苹果”、“橙子”、“Frog”]、[“苹果”、“

  8. ruby-on-rails - carrierwave:在序列化动态属性上安装 uploader - 2

    首先,我使用的是rails3.1.3和来自master的carrierwavegithub仓库的分支。我使用after_init钩子(Hook)来确定基于属性的字段页面模型实例并为这些字段定义属性访问器将值存储在序列化哈希中(希望它清楚我是什么谈论)。这是我正在做的事情的精简版:classPage省略mount_uploader命令让我可以访问我想要的属性。但是当我安装uploader时出现错误消息说“nil类的未定义新方法”我在源代码中读到有方法read_uploader和扩展模块中的write_uploader。我如何必须覆盖这些来制作mount_uploader命令使用我的“虚拟

  9. += 的 Ruby 方法 - 2

    有没有办法让Ruby能够做这样的事情?classPlane@moved=0@x=0defx+=(v)#thisiserror@x+=v@moved+=1enddefto_s"moved#{@moved}times,currentxis#{@x}"endendplane=Plane.newplane.x+=5plane.x+=10putsplane.to_s#moved2times,currentxis15 最佳答案 您不能在Ruby中覆盖复合赋值运算符。任务在内部处理。您应该覆盖+,而不是+=。plane.a+=b与plane.a=

  10. ruby - 在 Ruby 中动态生成多维数组 - 2

    我正在尝试动态构建一个多维数组。我想要的基本上是这样的(为简单起见写出来):b=0test=[[]]test[b]这给了我错误:NoMethodError:undefinedmethod`test=[[],[],[]]而且它工作正常,但在我的实际使用中,我不会事先知道需要多少个数组。有一个更好的方法吗?谢谢 最佳答案 不需要像您正在使用的索引变量。只需将每个数组附加到您的test数组:irb>test=[]=>[]irb>test[["a","b","c"]]irb>test[["a","b","c"],["d","e","f"]]

随机推荐