我在我使用着色器中的索引尝试访问的DataTexture的纹素中有值。索引[0, 1, 2, 3, 4, 5, 6... 62, 63]
是连续的,而数据纹理的高度和宽度(uTextureDimension
)为8.经过一些研究,我写了这个函数来获取一个特定的索引值,并引用相应的texel:< / p>
vec2 customUV = vec2( mod(aIndex, uTextureDimension) / uTextureDimension, floor(aIndex / uTextureDimension) / uTextureDimension );
vec4 texelValues = texture2D( tDataTexture, customUV ).xyzw;
我也试过这个版本从中心点引用texel。也没有骰子:
vec2 perMotifUV = vec2( mod( aIndex, uTextureDimension ) * (( 1.0 / uTextureDimension )/2.0), floor( aIndex / uTextureDimension ) * (( 1.0 / uTextureDimension )/2.0) );
vec4 texelValues = texture2D( tDataTexture, customUV ).xyzw;
从昨天下午开始使用它,在这里和那里进行编辑,并寻找其他解决方案,我仍然没有得到预期的结果。我应该说在使用Three.js时,着色器被设置为高精度浮点数 - 这是问题的一部分吗?任何人都可以在这里轻推我吗?谢谢!
答案 0 :(得分:0)
第一个似乎是正确的,如果一切都是浮动的。您使用的是NEAREST过滤模式吗?从技术上讲,你也应该添加一个半纹素大小的偏移量:
vec2 texelSize = 1.0 / uTextureDimension;
vec2 customUV = vec2( mod(aIndex, uTextureDimension)*texelSize, floor(aIndex / uTextureDimension)*texelSize );
customUV += vec2(0.5*texelSize);
编辑 - 你的指数也应该是0-63而不是0-64