Очистка буфера двойной точности в OpenGL - PullRequest
1 голос
/ 04 ноября 2019

Есть ли быстрый способ очистить буфер OpenGL с типом данных двойной точности или установить значение по умолчанию с помощью вызова API, чтобы избежать использования вычислительного шейдера?

Для типов с половиной и одинарной точностью, glClearBufferData / glClearNamedBufferData можно использовать, но похоже, что для 64-битных типов нет внутреннего формата enum, что делает переключение с данных с одинарной или двойной точностью в приложениях для научных вычислений более громоздким. Или мне не хватает расширения?

Я ищу решение, которое работает с OpenGL 4.6, расширения для Nvidia вполне подойдут.

1 Ответ

1 голос
/ 04 ноября 2019

В конце концов, «двойник» - это просто способ интерпретации 64-битных данных. Ваша цель - получить правильные 64-битные значения в вашем буфере.

Что касается очистки буфера , то формат изображения и параметры передачи пикселей - это простообъяснение того, как интерпретировать данные, которые вы передаете. Если внутренний формат операции очистки - GL_RG32UI, то каждый «пиксель» в буфере - это 64-битные данные.

Учитывая это, все, что вам нужно сделать, это заставить функцию очистки принять64-битный блок и скопируйте его точно так, как вы его предоставили. Чтобы сделать это, вы должны использовать правильные параметры передачи пикселей .

Смотрите, операции переноса пикселей могут выполнять преобразование данных, принимая пройденный указатель data и преобразовывая его в соответствии свнутренний формат. Вы не хотите этого;Вы хотите прямую копию. Таким образом, ваши параметры передачи пикселей должны точно соответствовать внутреннему формату. Что довольно просто.

Формат GL_RG_INTEGER представляет двухкомпонентный пиксель, который хранит целочисленные данные в красно-зеленом порядке. А тип GL_UNSIGNED_INT означает, что каждый компонент представляет собой 32-разрядное целое число без знака. Это точно соответствует внутреннему формату GL_RG32UI, поэтому алгоритм копирования не будет связываться с байтами ваших данных.

Итак, учитывая некоторое 64-битное значение double в C или C ++, очисткабуфер для этого double должен быть таким простым:

void clear_buffer_to_double(GLuint buffer, double dbl)
{
  glClearNamedBufferData(buffer, GL_RG32UI, GL_RG_INTEGER, GL_UNSIGNED_INT, &dbl);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...