- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 Three.js 中使用 canvas 元素中的图像作为纹理,使用 JavaScript 在 Canvas 上执行图像操作,然后在纹理上调用 needUpdate()。这可行,但速度很慢。
我想在片段着色器中执行图像计算。我发现了很多几乎的例子:
着色器 Material :http://mrdoob.github.io/three.js/examples/webgl_shader2.html此示例显示在片段着色器中执行的图像操作,但该着色器充当整个 Material 的片段着色器。我只想在纹理上使用着色器,然后将该纹理用作第二种 Material 的组件。
渲染到纹理:https://threejsdoc.appspot.com/doc/three.js/examples/webgl_rtt.html这显示了将整个场景渲染到 WebGLRenderTarget 并将其用作 Material 中的纹理。我只想预处理图像,而不渲染整个场景。
效果编辑器:http://www.airtightinteractive.com/demos/js/shaders/preview/这显示了将着色器作为后处理应用于整个场景。
编辑:这是另一个:
编辑2:看起来我可能会问类似的问题:Shader Materials and GL Framebuffers in THREE.js ...尽管问题似乎尚未解决。
最佳答案
上面列出的
渲染到纹理和渲染到另一个场景是同一件事,并且是您想要的技术。解释一下:
在 vanilla WebGL 中,执行此类操作的方式是从头开始创建帧缓冲区对象 (FBO),将纹理绑定(bind)到它,然后使用您选择的着色器渲染它。不涉及“场景”和“相机”等概念,这是一个复杂的过程。这是一个例子:
http://learningwebgl.com/blog/?p=1786
但这也恰好是 Three.js 在使用它来渲染带有相机的场景时所做的事情:渲染器输出到帧缓冲区,在其基本用法中直接输出到屏幕。因此,如果您指示它渲染到新的 WebGLRenderTarget,则可以使用相机看到的任何内容作为第二种 Material 的输入纹理。所有复杂的事情仍在发生,但在幕后,这就是 Three.js 的美妙之处。 :)
所以:要复制包含单个渲染纹理的 FBO 的 WebGL 设置,如评论中所述,只需创建一个包含正交相机和单个平面的新场景,该场景的 Material 使用所需的纹理,然后渲染到使用自定义着色器的新 WebGLRenderTarget:
// new render-to-texture scene
myScene = new THREE.Scene();
// you may need to modify these parameters
var renderTargetParams = {
minFilter:THREE.LinearFilter,
stencilBuffer:false,
depthBuffer:false
};
myImage = THREE.ImageUtils.loadTexture( 'path/to/texture.png',
new THREE.UVMapping(), function() { myCallbackFunction(); } );
imageWidth = myImage.image.width;
imageHeight = myImage.image.height;
// create buffer
myTexture = new THREE.WebGLRenderTarget( width, height, renderTargetParams );
// custom RTT materials
myUniforms = {
colorMap: { type: "t", value: myImage },
};
myTextureMat = new THREE.ShaderMaterial({
uniforms: myUniforms,
vertexShader: document.getElementById( 'my_custom_vs' ).textContent,
fragmentShader: document.getElementById( 'my_custom_fs' ).textContent
});
// Setup render-to-texture scene
myCamera = new THREE.OrthographicCamera( imageWidth / - 2,
imageWidth / 2,
imageHeight / 2,
imageHeight / - 2, -10000, 10000 );
var myTextureGeo = new THREE.PlaneGeometry( imageWidth, imageHeight );
myTextureMesh = new THREE.Mesh( myTextureGeo, myTextureMat );
myTextureMesh.position.z = -100;
myScene.add( myTextureMesh );
renderer.render( myScene, myCamera, myTexture, true );
渲染新场景后,myTexture
将可用作主场景中另一种 Material 的纹理。请注意,您可能希望使用 loadTexture()
调用中的回调函数触发第一个 render
,这样在源图像加载之前它不会尝试渲染.
关于Three.js使用framebuffer作为纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21533757/
我正在使用 OpenGL 帧缓冲区对象 (FBO) 在 iOS 上实现模板阴影。代码有效——也就是说,从视觉上看,模板缓冲区正在完成这项工作,而且性能似乎还不错。 但是,当我通过 OpenGL ES
一个像样的图像开始于 VK_IMAGE_LAYOUT_UNDEFINED但会是 VK_IMAGE_LAYOUT_PRESENT_SRC_KHR在它们被呈现一次之后。 很多例子都做了一个过渡vkImag
我需要一种非常快速的方法来在屏幕上显示数据缓冲区。我首先尝试访问linux帧缓冲区,事实证明那是相当不错的。然后,我了解了directFB,并且喜欢它提供的额外功能(例如快速memcpy,即时调整图像
所以我正在制作一个可以使用directx10,11和opengl的引擎。 到目前为止,一切都运行良好。它可以在 opengl 和 directx 中正确渲染图像,并且两者看起来相同。 现在我添加了渲染
我使用 FBO 在我的 LevelScreen 渲染方法中渲染多 channel 模糊着色器。我想要实现的是制作一个 MenuScreen,它在背景上渲染 LevelScreen,在它上面应用另一个模
我有一个 RaspberryPi 并且想在没有 xserver 的情况下全屏显示图像 - 所以直接将它写入帧缓冲区。这里没问题。 但是设置为全屏是行不通的。 cat /sys/class/graphi
如何直接写入linux framebuffer? 最佳答案 查看 FBIOPUT_VSCREENINFO、ioctl 和 mmap (我有代码但不在这台电脑上,抱歉) 编辑:这应该让你开始 //o
android framebuffer 和 linux framebuffer 之间有什么区别吗? 问候, 玛雅克 最佳答案 Android 使用标准 Linux 帧缓冲区,如下所述:http://w
我使用一个程序来绘制一些 2D 纹理并使用它们。在这个程序中使用了 libgdx。我在使用 FrameBuffer 时遇到了一些问题。我尝试在我的 FrameBuffer 中绘制一些纹理,然后我需要保
我正在将后期处理效果集成到我的 3D 引擎中。我在使用带有 WebGL 的 FrameBuffer 对象捕获深度数据时遇到了障碍。将颜色数据捕获到 FrameBuffer 中没有问题。但是,即使为 C
我想从 Android 中的 FrameBuffer 中截取屏幕截图,我使用下面的代码,但只得到了一张模糊的图像。我包含 3 个主要步骤。首先,从 FrameBuffer 中读取数据和信息,其次,将原
我正在使用 LibGDX 框架开发一个绘画应用程序,我正在使用他们的 FrameBuffer 类将用户绘制的内容合并到实体纹理上,这就是他们所看到的绘图。这方面工作得很好,但是,用户可以绘制的区域并不
我正在学习在 Qt 中使用 OpenGL 和 QOpenGLFramebufferObject,并尝试使用以下代码绘制三角形: 在 render() 中: glUseProgram(m_program
我正在使用 opengl ES 2.0我正在使用链接到纹理的帧缓冲区来编译屏幕外渲染(一些简单的元球),然后将该纹理渲染到主后台缓冲区。 一切看起来都很棒,除了纹理出现剪裁,即。它不是完整的窗口尺寸(
我有一个直接渲染到帧缓冲区的 OpenGL 应用程序。 如果我从终端启动应用程序,有时我会看到光标在我的应用程序后面闪烁。同样,如果我从 X 中的终端仿真器内部启动它,当我四处移动鼠标时,我会瞥见鼠标
我对这些硬件的实际工作原理知之甚少,但现在我需要学习如何为 Android 设备编写 Linux 帧缓冲驱动程序。 我对 Linux 图形堆栈感到困惑。据我了解,在台式计算机上,合成窗口管理器与 DR
所以我正在尝试制作自定义按钮,为此我需要组合按钮背景的不同部分。为此,我认为使用 FrameBuffer 是可行的,但它没有给出可行的结果。因此,我尝试通过编写一个简单的测试方法来测试我的 Frame
由glGenTextures(...)、glGenFramebuffers(...)生成的id会是0吗?更具体地说,我可以使用零作为未初始化纹理的 id,还是需要使用 -1? 最佳答案 没有 glGe
我现在正在研究Ctrl+Alt+F1~F7背后的机制是什么。 我发现了一些关于framebuffer、VT和tty的信息。我知道帧缓冲区是图形卡操作的抽象,而 tty(和 pts)是程序与之交互的东西
我尝试实现一些后处理,所以我需要使用 FrameBuffer 收集整张图片,然后使用着色器对其进行后处理。我在 LibGDX( Rendering a 3D model to texture in L
我是一名优秀的程序员,十分优秀!