Рендеринг частиц GLSL (предварительный)
Я пытался заставить библиотеку рендеринга частиц работать с моими шейдерами. Он отлично работает с фиксированной функцией, и я знаю результат, к которому стремлюсь. Я просто не уверен, как сделать последний бит смешивания.
Он упаковывает жизнь частиц таким образом в DWORD и устанавливает меч как один из атрибутов вершины. Четырехугольник имеет 4 таких вершины. 3 float pos, 3 float normal, 4 байта диффузного, 2 float uv. Что мне делать с атрибутом 4 byte, использовать ли его в качестве атрибута vec4 или float в моем шейдере glsl? Кроме того, поскольку в этой библиотеке используется предварительно умноженная альфа, какое уравнение смешивания следует использовать? Библиотека - это библиотека пиро-частиц.
int ir = (int) (r * 255.0f + 0.5f);
int ig = (int) (g * 255.0f + 0.5f);
int ib = (int) (b * 255.0f + 0.5f);
int ia = (int) (a * Particle.Visibility * 255.0f + 0.5f);
DWORD diffuse;
#ifdef __BIG_ENDIAN__
if (GetLibrary()->GetGraphicsDevice()->IsRGBA())
diffuse = (ir << 24) | (ig << 16) | (ib << 8) | ia;
else diffuse = (ib << 24) | (ig << 16) | (ir << 8) | ia;
#else
if (GetLibrary()->GetGraphicsDevice()->IsRGBA())
diffuse = ir | (ig << 8) | (ib << 16) | (ia << 24);
else diffuse = ib | (ig << 8) | (ir << 16) | (ia << 24);
#endif /* __BIG_ENDIAN__ */
1 ответ
Ваши 4x байта без знака будут преобразованы в vec4
(тип с плавающей точкой). glVertexAttribPointer
всегда преобразует любой тип ввода, чтобы плавать в шейдере.
Их значение будет колебаться от 0 до 255, если вы выберете normalize == GL_FALSE
в противном случае они будут в диапазоне 0-1 (байт /255.f), если вы выберете normalize == GL_TRUE
,
Что касается вашего вопроса о предварительно умноженной альфе, если вы не хотите умножать исходные данные на альфа в операции смешивания, тогда просто используйте:
glBlendFunc(GL_ONE, //multiply source value by 1
GL_ONE_MINUS_SRC_ALPHA //multiply destination value by (1-src_alpha)
)