Почему черный исходный цвет с glBlendFunc (GL_SRC_ALPHA, GL_ONE); все еще вызывает изменение в цвете назначения?

Я пытаюсь разработать систему частиц в C ++ с использованием OpenGL, и я не понимаю, как работает смешивание. Я пытаюсь использовать аддитивное смешивание, и из моего понимания вызываю функцию glBlendFunc со следующими аргументами:

glBlendFunc(GL_SRC_ALPHA, GL_ONE);

При попытке визуализации чего-либо произойдет следующее: он возьмет цвет R, G, B, рассчитанный фрагментным шейдером (исходный цвет), умножит его на значение альфа, вычисленное фрагментным шейдером (исходный альфа), а затем добавит это цвет R, G, B, который уже существует в буфере кадров (цвет dest). Но если это так, то черный цвет, где (R, G, B, A) = (0,0,0,1), рассчитанный фрагментным шейдером, должен оставить существующий цвет буфера кадра (dest color) неизменным, поскольку это умножение исходного значения цвета 0 на исходное альфа-значение 1, которое, очевидно, всегда должно давать 0, а затем это 0 добавляется к существующему цвету буфера кадра (dest цвет), который должен оставить его неизменным … верно?

Однако, когда я делаю это, вместо того, чтобы оставить цвет без изменений, он фактически делает его светлее, как показано здесь:

На этом рисунке окружение и меч визуализируются с помощью обычного смешивания, а затем квадратные частицы визуализируются вокруг меча с помощью glBlendFunc (GL_SRC_ALPHA, GL_ONE); используя фрагментный шейдер, который ВСЕГДА выводит (R, G, B, A) = (0,0,0,1). Существует много визуализированных частиц, и вы можете видеть, что чем больше частиц перекрывается, тем ярче становится. Когда я переключаю альфа-выход шейдера с 1 на 0 (источник альфа), тогда частицы исчезают, что имеет смысл. Но почему они все еще видны, когда исходный цвет = 1 и исходный альфа = 0?

Вот точная функция, которую я вызываю для визуализации частиц:

void ParticleController::Render()
{
GraphicsController* gc = m_game->GetGraphicsController();
ShaderController* sc = gc->GetShaderController();
gc->BindAttributeBuffer(m_glBuffer);
ShaderProgram* activeShaderProgram = sc->UseProgram(SHADER_PARTICLE);
glDepthMask(false);
glBlendFunc(GL_SRC_ALPHA, GL_ONE);

gc->GetTextureController()->BindGLTexture(TEX_PARTICLES);

activeShaderProgram->SetUniform(SU_PROJ_VIEW_MAT, gc->GetProjectionMatrix() * gc->GetViewMatrix() * gc->GetWorldScaleMatrix());

activeShaderProgram->SetUniform(SU_LIGHT_AMBIENT, m_game->GetWorld()->GetAmbientLight());

activeShaderProgram->SetUniform(SU_TIME, m_game->GetWorld()->GetWorldTime());

CheckForOpenGLError();
m_pa.GLDraw();
CheckForOpenGLError();

gc->BindAttributeBuffer_Default();
CheckForOpenGLError();

glDepthMask(true);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
}

И это последние 4 строки моего фрагментного шейдера, гарантирующие, что цветовой выход частицы (R, G, B, A) всегда = (0,0,0,1):

fColor.r = 0.0;
fColor.g = 0.0;
fColor.b = 0.0;
fColor.a = 1.0;

Есть что-то, чего мне не хватает?

0

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы [email protected]