three.js - 从 Three.js RenderToTarget 读取数据会产生意想不到的结果

标签 three.js glreadpixels

好吧,我正在尝试使用 WebGL 的 readPixels 方法将数据从着色器渲染到帧缓冲区。该技术很简单:

renderer.render(sceneRTT, cameraRTT, rtTexture, true);

var pixels = new self.Uint8Array(width * height * 4);

var gl = renderer.context;
gl.bindFramebuffer(gl.FRAMEBUFFER, rtTexture.__webglFramebuffer);
gl.readPixels(0, 0, width, height, gl.RGBA, gl.UNSIGNED_BYTE, pixels);

我通过将着色器的 gl_FragCoord 更改为 gl_FragCoord = vec4(255,120,35,100) 来测试这一点,尽管任何值当然都是有效的。

问题是,像素总是返回不正确的值,即使我指定了上面这样的常量值!可能是什么原因造成的?

注意:这个问题在我测试的每个着色器上都会出现,包括其他人的工作 fiddle

最佳答案

好吧,在尝试了一些测试值之后,我找出了问题所在。

RGB 列中返回的值预先乘以 alpha。

这是因为 WebGLRenderer 的 premultipliedAlpha 标志默认设置为 true。

要修复此行为,请设置:

var renderer = new THREE.WebGLRenderer( { premultipliedAlpha : false } ); 

在构建所使用的渲染器期间。

此外,请确保在创建要应用于帧缓冲区的 Material 时将其混合设置为无:

material.blending = 0;

关于three.js - 从 Three.js RenderToTarget 读取数据会产生意想不到的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22520412/

相关文章:

javascript - 为 three.js 场景创建缩略图

c++ - 最接近three.js的完整原生库是什么?

javascript - 将一个 div 类放在 three.js 场景之上以创建一个 gui

c++ - glReadPixels() 真的很慢,从鼠标位置获取 OpenGL 坐标的更好解决方案?

android - 如何在 Android 中保存相机拍摄的图片(应用 glsl 效果)?

javascript - 联网框架动态房间不能使用简单的 rtc

javascript - 将 iframe 映射为纹理 - three.js

opengl-es - FBO 的 glReadPixels 太慢

c# - 将 OpenGL 场景绘制到 C# 位图;屏幕外被剪辑

performance - glReadPixels() 读取 GL_DEPTH_COMPONENT 时速度缓慢