我最近开始使用openGL编程。我已经编写了创建基本图元的代码,并在webGL中使用了着色器。我通过谷歌对这个主题进行了广泛的搜索,但它对我来说仍然不是很清楚。基本上,我想知道的是:在GLSL中是否有任何无法在普通的openGL中实现的功能,还是GLSL只是更高效地完成任务?
问题1:
在OpenGL中,有没有任何GLSL无法完成的任务?
答案:
你可能可以只使用OpenGL而不需要GLSL部分,但如果你想要自己的表面属性,你可能需要一个着色器来使其简单且高效,这个着色器可以使用类似于GLSL的语言编写。以下是一些示例:
问题2:
或者GLSL只是更有效率地执行任务?
答案:
像素着色器特别是非常并行化,独立计算二维网格中每个单元的值,同时也包含重要的限制条件,例如不能很好地处理“if”语句等条件,因此需要使用不同类型的着色器来发挥其优势,在OpenGL的其余部分中描述和处理表面。
问题三:
我猜想您想知道是否只使用GLSL是一种选择,而我只能根据我对一种着色器——像素着色器的了解来回答这个问题。此答案的其余部分涵盖“只”使用GLSL作为可能选项的内容:
答案:
虽然GLSL是OpenGL的一部分,但您可以使用OpenGL的其余部分来设置环境并几乎完全将程序编写为像素着色器,其中像素着色器的每个元素都会给整个屏幕上的一个像素着色。
https://www.shadertoy.com/view/Ms2SD1
这只蜗牛所需的唯一外部资源是一些容易生成的纹理:https://www.shadertoy.com/view/ld3Gz2
使用嘈杂的分形点云进行渲染:
https://www.shadertoy.com/view/Xtc3RS
https://www.shadertoy.com/view/MsdGzl
一个完美的球体:1个多边形,1个表面,无棱角或顶点:https://www.shadertoy.com/view/ldS3DW
使用像粒子系统一样的模拟来模拟赛车在赛道上的行驶,使用第二个狭窄而长的像素着色器作为有关汽车位置的数据表。https://www.shadertoy.com/view/Md3Szj
随机值相当简单:
fract(sin(p)*10000.)