使用着色器中的索引引用数据纹理中的纹素

时间:2017-02-03 19:37:42

标签: three.js glsl textures shader

我在我使用着色器中的索引尝试访问的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时,着色器被设置为高精度浮点数 - 这是问题的一部分吗?任何人都可以在这里轻推我吗?谢谢!

1 个答案:

答案 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