这可能是一个天真的问题,所以请放轻松我。但我正在看shadertoy.com的着色器,我很惊讶glsl代码对于3D场景有多小。深入挖掘我注意到大多数着色器使用了一种名为ray marching的技术。
这种技术可以避免完全使用顶点/三角形,只需使用像素着色器和一些数学来创建一些非常复杂的场景。
所以我想知道为什么3D场景经常使用webgl的三角形网格而不是仅仅使用像素着色器。我们不能用glsl和像素着色器(也就是片段着色器)渲染整个场景吗?
简单的答案是因为shadertoy上的技术可能比使用顶点和三角形慢10,100,1000倍。
比较这个在我的笔记本电脑上以1fps运行最佳全屏的shadertoy森林
https://www.shadertoy.com/view/4ttSWf
这个以30至60fps运行的天际森林
https://www.youtube.com/watch?v=PjqsYzBrP-M
比较我的笔记本电脑上以5fps运行的Shadertoy城市
https://www.shadertoy.com/view/XtsSWs
到这个城市:以60fps运行的Skylines城市
https://www.youtube.com/watch?v=0gI2N10QyRA
比较一下在我的笔记本电脑上运行1fps全屏的Shadertoy Journey克隆
https://www.shadertoy.com/view/ldlcRf
PS3上的实际Journey游戏,由于PS3在2006年问世,因此GPU的速度比我的笔记本电脑慢得多,但运行频率为60fps
https://www.youtube.com/watch?v=61DZC-60x20#t=0m46s
还有很多其他原因。一个典型的3D世界使用千兆字节的数据来表示纹理,角色,动画,碰撞等等,这些都不仅仅在GLSL中可用。另一个通常是他们使用分形技术,所以没有简单的方法来实际设计任何东西。相反,他们只是搜索数学中有趣的东西。例如,这不是设计游戏关卡的好方法。换句话说,使用顶点数据可以使事情变得更加灵活和可编辑。
比较上面的旅程示例。 Shadertoy的例子是一个单一的场景vs游戏,这是一个巨大的设计世界,有建筑物,废墟和谜题等......
有一个原因叫做ShaderTOY。这是一个有趣的挑战。给定一个只输入的函数是当前正在绘制哪个像素,编写代码来绘制一些东西。因此,人们设法绘制的图像给出了极限是惊人的!
但是,它们通常不是用于编写真实应用程序的技术。如果您希望您的应用程序快速运行并且灵活,您可以使用更传统的顶点和三角形技术。 GTA5,Red Dead Redemption 2,使命召唤,Apex Legends,Fortnite等使用的技术....