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

#opengl #buffer #stencil-buffer

#opengl #буфер #трафарет-буфер

Вопрос:

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

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

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

RenderParticlesUsingTransformFeedback();
  

Ответ №1:

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

Комментарии:

1. ВАУ, ты только что решил мою проблему, я не могу поверить, насколько я был глуп. Я бы дал вам 1, но я не могу, потому что моя репутация слишком низкая : (

Ответ №2:

 glDisable(GL_STENCIL_TEST);
  

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

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

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

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