WebGL-依次应用多个程序
WebGL - apply several programs successively
如何让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);
我不知道如何有效地添加从第一次传递中获取输入的第二次传递。我的最佳猜测是使用第二个画布,将第一个画布作为纹理输入。但这听起来像是两次渲染,这并不可怕。
@sube除了在WebGL术语中说什么。。。
在初始时间
- 创建帧缓冲区(gl.createFramebuffer)
- 将纹理附加到它(gl.framebufferTexture2D)
- 如果场景需要深度缓冲区,还需要将深度缓冲区附加到帧缓冲区(gl.renderbufferStorage,gl.framebufferRenderbuffer)
在渲染时
-
通过帧缓冲区将场景渲染到纹理中。
// make rendering render to framebuffer's attachments gl.bindFramebuffer(gl.FRAMEBUFFER, yourFramebuffer); // .. render scene ..
-
然后使用后处理着色器将帧缓冲区的纹理渲染到画布
// make rendering render to canvas gl.bindFramebuffer(gl.FRAMEBUFFER, null); // .. render framebuffer's texture to canvas with post processing shader..
正如@ssube所说,要应用多个后期处理效果,可以创建带有附加纹理的帧缓冲区。将场景渲染到第一个帧缓冲区纹理,然后使用第一个后处理效果将该纹理渲染到第二个纹理,现在可以使用下一个后处理效应将第二个贴图渲染回第一个纹理。最后一个后处理效果渲染到画布上。
有关应用多重效果的示例,请参阅此
您确实想再次渲染,但需要获得第一次的输出,并将其用作第二次的输入纹理。
交换纹理和绘制矩形(两个三分之一)是便宜的,尤其是在现代可编程硬件上。
对于简单的效果(使用可见图像作为输入,而不是几何图形或深度),您可以:
- 像正常情况一样绘制场景,使其具有可读的纹理
- 将该纹理绑定为下一个程序的输入
- 用你的程序和以前的输出画一个矩形
您可以重复#2和#3来运行多个效果。这最多需要两个纹理(一个用作输入,一个用作输出,然后交换)。这将适用于模糊、黑白、绽放等简单效果。
更复杂的效果可能需要额外的输入纹理(包括深度),并且可能使用额外的数据。
相关文章:
- Canvas Html5绘图应用程序,移动画布会导致重大问题
- Emberjs应用程序加载在除Index之外的所有路由上
- 使用电话间隙在Android应用程序中显示SQL Lite的数据
- 在AngularJS应用程序中使用封装指令和路由的推荐方式是什么
- Windows8应用程序(html&Javascript):从图片库(除了文件选择器)显示图像的另一种方式
- angular 1.5应用程序中的导航栏
- 在Web应用程序中使用Highcharts javascript
- angularjs+rails应用程序中未显示模板
- 使用acess代币登录Facebook,并通过网络应用程序离线发布
- 从HTTPGET返回一个自定义对象列表,以便在Angular 2应用程序中使用
- 科尔多瓦页面类应用程序中的多个谷歌地图
- 使用谷歌应用程序脚本将服务器端数据表返回到客户端
- Angularjs-utils高亮过滤器在搜索时破坏应用程序
- jQuery:如何在没有for循环的情况下将事件处理程序应用于$('#text'+'任意整数
- 如何为动态创建的复选框和自定义验证程序应用自定义验证
- Chrome 扩展程序 / 应用程序设置 Javascript
- 如何将类从chrome扩展程序应用于活动标签页
- 将加载程序应用于特定文件
- 如何将jQuery事件处理程序应用于多个缓存的选择器
- 将同一处理程序应用于多个 jQuery 对象