Тесселяция местности: Я обрабатываю свою местность с клип-картами с усечками и тосселяционными шейдерами. Теперь, чтобы повысить производительность, я хочу использовать некоторые тесселяционные шейдеры более эффективным способом. Моя цель - добиться очень высокой частоты кадров (~ 100 FPS) с приличным визуальным качеством, поэтому я собираюсь объединить 3 фактора тесселяции, карту тесселяции, зависимость от зависимости (пиксели на краю) и тесселяцию силуэта.Оптимизация тесселяции [OpenGL]
Моя идея представляет собой взвешенное среднее из них:
tessfac = tesscoeff*(w1*tessmapfactor+w2*silhtessfactor+w3*ppetessfactor)/(w1+w2+w3);
с 3-х факторов колеблется от 0 ... 1, а tesscoeff может быть равномерная тоже для регулировки уровней. У меня есть карта и факторы радиус края, но ...
Силуэты: Как найти силуэт пятна на сетке, описанной с помощью простого y(x,z)
функции? Я использую vertex-texture-fetch, поэтому я знаю соседние вершины/нормали. Это проблема, если я использую квадратные пятна, а не треугольники, или это не затрудняет их поиск?
(отредактирован BACK-PATCH) Backpatch Culling: Другая проблема, я столкнулся это тыльный забой. Как я уже сказал, я использую квадратные пятна, поэтому нельзя лежать на самолете. С треугольниками я бы сравнил нормальное с глазом направление, но на квадроциклах я не могу или не знаю, как это сделать.
Occlusion Culling: Я рендеринга местности с геометрией клип-карты с алгоритмом:
foreach(LOD)
foreach(quarter)
foreach(quad in quarter) //I mean x+z+, x-z+, x-z- and x+z- by quarters
quad.clipFrustum();
if(inFrustum) quad.render();
endloop
endloop
endloop
У меня есть один единый буфер вершин для простого n*n
четырехъядерных формы беспорядок. У меня есть 4 индексных буфера для этой сетки, по одному для каждого квадранта этого квадранта. Для LOD=0
я визуализую центр/нижний левый quad, а для других уровней я только визуализирую L-образный беспорядок с другими 3 (вверху, topleft, слева) квадранты, масштабируемые pow(2,LOD)
. Затем вся сетка масштабируется с постоянной (сеткой).
Поскольку вся эта сетка расположена на каждом кадре перед камерой, сетка всегда отображается квадрантом по квадранту с начала координат. Может быть, он может быть использован для отбраковки, например, early-z или окклюзия в шейдерном управляющем шейдере?
Я ищу некоторый указатель на них, потому что все, что я нашел, это некоторые документы NVIDIA/AMD без особого технического фона. http://www.geeks3d.com/20101201/amd-graphics-blog-tessellation-for-all/ ссылка на полный текст статьи сломана тоже ... (с этого поста: OpenGL Low-Level Performance Questions)
Что касается спины - ** лицо ** отбраковка, вы примитивная сборка, связанная в этом приложении? Обратное отбрасывание - это, как правило, операция растеризации, но в прошлые годы примитивная настройка была настолько дорогой, что двигатели иногда отбирали треугольники на уровне вершин (вспомните Quake 3, он вычислит список треугольников, чтобы нарисовать на ЦП каждый кадр). Некоторые игры для PS3 все еще делают это, поскольку это простой способ удержать процессор CELL, занятый работой, чтобы уменьшить общую нагрузку на RSX, но большую часть времени, отбрасывая эти дни, заключается в уменьшении нагрузки на приложения, связанные с фрагментами. –
Думаю, вам больше понравится отбраковка back-patch. Отбросьте целые патчи, прежде чем вы решите отказаться от отдельных примитивов, которые они генерируют. –
Что я хочу сделать, это отбросить обратные пятна, установив их уровни тесселяции на 0. Не называется ли это отбрасыванием назад-патча? (до редактирования я написал «back-face», исправлено «back-patch») –