简体   繁体   English

Three.JS:直接在画布上绘制纹理而不创建平面(以广告牌方式)

[英]Three.JS: Drawing texture directly to canvas without creating a plane (in a billboard fashion)

I'm rendering a custom texture using a WebGLRenderTarget . 我正在使用WebGLRenderTarget渲染自定义纹理。 What I need now is to be able to draw the resulting renderTarget.texture directly to the canvas, without adding it to a plane first. 我现在需要的是能够直接将生成的renderTarget.texture绘制到画布上,而无需先将其添加到平面上。

The reason for this is that my camera is orbiting and moving a lot, and I want the texture to be fixed on the top-right corner, like a billboard, without getting left behind. 这样做的原因是我的相机绕轨道运动了很多,并且我希望纹理可以像广告牌一样固定在右上角,而不会被遗忘。 例

My pseudo-code looks like this: 我的伪代码如下所示:

// Create renderer 1
var renderer1 = new THREE.WebGLRenderer();
renderer1.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer1.domElement);

// Create renderer 2
var renderer2 = new THREE.WebGLRenderer();
renderer2.setSize(100, 100);
document.body.appendChild(renderer2.domElement);

var renderTarget = new THREE.WebGLRenderTarget(100, 100);

// Create texture to renderTarget
renderer1.render(textureScene, ortoCam, renderTarget, false);

// Render textureScene to second renderer to see texture
renderer2.render(textureScene, ortoCam);

// Render the rest of the scene, with a moving perspective camera
renderer1.render(scene, perspCam);

This works, but feels very inefficient, especially since I'm creating a second renderer to add a second 100x100 canvas. 这可行,但感觉效率很低,特别是因为我正在创建第二个渲染器以添加第二个100x100画布。 Is there any way to grab the renderTarget.texture and draw it on top of the first canvas so I can skip using the second renderer? 有什么方法可以抓住renderTarget.texture并将其绘制在第一个画布的顶部,以便我可以跳过使用第二个渲染器? I need the renderTarget output to create height maps, but also need it to be visible in a billboard fashion on the top-right corner. 我需要renderTarget输出来创建高度图,但还需要以右上角的广告牌方式显示它。

Update: I've tried creating a 2D canvas context and using context.drawImage(this.renderTarget.texture.image, 10, 10, 20, 20); 更新:我尝试创建2D画布上下文并使用context.drawImage(this.renderTarget.texture.image, 10, 10, 20, 20); but renderTarget.texture.image is undefined. 但是renderTarget.texture.image未定义。 Any ideas why I can't get that image data? 有什么想法为什么我无法获取该图像数据?

You should only need a single renderer. 您只需要一个渲染器。

You can render an overlay inset by using a pattern like so: 您可以使用如下模式来渲染叠加插图:

renderer = new THREE.WebGLRenderer();
renderer.setSize( window.innerWidth, window.innerHeight );
renderer.autoClear = false; // important!
document.body.appendChild( renderer.domElement );

In the render() function, render()函数中,

renderer.clear();

// render to texture
renderer.render( texture_scene, ortho_camera, renderTarget, true );

// render scene first
renderer.setViewport( 0, 0, window.innerWidth, window.innerHeight );
renderer.render( scene, camera );

// render inset second
renderer.clearDepth(); // clear the depth buffer
renderer.setViewport( 10, window.innerHeight - insetHeight - 10, insetWidth, insetHeight );
renderer.render( inset_scene, ortho_camera );

three.js r.84 three.js r.84

I made an npm module that should render a screen quad using mostly the shaders and a high level interface ( width , height , top , left ). 我制作了一个npm模块,该模块应主要使用着色器和高级界面(width,height,top,left)来渲染屏幕四边形。

Right now the fragment shader is not reading a texture but in the readme there is a simple fragment shader that you can use for that. 现在,片段着色器不读取纹理,但自述文件中有一个简单的片段着色器可用于该纹理。

https://www.npmjs.com/package/three-screen-quad https://www.npmjs.com/package/three-screen-quad

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM