Alpha不在OpenGL中工作

Alpha不在OpenGL中工作,opengl,alpha,particles,Opengl,Alpha,Particles,我正在研究一个粒子系统,尽管阅读了过去所有关于Alpha的帖子,但我无法让我的png纹理在我的粒子上适当地显示出来 我正在使用土壤图书馆阅读图像: void makeTexture () { tex_2D = SOIL_load_OGL_single_cubemap( "particle2.png", SOIL_DDS_CUBEMAP_FACE_ORDER, SOIL_LOAD_RGBA, S

我正在研究一个粒子系统,尽管阅读了过去所有关于Alpha的帖子,但我无法让我的png纹理在我的粒子上适当地显示出来

我正在使用土壤图书馆阅读图像:

void makeTexture () {
    tex_2D = SOIL_load_OGL_single_cubemap(
            "particle2.png",
            SOIL_DDS_CUBEMAP_FACE_ORDER,
            SOIL_LOAD_RGBA,
            SOIL_CREATE_NEW_ID,
            SOIL_FLAG_POWER_OF_TWO
            | SOIL_FLAG_MIPMAPS
            //| SOIL_FLAG_COMPRESS_TO_DXT
            //| SOIL_FLAG_TEXTURE_REPEATS
            //| SOIL_FLAG_INVERT_Y
            | SOIL_FLAG_DDS_LOAD_DIRECT
            );
    if( tex_2D > 0 )
    {
        printf("%s", "2");
        glEnable( GL_TEXTURE_CUBE_MAP );
        glEnable( GL_TEXTURE_GEN_S );
        glEnable( GL_TEXTURE_GEN_T );
        glEnable( GL_TEXTURE_GEN_R );
        glTexGeni( GL_S, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP );
        glTexGeni( GL_T, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP );
        glTexGeni( GL_R, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP );
        glBindTexture( GL_TEXTURE_CUBE_MAP, tex_2D );
    } 
    else
    {
        printf("%s", "3");
        tex_2D = SOIL_load_OGL_HDR_texture(
                "particle2.png",
                SOIL_HDR_RGBE,
                //SOIL_HDR_RGBdivA,
                //SOIL_HDR_RGBdivA2,
                0,
                SOIL_CREATE_NEW_ID,
                SOIL_FLAG_POWER_OF_TWO
                | SOIL_FLAG_MIPMAPS
                //| SOIL_FLAG_COMPRESS_TO_DXT
                );
        if( tex_2D < 1 )
        {
            printf("%s", "4");
            tex_2D = SOIL_load_OGL_texture(
                    "particle2.png",
                    SOIL_LOAD_RGBA,
                    SOIL_CREATE_NEW_ID,
                    SOIL_FLAG_POWER_OF_TWO
                    | SOIL_FLAG_MIPMAPS
                    | SOIL_FLAG_MULTIPLY_ALPHA
                    //| SOIL_FLAG_COMPRESS_TO_DXT
                    | SOIL_FLAG_DDS_LOAD_DIRECT
                    //| SOIL_FLAG_NTSC_SAFE_RGB
                    //| SOIL_FLAG_CoCg_Y
                    //| SOIL_FLAG_TEXTURE_RECTANGLE
                    );
        }

        if( tex_2D > 0 )
        {
            printf("%s", "5");
            glEnable( GL_TEXTURE_2D );
            glBindTexture( GL_TEXTURE_2D, tex_2D );
        } else
        {
            glDisable( GL_TEXTURE_2D );
        }
    }
}
}

这是我的渲染代码:

void RenderParticles() {
glBegin(GL_POINTS);
    for (int p = 0; p < MAX_PARTICLES; p++) {
        if (Particles[p].Active) {
            glPushMatrix();
            glDepthMask(false);
            float dist = sqrt(pow(Particles[p].X, 2) + pow(Particles[p].Y, 2) + pow(Particles[p].Z, 2));
            glColor4f(Particles[p].R, Particles[p].G, Particles[p].B, 1.0);
            //1.8*(0.5 - dist) + RandomNumber(0, 0.2)
            glBegin(GL_TRIANGLE_STRIP);
            float d = 0.05;
            glTexCoord2d(1,1); glVertex3f(Particles[p].X+d,Particles[p].Y+d,Particles[p].Z); // Top Right
            glTexCoord2d(0,1); glVertex3f(Particles[p].X-d,Particles[p].Y+d,Particles[p].Z); // Top Left
            glTexCoord2d(1,0); glVertex3f(Particles[p].X+d,Particles[p].Y-d,Particles[p].Z); // Bottom Right
            glTexCoord2d(0,0); glVertex3f(Particles[p].X-d,Particles[p].Y-d,Particles[p].Z); // Bottom Left
            glEnd();
            glDepthMask(true);
            //glutSolidSphere(RandomNumber(0.001, 0.002), 20, 20);
            glPopMatrix();
        }
    }
    glEnd();
}
void RenderParticles(){
glBegin(总分);
对于(int p=0;p
以下是我尝试使用的纹理:

这是粒子的屏幕截图:


在我看来很正常,你到底希望这里发生什么?您的PNG似乎有预乘的alpha,因此适当的混合函数应该是:
GL\u ONE,GL\u ONE\u减去SRC\u alpha
。如果你想用一种颜色来调制预乘的alpha纹理,你需要考虑alpha通道,否则你会得到难看的黑色边框。由于您使用的是固定功能管道,这可能需要注册/纹理组合器。您还需要对粒子进行深度排序,这在本屏幕截图中似乎不是一个问题。如果您不想费心对预乘alpha纹理进行适当的颜色调制,我建议将您的资产生成软件配置为输出传统alpha。然后,您可以使用
GL_SRC_ALPHA、GL_ONE_减去_SRC_ALPHA
和常规纹理环境。调制。
void RenderParticles() {
glBegin(GL_POINTS);
    for (int p = 0; p < MAX_PARTICLES; p++) {
        if (Particles[p].Active) {
            glPushMatrix();
            glDepthMask(false);
            float dist = sqrt(pow(Particles[p].X, 2) + pow(Particles[p].Y, 2) + pow(Particles[p].Z, 2));
            glColor4f(Particles[p].R, Particles[p].G, Particles[p].B, 1.0);
            //1.8*(0.5 - dist) + RandomNumber(0, 0.2)
            glBegin(GL_TRIANGLE_STRIP);
            float d = 0.05;
            glTexCoord2d(1,1); glVertex3f(Particles[p].X+d,Particles[p].Y+d,Particles[p].Z); // Top Right
            glTexCoord2d(0,1); glVertex3f(Particles[p].X-d,Particles[p].Y+d,Particles[p].Z); // Top Left
            glTexCoord2d(1,0); glVertex3f(Particles[p].X+d,Particles[p].Y-d,Particles[p].Z); // Bottom Right
            glTexCoord2d(0,0); glVertex3f(Particles[p].X-d,Particles[p].Y-d,Particles[p].Z); // Bottom Left
            glEnd();
            glDepthMask(true);
            //glutSolidSphere(RandomNumber(0.001, 0.002), 20, 20);
            glPopMatrix();
        }
    }
    glEnd();
}