Opengl GLSL粒子的渲染(premult)
我一直在尝试使用粒子渲染库来处理我的着色器。它与固定功能完美配合,我知道我的目标是什么。我只是不知道如何做最后的混合位 它将这样的粒子生命打包到DWORD中,并将DWORD设置为顶点属性之一。四边形有4个这样的顶点。3个浮点位置,3个浮点正常,4字节漫反射,2个浮点uv。 我应该如何处理4byte属性,在glsl着色器中将其用作vec4或float属性? 此外,由于该库使用预乘alpha,我应该使用哪种混合方程?该库是火粒子库Opengl GLSL粒子的渲染(premult),opengl,glsl,particles,premultiplied-alpha,Opengl,Glsl,Particles,Premultiplied Alpha,我一直在尝试使用粒子渲染库来处理我的着色器。它与固定功能完美配合,我知道我的目标是什么。我只是不知道如何做最后的混合位 它将这样的粒子生命打包到DWORD中,并将DWORD设置为顶点属性之一。四边形有4个这样的顶点。3个浮点位置,3个浮点正常,4字节漫反射,2个浮点uv。 我应该如何处理4byte属性,在glsl着色器中将其用作vec4或float属性? 此外,由于该库使用预乘alpha,我应该使用哪种混合方程?该库是火粒子库 int ir = (int) (r * 255.0f + 0.5f)
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浮点类型。GLVertexAttributePointer始终将着色器中的任何输入类型转换为浮点 如果选择normalize==GL\u FALSE,则它们的值范围为0-255;否则,如果选择normalize==GL\u 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)
)
我应该如何处理4byte属性?如何将该属性传递给着色器?glVertexAttributePointerLocDiff,4,GL_UNSIGNED_BYTE,GL_FALSE,VertexSize,pVertex;