0

在中,我将一个大纹理作为贴图上传到片段着色器三个.js.

这个纹理是一个2D画布,我在上面绘制随机形状。

绘制时,我只想更新已更改的纹理部分。更新整个纹理(高达3000x3000像素)太慢了。

但是,我无法执行部分更新。tex子图像2D在我的场景中没有任何效果。

控制台中没有错误-我希望我错过了一个步骤,但还没有找到。

////创建绘图画布2D和相关纹理//这个_canvas=document.createElement('canvas');这个_canvas.width=maxSliceDimensionsX;这个_canvas.height=maxSliceDimensionsY;这个_canvasContext=此_canvas.getContext('2d')!;这个_canvasContext.fillStyle=“rgba(0,0,0)”;这个_canvasContext.fillRect(0,0,window.innerWidth,window.innerHeight);这个_纹理=新纹理(this._canvas);这个_texture.magFilter=最近过滤器;这个_texture.minFilter=最近过滤器;//const数据=新Uint8Array(maxSliceDimensionsX*maxSlice Dimensions Y*4);//这个_texture2=新的THREE。DataTexture(数据,maxSliceDimensionsX,maxSliceDimensions Y,THREE.RGBAFormat);这个_brushMaterial=新网格基本材质({地图:这个_纹理,侧面:双面,透明:true,});...//在渲染循环中渲染循环(){...//获取随机值作为测试const imageData=这个_canvasContext.getImageData(100100200200);const uint8Array=新uint8Array(imageData.data.buffer);//激活纹理?renderer.setTexture2D(this._texture,0);//更新子上下文const上下文=renderer.getContext();上下文.texSubImage2D(上下文.TEXTURE_2D,0,0,200,200,上下文.RGBA,上下文.UNSIGNED_BYTE,uint8Array);//更新整个纹理如预期一样工作,但速度较慢//这个_texture.needsUpdate=true;//渲染新场景renderer.render(场景,this.camera);}

谢谢,尼古拉斯

2

1个答案1

重置为默认值
2

创建纹理后,我们必须立即通知纹理需要上传到GPU。

我们只需在创建时将其设置为1次,而不是在渲染循环中。

这个_纹理=新纹理(this._canvas);这个_texture.magFilter=最近过滤器;这个_texture.minFilter=最近过滤器;//必须添加这个_texture.needsUpdate=true;

你的答案

单击“发布您的答案”,表示您同意我们的服务条款并确认您已阅读我们的隐私政策.

不是你想要的答案吗?浏览标记的其他问题问你自己的问题.