Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl GLSL粒子的渲染(premult)_Opengl_Glsl_Particles_Premultiplied Alpha - Fatal编程技术网

Opengl GLSL粒子的渲染(premult)

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)

我一直在尝试使用粒子渲染库来处理我的着色器。它与固定功能完美配合,我知道我的目标是什么。我只是不知道如何做最后的混合位

它将这样的粒子生命打包到DWORD中,并将DWORD设置为顶点属性之一。四边形有4个这样的顶点。3个浮点位置,3个浮点正常,4字节漫反射,2个浮点uv。 我应该如何处理4byte属性,在glsl着色器中将其用作vec4或float属性? 此外,由于该库使用预乘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浮点类型。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;