javascript - WebGL - 连续应用多个程序

标签 javascript webgl post-processing

如何让 WebGl 连续应用多个程序,例如

  • 画点东西
  • 将其转换为黑白

在这个例子中,很容易将所有这些放在一个着色器中,但我希望能够将它们分开以便大型着色器的可重用性。

到目前为止,我有一些类似的东西

gl = canvas.getContext("webgl");
gl.viewport(0, 0, canvas.width, canvas.height);

fragmentShader = attachShader(fragmentShaderCode, gl, gl.FRAGMENT_SHADER);
vertexShader = attachShader(vertexShaderCode, gl, gl.VERTEX_SHADER);

program = gl.createProgram();
gl.attachShader(program, vertexShader);
gl.attachShader(program, fragmentShader);
gl.linkProgram(program);

gl.useProgram(program);

// attach textures and variables

gl.drawElements(gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0);

而且我不确定如何添加第二遍以有效地从第一遍获取输入。我最好的猜测是使用第二个 Canvas ,将第一个 Canvas 作为纹理输入。但这听起来像是渲染了两次,这并不好。

最佳答案

除了 WebGL 术语之外,@ssube 所说的...

在初始化时

  1. 您创建一个帧缓冲区 (gl.createFramebuffer)
  2. 您将纹理附加到它 (gl.framebufferTexture2D)。
  3. 如果您的场景需要深度缓冲区,您还需要将深度缓冲区附加到帧缓冲区(gl.renderbufferStorage、gl.framebufferRenderbuffer)。

在渲染时

  1. 您通过帧缓冲区将场景渲染到纹理中。

    // make rendering render to framebuffer's attachments
    gl.bindFramebuffer(gl.FRAMEBUFFER, yourFramebuffer);
    
    // .. render scene ..
    
  2. 然后使用后处理着色器将帧缓冲区的纹理渲染到 Canvas

    // make rendering render to canvas
    gl.bindFramebuffer(gl.FRAMEBUFFER, null);
    
    // .. render framebuffer's texture to canvas with post processing shader..
    

正如@ssube 所说,要应用多个后处理效果,您可以创建带有附加纹理的帧缓冲区。您将场景渲染到第一个帧缓冲区纹理,然后使用第一个后​​处理效果将该纹理渲染到第二个纹理中,现在您可以使用下一个后处理效果将第二个纹理渲染回第一个纹理。最后的后期处理效果呈现在 Canvas 上。

For an example of applying multiple effects see this

关于javascript - WebGL - 连续应用多个程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36991367/

相关文章:

javascript - Webgl 没有渲染我的圈子

css - 用不寻常的字符模板化 css 伪命名空间,然后后处理为正常字符。任何缺点/完全不允许的问题?

c# - 编写 Unity 后处理堆栈脚本

java - 如何在 awt 或 swing 窗口上使用后处理

javascript - Chrome 扩展认证

javascript - moment().isValid 当输入为整数时返回 true

javascript - WEBGL 改变颜色为三 Angular 形

javascript - webgl 图像 slider

javascript - Web 扩展是否需要显式加载内容脚本?

php - 跟踪用户在页面上停留的时间?