Количество визуализированных полигонов с тесселяцией

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

Я использую OpenGL 4.2 и визуализирую сетку, вызывая glDrawElements. Я использую полнофункциональные шейдеры (Vertex, Tessellation Control, Tessellation Evaluation, Geometry и Fragment).

У меня есть начальное количество полигонов в массиве, но после выполнения этапа тесселяции это число уже недействительно.

Я пытался использовать glGetQuery(GL_PRIMITIVES_GENERATED), но он всегда возвращает 0.

glGenQueries(1, query).
glBeginQuery(GL_PRIMITIVES_GENERATED, query).
//Draw stuff
glEndQuery(GL_PRIMITIVES_GENERATED).
glGetQueryObjectuiv(query, GL_QUERY_RESULT_AVAILABLE, &value).

person fern17    schedule 10.05.2014    source источник
comment
Ничего толкового это точно не даст. Если вы хотите получить результат примитивного запроса, вам нужно использовать glGetQueryObjectuiv (<primitive query ID>, GL_QUERY_RESULT, &value). Кроме того, вам следует подождать, пока GL_QUERY_RESULT_AVAILABLE не станет true, прежде чем делать это, иначе вы вызовете остановку конвейера. Можете ли вы показать код, в котором вы на самом деле настраиваете свой примитивный запрос? Если вы этого не сделали, я могу дать вам псевдокод для правильной настройки.   -  person Andon M. Coleman    schedule 10.05.2014
comment
@ AndonM.Coleman Извините за задержку, у меня проблемы с интернет-сервисом. Вот что я делаю (после прочтения вашего комментария): glGenQueries(1, query). Затем: glBeginQuery(GL_PRIMITIVES_GENERATED, запрос). Далее следует вызов glBindBuffer и glDrawElements. Сразу после: glEndQuery(GL_PRIMITIVES_GENERATED). glGetQueryObjectuiv(запрос, GL_QUERY_RESULT_AVAILABLE, значение). Значение всегда равно нулю, и вызов glGetQueryObjectuiv(query, GL_QUERY_RESULT, значение) также возвращает 0.   -  person fern17    schedule 14.05.2014
comment
Это С++, да? Вы должны использовать &value. Вас интересует не возвращаемое значение, и вам нужно передать OpenGL адрес переменной value. Я могу только представить, что компилятор разрешает это, потому что он неявно преобразует ваше целое число в указатель, но большинство компиляторов, по крайней мере, предупредят вас за попытку сделать это. Не могли бы вы отредактировать исходный вопрос и поместить то, что вы только что упомянули, в блок кода? Это сделало бы понимание этого намного проще.   -  person Andon M. Coleman    schedule 15.05.2014
comment
Действительно, я использую &value, но я написал это здесь неправильно.   -  person fern17    schedule 15.05.2014


Ответы (1)


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

количество треугольников/граней шейдера тесселяции GLSL?

person David Ljung Madison Stellar    schedule 11.05.2018