Рендеринг частиц 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)
            )
Другие вопросы по тегам