我目前正在将阴影贴图(准确地说是级联阴影贴图)编程到我的 C++ opengl 引擎中。因此,我想要一个包含我的光源和我的阴影贴图中每个像素之间的距离的纹理。我应该使用哪种纹理类型?
我看到有一个GL_DEPTH_COMPONENT纹理内部格式,但是它将我想要给纹理的数据缩放到[0,1]。我是否应该在创建阴影贴图时反转一次长度,然后在最终渲染期间反转第二次以取回实际长度?好像没什么用!
有没有一种方法可以使用纹理来存储长度而不用将它们反转 2 次? (一次在创建纹理时,一次在使用过程中)。
最佳答案
我不确定你说的反转是什么意思(我敢肯定你不是说要反转距离,因为这是行不通的)。您所做的是将到光源的距离转换为 [0,1] 范围。
这可以通过为光源的 View 构建一个普通的投影矩阵并将其应用于阴影贴图构建过程中的顶点来完成。通过这种方式,它们到光源的距离被写入深度缓冲区(您可以通过 glCopyTexSubImage 或 FBO 将具有 GL_DEPTH_COMPONENT 格式的纹理连接到深度缓冲区)。在最后一步中,您当然会使用相同的投影矩阵来使用投影纹理计算阴影贴图的纹理坐标(使用 GLSL 时使用 sampler2DShadow 采样器)。
但这种变换不是线性的,因为深度缓冲区在观察者(或本例中的光源)附近具有更高的精度。另一个缺点是您必须知道距离值的有效范围(光源影响的最远点)。使用着色器(我假设你这样做),你可以通过将到光源的距离除以这个最大距离来使这个线性变换,然后手动将它分配给片段的深度值(GLSL 中的 gl_FragDepth) ,这可能就是您所说的“反转”的意思。
可以通过对光距离使用浮点纹理并将距离写为颜色 channel 然后自己在最终 channel 中执行深度比较(使用正常 sampler2D)。但线性过滤浮点纹理仅在较新的硬件上受支持,我不确定这是否会比每个片段的单个分割更快。但这种方式的优点是,这为“方差阴影贴图”之类的东西开辟了道路,这对于普通的 ubyte 纹理(因为精度低)和深度纹理都不会很好地工作。
所以总而言之,GL_DEPTH_COMPONENT 只是 ubyte 纹理(缺乏必要的精度,因为 GL_DEPTH_COMPONENT 应该至少有 16 位精度)和浮点纹理之间的一个很好的折衷(在旧硬件上速度不快或完全不支持)。但是由于其定点格式,您无法绕过 [0,1] 范围内的转换(无论是线性还是投影)。我不确定浮点纹理是否会更快,因为你只保留一个分区,但如果你使用的是支持线性(甚至三线性) float 纹理过滤和 1 或 2 个组件 float 纹理和渲染目标的最新硬件,可能值得一试。
当然,如果您使用固定功能管道,您只有 GL_DEPTH_COMPONENT 作为一个选项,但关于您的问题,我假设您正在使用着色器。
关于c++ - 在 opengl 阴影映射中将顶点深度信息存储在纹理中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6751836/
我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,
大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
我正在编写一个简单的静态Rack应用程序。查看下面的config.ru代码:useRack::Static,:urls=>["/elements","/img","/pages","/users","/css","/js"],:root=>"archive"map'/'dorunProc.new{|env|[200,{'Content-Type'=>'text/html','Cache-Control'=>'public,max-age=6400'},File.open('archive/splash.html',File::RDONLY)]}endmap'/pages/search.
在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList()Obt
如何将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.你能做的最好的事情是:
深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal
我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我
有没有一种简单的方法可以将给定的整数格式化为具有固定长度和前导零的字符串?#convertnumberstostringsoffixedlength3[1,12,123,1234].map{|e|???}=>["001","012","123","234"]我找到了解决方案,但也许还有更聪明的方法。format('%03d',e)[-3..-1] 最佳答案 如何使用%1000而不是进行字符串操作来获取最后三位数字?[1,12,123,1234].map{|e|format('%03d',e%1000)}更新:根据theTinMan的