我一直在尝试让粒子渲染库与我的着色器一起使用。它与固定功能完美配合,我知道我想要的结果。我只是不确定如何进行最后的混合。
它将这样的粒子生命打包到 DWORD 中,并将 dword 设置为顶点属性之一。一个四边形有 4 个这样的顶点。3 个浮点位,3 个浮点正常,4 字节漫反射,2 个浮点紫外。我应该如何处理 4byte 属性,是将其用作 glsl 着色器中的 vec4 属性还是浮点属性?另外,由于此库使用预乘 alpha,我应该使用哪种混合方程? 该库是热释粒子库。
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__ */
您的 4x 无符号字节将转换为 vec4
(浮点类型)。 glVertexAttribPointer
始终将任何输入类型转换为着色器中的浮点数。
如果选择normalize == GL_FALSE
,它们的值范围为 0-255,否则如果选择 normalize == GL_TRUE
,它们的值范围为 0-1(字节/255.f)。
至于你关于预乘alpha的问题,如果你不想在混合操作中将源数据乘以alpha,那么只需使用:
glBlendFunc(GL_ONE, //multiply source value by 1
GL_ONE_MINUS_SRC_ALPHA //multiply destination value by (1-src_alpha)
)