Alpha不在OpenGL中工作
我正在研究一个粒子系统,尽管阅读了过去所有关于Alpha的帖子,但我无法让我的png纹理在我的粒子上适当地显示出来 我正在使用土壤图书馆阅读图像: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
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();
}