可以使用glsl代替webgl吗?

时间:2019-02-21 01:54:51

标签: javascript 3d glsl webgl fragment-shader

这可能是一个幼稚的问题,所以请对我轻松一点。但是我看着shadertoy.com处的着色器,对于3d场景的glsl代码这么小感到惊讶。深入研究,我注意到大多数着色器如何使用称为ray marching的技术。

这项技术可以避免完全使用顶点/三角形,而只需使用像素着色器和一些数学运算即可创建一些非常复杂的场景。

所以我想知道为什么3d场景经常使用带有webgl的三角形网格而不是仅使用像素着色器。我们不能只使用glsl和像素着色器(也称为片段着色器)渲染整个场景吗?

1 个答案:

答案 0 :(得分:3)

一个简单的答案是,关于着色的技术可能比使用顶点和三角形慢10,100,1000倍。

比较在我的笔记本电脑上以最佳全屏模式运行1fps的阴影森林

https://www.shadertoy.com/view/4ttSWf

到这个以30至60fps运行的Skyrim森林

https://www.youtube.com/watch?v=PjqsYzBrP-M

比较这个在笔记本电脑上以5fps运行的Shadertoy城市

https://www.shadertoy.com/view/XtsSWs

以60帧/秒的速度运行到这个城市:天际线城市

https://www.youtube.com/watch?v=0gI2N10QyRA

比较此Shadertoy Journey克隆版本,该克隆版本在我的笔记本电脑上全屏运行1fps

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的例子是游戏的一个场景,游戏是一个广阔的设计世界,里面有建筑物,废墟和拼图等。

有一个叫做Shader 玩具的原因。这是一个有趣的挑战。给定一个仅输入当前正在绘制的像素的函数,请编写代码以绘制一些内容。因此,鉴于限制,人们设法绘制的图像是惊人的!

但是,它们通常不是用于编写真实应用的技术。如果您希望应用程序快速运行并具有灵活性,请使用更传统的顶点和三角形技术。 GTA5,《荒野大镖客》,《使命召唤》,《 Apex传奇》,《堡垒之夜》等使用的技术。