【发布时间】:2019-01-05 02:12:49
【问题描述】:
我的问题很简单:是否有任何示例说明如何使用 Three.js 中的索引实例四边形渲染具有自定义(非网格状)偏移的纹理?
我的上下文问题:我正在处理一个带有许多四边形的 Three.js 场景,每个四边形都用于显示来自图像图集的图像。地图集中的每张图像每边都是 32 像素。四边形是使用索引的、实例化的几何体渲染的;所以有 4 个顶点定义了所有四边形实例的“原型”,并且所有实例特定的信息都作为属性提供给 RawShaderMaterial。
挑战在于,要在给定四边形上表示的图像包含在图集中的 32 像素正方形中,但这些小图像可以有边距。因此,虽然图像在地图集中形成了各种网格,但每个图像的顶部和侧面(样本地图集区域)都有一个已知的未使用像素边距:
处理这些边距的相关属性是:
var geometry = new THREE.InstancedBufferGeometry();
// uv identifies the blueprint uv values
geometry.addAttribute('uv', new THREE.BufferAttribute(new Float32Array([ 1, 1, 0, 1, 0, 0, 1, 0, ]), 2));
// texOffset = the offset of an instance's 32px cell in the atlas {x,y}
geometry.addAttribute('texOffset', new IBA(... 2, true, 1));
// uvOffset = the left/right and top/bottom margins of an instance's image in its 32px cell
geometry.addAttribute('uvOffset', new IBA(..., 2, true, 1));
然后在片段着色器中,我可以为实例渲染完整的 32px 单元格:
vec2 scaledUv = vUv + vTextureOffset;
gl_FragColor = texture2D(texIdx, scaledUv);
我的问题是:假设我可以创建一个 vec2 uvOffset,其中包含图像在其 32px 单元格容器中的左侧和顶部偏移量,我如何仅渲染包含图像的 32px 正方形的子集?其他人可以提供有关此问题的任何帮助将不胜感激。
【问题讨论】:
-
你的意思是“我怎样才能只渲染包含图像的 32px 正方形的子集”?您是否希望这些黑色边距中的任何内容都只是透明而不是黑色?
-
现在我的四边形在顶部/底部或左侧/右侧有黑色边距,因为它们是从对应于给定实例的完整 32 像素 x 32 像素单元格中采样的。但我希望四边形仅显示 32px 单元格的非边距部分。我不想丢弃黑色像素(这会导致 GPU 拾取问题);我只想用给定的 32px x 32px 单元格的子集绘制整个四边形。这有意义吗?
标签: three.js