Здебільшого мені вдалося перенести реалізацію Marching Cubes з процесора до обчислювальних шейдерів OpenGL, але я ще не вирішував нормалів і цікавився найкращим способом зробити це.
Моя реалізація стосується конкретно полей з двозначними значеннями (я намагаюся моделювати 3D фрактальні функції, у яких ще немає оцінювача відстані), тому методи градієнта та різниці вперед не працюватимуть. Я ділив вершини, що працюють, і моя реалізація процесора використовує описаний тут метод Quilez для накопичення нормальних значень обличчя для кожної сусідньої вершини.
Я міг би просто перенести цю реалізацію на інший шейдер, але проблема, яку я бачу в цьому, - це велика кількість необхідних атомів. Оскільки ми можемо використовувати атомію лише для скалярних цілих чисел, і я не можу придумати спосіб упаковки 3 підписаних входів у 1 підсумковим чином, це означає 3 осі * 3 вершини = 9 атомних додань на виклик шейдера. Вони, звичайно, поширюватимуться по пам’яті, так що це не так, як ударити по одному атомному лічильнику 9 разів, але це все одно здається пеклом.
Інша альтернатива - запустити виклик шейдера на багатокутник і створити звичайний список обличчя (я, ймовірно, міг би упакувати в x10y10z10 таким чином), а потім шейдер на вершину, щоб накопичити всі нормали сусідніх граней. Це було б величезною формою пам’яті, але для зберігання найгірших випадків для зберігання обличчяних індексів потрібно 12 int на вершину. Існує також проблема, як записати в цей сховище, не вдаючись знову до атоміки, щоб визначити, скільки облич вже записано до певної вершини.
Хтось має кращі ідеї, як це зробити?