2017-02-03 24 views
0

У меня есть значения в теккетах DataTexture, к которым я пытаюсь получить доступ, используя индексы в моем шейдере. Индексы [0, 1, 2, 3, 4, 5, 6... 62, 63] являются непрерывными, в то время как текстура данных имеет высоту и ширину (uTextureDimension) из 8. После некоторых исследований я написал эту функцию, чтобы принять конкретное значение индекса, а также ссылки на соответствующий текселе:Ссылка на тексели в текстуре данных с использованием индексов в шейдере

vec2 customUV = vec2(mod(aIndex, uTextureDimension)/uTextureDimension, floor(aIndex/uTextureDimension)/uTextureDimension); 
vec4 texelValues = texture2D(tDataTexture, customUV).xyzw; 

Я также попробовал эту версию для ссылки на тексель из его центральной точки. Также нет кости:

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 шейдеры настроены на высокую точность float - это часть проблемы? Может ли кто-нибудь подтолкнуть меня сюда? Благодаря!

ответ

0

Первый кажется правильным, если все поплавок. Вы используете режим фильтра NEAREST? Технически вы должны также добавить половину текселя-размер смещения тоже:

vec2 texelSize = 1.0/uTextureDimension; 
vec2 customUV = vec2(mod(aIndex, uTextureDimension)*texelSize, floor(aIndex/uTextureDimension)*texelSize); 
customUV += vec2(0.5*texelSize); 

EDIT - Кроме того, ваши показатели должны идти 0-63 не 0-64

+0

В последующей деятельности следует этот подход для работы DataTextures где высота и ширина различны. Я предполагаю, что у вас есть два размера текстуры и два соответствующих размера текселя. – gromiczek