glStencilFunc по какой-то причине не работает:(

Независимо от того, что я пытался, частицы рендерится за пределами земного шара, не касаясь внутренней части земного шара, я хочу это наоборот! Независимо от того, какие параметры я изменил (пробовал в течение 2 часов), либо частицы визуализируются снаружи нормально, но не внутри, либо частицы как снаружи, так и внутри. Я получаю огромную головную боль от этого, может кто-нибудь, пожалуйста, помогите мне решить эту ошибку. Я использую 1 бит для трафарета. GDEbugger показывает, что трафаретный буфер работает нормально.

glEnable(GL_STENCIL_TEST);
glStencilFunc(GL_NEVER, 1, 1);
glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
globe->Use();
globe->SetWVP(&WVP, true);
Render(globe.obj");
glDisable(GL_STENCIL_TEST);

glStencilFunc(GL_EQUAL, 1, 1);
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);

RenderParticlesUsingTransformFeedback();

2 ответа

Вы отключаете тест трафарета непосредственно перед рендерингом частиц.

glDisable(GL_STENCIL_TEST);

Если вы хотите иметь RenderParticlesUsingTransformFeedback на самом деле проверено на трафаретном буфере, вы должны использовать это. Также я предполагаю, что часть "UsingTransformFeedback" означает, что вы сгенерировали эти частицы ранее с помощью TF. Поскольку трафарет не отбирает треугольники, он не влияет на генерацию данных с обратной связью преобразования.

В любом случае, ваш трафаретный код не работает, потому что он не может работать. Вы не можете использовать только трафаретный буфер, чтобы гарантировать, что частицы не визуализируются вне трехмерного объема. Вы можете сделать это вне 2D-тома. И вы можете частично сделать это для частиц вне трехмерного объема, если вы не возражаете против рендеринга объектов за сферой.

Но если вы хотите ограничить его трехмерным томом, вам придется использовать некоторую шейдерную логику, а не буфер трафарета. Вы должны держать самую близкую точку трехмерного объема, но вам также нужна самая дальняя точка. Так что вам нужно сделать несколько интересных глубинных буферных махинаций.

Когда вы визуализируете частицы, вам нужно использовать оба буфера глубины, которые вы использовали для захвата ближнего и дальнего значений. Затем в вашем шейдере вы отбрасываете фрагмент, если текущая глубина находится вне этого диапазона.

Другие вопросы по тегам