我有一个使用OpenGL和glut制作的小精灵粒子系统,使用纹理绘制基本火焰。火焰是对称复制的,以说明它在小盒子/场景中的行为。如下图所示,存在两个问题:
1-为了产生看起来不错的火焰效果,我想对我的粒子使用添加剂混合,但是混合还考虑到了较深青色面板的颜色并产生了白色火焰。
2.1-同样,为了正确实现添加剂混合,我必须在绘制粒子时禁用深度测试,但是这样做可以启用粒子绘制,即使应该“隐藏”它们也是如此。
2.2-如果在绘制粒子时启用深度测试,则外观如下所示。
如果有帮助,这里是我应用于粒子的纹理。
这是显示场景和粒子的相关代码。
void drawParticles()
{
glPushAttrib(GL_ALL_ATTRIB_BITS);
glDisable(GL_LIGHTING);
glDisable(GL_DEPTH_TEST);
glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA,GL_ONE);
glBindTexture(GL_TEXTURE_2D,explosionTexture[0]);
glTexEnvi(GL_POINT_SPRITE, GL_COORD_REPLACE, GL_TRUE);
for (int i = 0; i < particlesNumber; ++i)
{
glPointSize(50.0f);
glBegin(GL_POINTS);
glColor4f(particlesArray[i].color[0],particlesArray[i].color[1],particlesArray[i].color[2],0.5f);
glVertex3f(particlesArray[i].position[0],particlesArray[i].position[1],particlesArray[i].position[2]);
glEnd();
}
glBindTexture(GL_TEXTURE_2D, 0);
glDisable( GL_BLEND );
glEnable( GL_DEPTH_TEST );
glPopAttrib();
}
void drawScene()
{
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
gluPerspective( 60.0f, (GLdouble) g_width / (GLdouble) g_height, 0.1f, 300.0f );
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
gluLookAt( dist*sin(phi)*sin(theta), dist*cos(phi), dist*sin(phi)*cos(theta), 0, 0, 0, 0, 1, …Run Code Online (Sandbox Code Playgroud) 作为参考,我正在遵循本教程。现在假设我有一个具有多种类型模型的小应用程序,如果我理解正确的话,我必须将每个模型的 MPV 矩阵从 CPU 发送到 GPU(换句话说,发送到我的顶点着色器),因为每个模型可能有不同的模型矩阵从一个到另一个。
现在看看教程和这篇文章,我明白应该为每个帧和每个模型调用将矩阵发送到我的着色器 ( glUniformMatrix4fv(myMatrixID, 1, GL_FALSE, &myModelMVP[0][0])) ,因为每次它都会覆盖我的 MVP 的先前值(我的最后一个值)模型)。但是,考虑到我的应用程序的性能,我不想通过总线发送无用的数据,如果我理解正确的话,我的模型矩阵对于每个模型都是恒定的。
我正在考虑为每个模型的 MVP 矩阵制定一个制服,但我认为它不可扩展,如果我的视图或投影矩阵发生变化,我还必须更新所有这些......有没有办法避免多次发送我的模型矩阵并且仅在更改时发送我的视图和投影矩阵?