我一直在研究游戏引擎中地形系统的不同方法,试图让自己熟悉这项工作。许多细节看起来很简单,但我对一个细节感到困惑。
出于性能原因,许多地形解决方案利用着色器生成部分或全部几何体,例如生成位置的顶点着色器或用于 LoD 的曲面 segmentation 着色器。起初我认为这些方法专门用于不关心物理模拟的渲染。
我之所以这么说,是因为就我目前对着色器的了解而言,着色器计算的结果通常会在帧末尾被丢弃。因此,如果您严重依赖着色器,那么几何信息将在您访问它并将其发送到另一个系统(例如在 CPU 上运行的物理系统)之前消失。
那么,我对着色器的理解是错误的吗?您能否存储它们生成的几何图形的结果以供其他系统访问?或者我是否被迫将地形几何图形保留在 CPU 上并将着色器留给其他细节?
最佳答案
您正确理解了部分着色器,即:在一帧之后,数据作为最终合成图像存储在后台缓冲区中。
但是:使用变换反馈,可以将变换后的几何图形捕获到顶点缓冲区并重新使用它。变换反馈发生在顶点/几何/曲面 segmentation 着色器之后,因此您可以使用几何着色器生成地形(或它的可见部分一次),通过变换反馈推送它并存储它。 这样,您就有可能对您的地形使用 CPU 碰撞检测!您甚至可以将其与曲面 segmentation 相结合。
你会喜欢这个:A Framework for Real-Time, Deformable Terrain .
对于 LOD 和曲面 segmentation :LOD 不是曲面 segmentation 的先决条件。您可以使用 segmentation 来实现一些更复杂的效果,例如通过对粗糙几何体的递归 segmentation 来添加细节。将它与 LOD 链接只是一个非常好的优化,避免了基于 RAM 内存的 LOD 网格级别,因为您只有“基础网格”并对其进行 segmentation (尽管这将是一个不令人满意的优化恕我直言)。
现在更深入地了解 GPU 和 CPU 独占地形。
如 NVidia 文章 Generating Complex Procedural Terrains Using the GPU 中所写:
1.2 Marching Cubes and the Density Function Conceptually, the terrain surface can be completely described by a single function, called the density function. For any point in 3D space (x, y, z), the function produces a single floating-point value. These values vary over space—sometimes positive, sometimes negative. If the value is positive, then that point in space is inside the solid terrain.
If the value is negative, then that point is located in empty space (such as air or water). The boundary between positive and negative values—where the density value is zero—is the surface of the terrain. It is along this surface that we wish to construct a polygonal mesh.
使用着色器
用于生成地形的密度函数必须可用于碰撞检测着色器,并且您必须填充包含碰撞位置的输出缓冲区,如果有的话...
CUDA
参见:https://www.youtube.com/watch?v=kYzxf3ugcg0
这里有人根据 NVidia 文章使用了 CUDA,但是这意味着相同: 在CUDA中,执行碰撞检测,必须共享密度函数。
然而,这将使变换反馈技术更难实现。
着色器和 CUDA 都意味着在至少一个位置重新采样/重新计算密度,仅用于单个对象的碰撞检测。
通常,这意味着以顶点/索引缓冲区对的形式存储一组 RAM 内存的几何图形,它们由着色器管道定期处理。由于您拥有此处可用的数据,您很可能还会有一个碰撞网格,它是您执行碰撞的地形的简化表示。
或者你可以在你的地形上使用一组碰撞器,标记允许的路径,恕我直言,这是在早期的 PS1 最终幻想游戏中执行的(实际上并没有真正意义上的地形)我们今天了解地形)。
这个简短的回答既不广泛深入也不完整。我只是试图让您深入了解数十种解决方案中使用的一些概念。
更多阅读:http://prideout.net/blog/?tag=opengl-transform-feedback .
关于c++ - 有效地为地形物理提供几何,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44039184/
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
这是一道面试题,我没有答对,但还是很好奇怎么解。你有N个人的大家庭,分别是1,2,3,...,N岁。你想给你的大家庭拍张照片。所有的家庭成员都排成一排。“我是家里的friend,建议家庭成员安排如下:”1岁的家庭成员坐在这一排的最左边。每两个坐在一起的家庭成员的年龄相差不得超过2岁。输入:整数N,1≤N≤55。输出:摄影师可以拍摄的照片数量。示例->输入:4,输出:4符合条件的数组:[1,2,3,4][1,2,4,3][1,3,2,4][1,3,4,2]另一个例子:输入:5输出:6符合条件的数组:[1,2,3,4,5][1,2,3,5,4][1,2,4,3,5][1,2,4,5,3][
点向量坐标矩阵的几何意义介绍旋转矩阵的几何含义之前,先介绍一下点向量坐标矩阵的几何含义点:在一维空间下就是一个标量,如同一条直线上,以任意某一个位置为0点,以一定的尺度间隔为1,2,3...,相反方向为-1,-2,-3...;如此就形成了一维坐标系,这时候任何一个点都可以用一个数值表示,如点p1=5,即即从原点出发沿着x轴正方向移动5个尺度;点p2=-3,负方向移动3个尺度; 在一维坐标系上过原点做垂直于一维坐标系的直线,则形成了二维坐标系,此时描述一个点需要两个数值来表示点p3=(3,2),即从原点出发沿着x轴正方向移动3个尺度,在此基础上沿着y轴正方向移动两个尺度的位置就是点p3。
如何将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.你能做的最好的事情是:
是否可以在PyYAML或Ruby的Psych引擎中禁用创建anchor和引用(并有效地显式列出冗余数据)?也许我在网上搜索时遗漏了一些东西,但在Psych中似乎没有太多可用的选项,而且我也无法确定PyYAML是否允许这样做.基本原理是我必须序列化一些数据并将其以可读的形式传递给一个不是真正的技术同事进行手动验证。有些数据是多余的,但我需要以最明确的方式列出它们以提高可读性(anchor和引用是提高效率的好概念,但不是人类可读性)。Ruby和Python是我选择的工具,但如果有其他一些相当简单的方法来“展开”YAML文档,它可能就可以了。 最佳答案
我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我
我有一个数组数组,想将元素附加到子数组。+=做我想做的,但我想了解为什么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”]、[“苹果”、“
有没有办法让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=
为了在我的mac上为一个rails项目安装mysql,我遵循了安装Homebrew软件和删除mac端口的在线建议。这是问题开始的地方。rails项目不会构建,我得到这个:[rake--prereqs]rakeaborted!dlopen(/Users/Parker/.rvm/gems/ruby-1.9.3-p448/gems/nokogiri-1.6.0/lib/nokogiri/nokogiri.bundle,9):Librarynotloaded:/opt/local/lib/libiconv.2.dylibReferencedfrom:/Users/Parker/.rvm/gem
出于某种原因,heroku尝试要求dm-sqlite-adapter,即使它应该在这里使用Postgres。请注意,这发生在我打开任何URL时-而不是在gitpush本身期间。我构建了一个默认的Facebook应用程序。gem文件:source:gemcuttergem"foreman"gem"sinatra"gem"mogli"gem"json"gem"httparty"gem"thin"gem"data_mapper"gem"heroku"group:productiondogem"pg"gem"dm-postgres-adapter"endgroup:development,:t