Как передать в шейдер массив float длиной n?

Всем доброго времени суток!
Мне для шейдера в Unity3D необходимо передать массив float заданой длинны.
В гугле я ничего не нашел и решил генерить текстуру и передавать её. Все нормально, но не совсем. Текстура генерится, сохраняеться, передаёться в шейдер и тут неудача:( ...
Нехватает точности(глубины) текстуры, чтобы передать точные данные, они обрезаються и получается не совсем то, что я хотел. Мне нужно 2 знака после запятой.

P.S. Передаю координаты(r,g,b) и радиус окружности(a).
  • Вопрос задан
  • 3360 просмотров
Решения вопроса 1
BasmanovDaniil
@BasmanovDaniil
Геймдизайнер-телепат
А сколько знаков перед запятой?

Обычно в таких ситуациях берут текстуру, отключают мипмапы, кодируют нужные данные и забирают в шейдере. В UnityCG.cginc для этого есть пара полезных методов:

// Encoding/decoding [0..1) floats into 8 bit/channel RGBA. Note that 1.0 will not be encoded properly.
inline float4 EncodeFloatRGBA( float v )
{
	float4 kEncodeMul = float4(1.0, 255.0, 65025.0, 16581375.0);
	float kEncodeBit = 1.0/255.0;
	float4 enc = kEncodeMul * v;
	enc = frac (enc);
	enc -= enc.yzww * kEncodeBit;
	return enc;
}
inline float DecodeFloatRGBA( float4 enc )
{
	float4 kDecodeDot = float4(1.0, 1/255.0, 1/65025.0, 1/16581375.0);
	return dot( enc, kDecodeDot );
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы