我最近一直在浏览 Shadertoy - https://www.shadertoy.com/ - 以努力了解更多关于 OpenGL 和 GLSL 的信息。
据我目前的了解,OpenGL 用户首先必须准备好所有要使用的几何体并配置 OpenGL 服务器(允许的灯光数量、纹理存储等)。完成后,用户必须在 OpenGL 程序编译之前提供至少一个顶点着色器程序和一个片段着色器程序。
然而,当我查看 Shadertoy 上的代码示例时,我只看到了一个着色器程序,而且所使用的大部分几何体似乎都直接写入了 GLSL 代码中。
这是如何运作的?
我的猜测是顶点着色器已经预先准备好了,可编辑/样本着色器只是一个片段着色器。但这并不能解释一些更复杂的例子中的几何……
谁能解释一下 Shadertoy 是如何工作的?
原文由 Charlie 发布,翻译遵循 CC BY-SA 4.0 许可协议
ShaderToy 是一个用于编写像素着色器的工具。
什么是像素着色器?
如果您渲染一个全屏四边形,这意味着四个点中的每一个都位于视口的四个角之一,那么该四边形的片段着色器称为像素着色器,因为您可以说现在每个片段都恰好对应一个屏幕的像素。所以像素着色器是全屏四边形的片段着色器。
所以属性总是相同的,顶点着色器也是如此:
该四边形呈现为
TRIANGLE_STRIP
。此外,有些人更喜欢使用片段着色器的内置变量gl_FragCoord
UVs
不是显式设置 --- ,然后将其除以uniform vec2 uScreenResolution
.顶点着色器:
然后片段着色器看起来像这样:
ShaderToy can supply you with a few uniforms on default,
iResolution
(akauScreenResolution
),iGlobalTime
,iMouse
,… which you可以在你的像素着色器中使用。为了将几何体直接编码到片段着色器(又名像素着色器)中,开发人员使用了一种称为光线追踪的东西。这是一个相当复杂的编程领域,但简而言之:您通过一些数学公式呈现您的几何图形,然后在像素着色器中,当您希望检查某个像素是否是您的几何图形的一部分时,您可以使用该公式来检索该信息。谷歌一下应该会给你大量的资源来阅读光线追踪器的确切构建方式和内容,这可能会有所帮助: How to do ray tracing in modern OpenGL?
希望这可以帮助。