我正在使用一个canvas元素中的图像作为Three.js中纹理的贴图,使用JavaScript在canvas上执行图像操作,然后在纹理上调用needsUpdate()。这样做可以实现目标,但速度很慢。
我希望能够在片段着色器中执行图像计算。我已经找到许多几乎可以实现这一点的示例:
着色器材料: http://mrdoob.github.io/three.js/examples/webgl_shader2.html 这个示例显示了在片段着色器中执行的图像操作,但该着色器作为整个材料的片段着色器运行。我只想在贴图上使用着色器,然后将贴图作为第二个材料的组成部分使用。
渲染到纹理: https://threejsdoc.appspot.com/doc/three.js/examples/webgl_rtt.html 这展示了将整个场景渲染到WebGLRenderTarget,并将其用作材料中的贴图。我只想预处理图像,而不是渲染整个场景。
效果合成器: http://www.airtightinteractive.com/demos/js/shaders/preview/ 这个示例将着色器作为后处理应用于整个场景。
编辑: 下面是另一个示例:
- 渲染到另一个场景: http://relicweb.com/webgl/rt.html 这个例子在Three.js Retrieve data from WebGLRenderTarget (water sim)中引用,使用一个带有自己正交摄像机的第二个场景来将动态纹理渲染到WebGLRenderTarget中,并将其作为主要场景中的纹理使用。我猜这是上面列出的第一个“渲染到纹理”的示例的特殊情况,可能适合我,但似乎过于复杂。
据我所知,理想情况下,我应该能够制作一个具有自己片段着色器的新帧缓冲对象,单独进行渲染,并使用其输出作为另一个材质的片段着色器的纹理统一变量。这可行吗?
编辑2: 看起来我可能在寻找类似于此的内容:Shader Materials and GL Framebuffers in THREE.js...尽管问题似乎没有被解决。
ShaderMaterial
将包含单个平面和正交相机的场景渲染到纹理中,然后将该纹理作为第二个ShaderMaterial
的uniform。 - WestLangley