网络-GL:每个程序多片段着色器

问题描述 投票:5回答:4

有谁知道,如果有可能有多个片段着色器在单个Web-GL“方案”串行方式运行?我试图复制一些代码,我已经使用的着色效果写在上头。在WPF程序我想包与多个边界的图像和每个边界必须连接到它的效果(允许多重影响到同一图像上连续运行)。

shader webgl fragment
4个回答
10
投票

我怕你可能将不得不澄清你的问题了一点,但我会在回答反正花刺:

WebGL的支持,有效地,许多不同的着色器,只要你想。 (有喜欢的可用内存,当然实际的限制,但你必须要努力很辛苦创造了太多的shader碰到它们。)事实上,大多数的“真实世界”的WebGL / OpenGL应用程序将使用许多不同的组合着色器产生渲染到屏幕上的最后一幕。 (一个简单的例子:水通常会用不同的着色器呈现或设置着色器比周围环境的其余部分。)

当调度渲染命令只有一个着色器程序可以在一个时间是活动的。当前激活的程序通过调用gl.useProgram(shaderProgram);之后得出的任何几何形状会与该程序呈现指定。如果你想渲染需要多个不同的着色效果,你需要将它们组由着色器,并分别得出各批次:

 gl.useProgram(shader1);
 // Setup shader1 uniforms, bind the appropriate buffers, etc.
 gl.drawElements(gl.TRIANGLES, shader1VertexCount, gl.UNSIGNED_SHORT, 0); // Draw geometry that uses shader1

 gl.useProgram(shader2);
 // Setup shader2 uniforms, bind the appropriate buffers, etc.
 gl.drawElements(gl.TRIANGLES, shader2VertexCount, gl.UNSIGNED_SHORT, 0); // Draw geometry that uses shader2

 // And so on...

4
投票

由于东治建议,你可能想澄清你的问题。如果我理解正确的话,你要一套的后处理效果应用于图像。

简单的回答你的问题是:不,你不能使用多个片段着色器与一个顶点着色器。

然而,有两种方法来实现:首先,你可以写在一个片段着色器的一切,最终将它们结合起来。这取决于你想有效果!其次,你可以写多个着色器程序(每个效果),写你的结果到一个片段缓冲区对象(纹理渲染)。每个着色器将获得以前效应的结果,并申请下一个。这将是更复杂一点,但它是最灵活的方法。


4
投票

其他的答案是正确的轨道上。你要么需要创建适用于一个或着色帧缓存所有的特效动态着色器和应用的特效一次一个。还有后来这里的一个例子

http://games.greggman.com/game/webgl-image-processing-continued/


1
投票

如果你的意思是在一个单一的渲染通道运行多个着色器,像这样(例如,从稀薄的空气拉):

  1. 顶点颜色
  2. 质地
  3. 灯光
  4. 阴影

...连接到单个WebGLProgram对象的每个阶段,并有自己的main()功能每一个阶段,那么没有,GLSL不以这种方式工作。

GLSL更象C / C ++,那就是你有一个单一的全球main()功能,充当您的程序的入口点,并连接到它的库任意数量。四个以上例子可以各自为单独的“图书馆”,由单一main()函数编译它自己的,但连接在一起成一个方案,并调用,但他们可能不会每个定义自己main()功能,因为在GLSL这样的定义是整个程序共享。

这不幸的是需要你写(至少)单独main()功能为每个你打算使用,这导致了大量的冗余编程的着色器,即使你打算重用库本身。这就是为什么我最后写一个华而不实的字符串压榨机来管理我的GLSL库Jax;我不知道该代码会多么有用我的框架之外,但你肯定可以自由地看看它,并利用任何你有帮助。相关文件是:

祝好运!

© www.soinside.com 2019 - 2024. All rights reserved.