Проводится ли тестирование OpenGL до или после запуска фрагмента программы? - PullRequest
3 голосов
/ 03 мая 2010

Когда я установил glStencilFunc( GL_NEVER, . . . ), фактически отключив все рисование, а затем запустил мою [связанную с шейдером] программу, я не получил увеличения производительности по сравнению с возможностью запуска фрагментного шейдера. Я думал, что трафаретный тест произошел до фрагментной программы. Разве это не так или, по крайней мере, не гарантировано? Замена фрагментного шейдера на тот, который просто записывает константу в gl_FragColor, приводит к увеличению FPS.

Ответы [ 4 ]

3 голосов
/ 03 мая 2010

Это на самом деле немного и того, и другого. Операции с фрагментами должны выполняться после фрагментированной программы, как вы можете видеть на этой диаграмме конвейера OpenGL ES 2.0 . Тем не менее, многие современные графические карты имеют ранний z-тест, который отбрасывает фрагменты раньше, если вы не напишите глубину фрагмента шейдера.

Вот документ от AMD / ATI, в котором говорится о таких тестах . Я помню, как читал, что спецификация позволяет проводить ранние тесты, если их выполнять до того, как шейдер даст тот же результат, что и после, поэтому вы не хотите изменять глубину или отбрасывать фрагмент в шейдере. В этой теме на форумах OpenGL есть несколько интересных обсуждений.

2 голосов
/ 03 мая 2010

В дополнение к модификации глубины фрагмента, есть несколько других вещей, которые могут препятствовать выполнению теста глубины / трафарета перед шейдером фрагмента. Если z-записи включены, то любой метод прерывания фрагмента в шейдере будет делать это, например, альфа-тест или инструкция discard шейдера.

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

0 голосов
/ 18 декабря 2012

Как вы можете видеть здесь: http://www.opengl.org/wiki/Stencil_Test Тест трафарета запускается после фрагмента шейдера. Я понимаю, что это не хорошо для производительности.

0 голосов
/ 03 мая 2010

Взгляните на следующую схему конвейера DX10, где говорится, что тест трафарета выполняется до пиксельного шейдера:

http://3.bp.blogspot.com/_2YU3pmPHKN4/Sz_0vqlzrBI/AAAAAAAAAcg/CpDXxOB-r3U/s1600-h/D3D10CheatSheet.jpg

и то же самое верно для DX11:

http://4.bp.blogspot.com/_2YU3pmPHKN4/S1KhDSPmotI/AAAAAAAAAcw/d38b4oA_DxM/s1600-h/DX11.JPG

Я не знаю, является ли это обязательным условием в спецификации OpenGL, но для реализации было бы вредно не выполнять тест трафарета перед запуском программы фрагмента.

...