У меня есть небольшая система частиц спрайтов, сделанная с помощью OpenGL & перенапряжение с использованием текстур для создания основного пламени. Пламя воспроизводится симметрично, чтобы проиллюстрировать, как он ведет себя в маленькой коробке/сцене. И, как показано на рисунках ниже, есть две проблемы:Как справиться с добавлением адгезива OpenGL и анализом глубины с частицами и более глубокими объектами
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, 0);
glEnable(GL_DEPTH_TEST);
glDisable(GL_BLEND);
glBegin(GL_LINES);
glColor3f(1.0f, 0.0f, 0.0f);
glVertex3f(0.0f, 0.0f, 0.0f);
glVertex3f(0.5f, 0.0f, 0.0f);
glColor3f(0.0f, 1.0f, 0.0f);
glVertex3f(0.0f, 0.0f, 0.0f);
glVertex3f(0.0f, 0.5f, 0.0f);
glColor3f(0.0f, 0.0f, 1.0f);
glVertex3f(0.0f, 0.0f, 0.0f);
glVertex3f(0.0f, 0.0f, 0.5f);
glEnd();
glBegin(GL_QUADS);
glColor4f(1.0f, 1.0f, 1.0f , 0.0f);
glVertex3f(-1.0f, -0.2f, 1.0f);
glVertex3f( 1.0f, -0.2f, 1.0f);
glVertex3f( 1.0f, -0.2f, -1.0f);
glVertex3f(-1.0f, -0.2f, -1.0f);
glColor4f(1.0f, 1.0f, 0.0f , 0.0f);
glVertex3f( 1.0f, -2.0f, 1.0f);
glVertex3f( 1.0f, -2.0f, -1.0f);
glVertex3f( 1.0f, -0.2f, -1.0f);
glVertex3f( 1.0f, -0.2f, 1.0f);
glColor4f(1.0f, 0.0f, 1.0f , 0.0f);
glVertex3f(-1.0f, -2.0f, 1.0f);
glVertex3f(-1.0f, -2.0f, -1.0f);
glVertex3f(-1.0f, -0.2f, -1.0f);
glVertex3f(-1.0f, -0.2f, 1.0f);
glColor4f(0.0f, 1.0f, 1.0f , 1.0f);
glVertex3f( 1.0f, -2.0f, -1.0f);
glVertex3f(-1.0f, -2.0f, -1.0f);
glVertex3f(-1.0f, -0.2f, -1.0f);
glVertex3f( 1.0f, -0.2f, -1.0f);
glEnd();
glPushMatrix();
drawParticles();
glScalef(1.0f, -1.0f, 1.0f);
drawParticles();
glPopMatrix();
glutSwapBuffers();
}
Я открыт для любого рода предложений, даже с участием шейдеров (но мне было бы интересно знать, если это вообще возможно сделать только с простым OpenGL).
UPDATE:
Может быть, я не ясно, я не обязательно заинтересован в решении строго фиксированный трубопровод, я хочу знать, как управлять аддитивным смешиванием в сцене даже это означает добавление шейдеров кода мой проект.
Теперь, как указал Коломбо, включение проверки глубины и отключение записи глубины позволило решить мою вторую проблему. Теперь о проблеме смешивания добавок я все еще не знаю, как управлять аддитивным смешением в сцене. Несмотря на то, что в сцене не могут быть такие основные цвета, проблема все еще остается, поскольку пламя по-прежнему будет белым, и я открыт, чтобы знать, что я должен делать с пиксельным шейдером, как это было предложено.
«с простым OpenGL»: OpenGL 2.1+ это * является простым OpenGL для записи шейдеров. – CoffeeandCode
@CoffeeandCode Я думал, что мы могли бы отличить OpenGL от шейдеров, обратившись к шейдерам с GLSL. Извините за вводящий в заблуждение используемый термин ... Во всяком случае, я имел в виду, что я не писал никаких шейдеров для этого, и мне было интересно, возможно ли это без создания shaders_. – lordjohncena
Если вы изучаете OpenGL и хотите использовать свои знания в будущем, я бы порекомендовал вам забыть все ваши вещи с фиксированной функцией и узнал только основной профиль OpenGL 3.3 и проверил бы расширение. – CoffeeandCode