Я хочу использовать OpenGL для выборки дискретной скалярной карты. Скалярное отображение дается на основе каждого треугольника, то есть один скаляр на треугольник.
Сначала я рисую каждый треугольник с плоским затенением и значением цвета, соответствующим скалярной карте. Затем я прочитал отобранную скалярную карту из кадрового буфера, используя glReadPixels (…).
Моя проблема заключается в следующем:
По какой-то причине я могу восстановить только значения цвета до 1e-2! Я понятия не имею, почему эта точность так плоха. Пишу и читаю поплавки из фреймбуфера.
Кто-нибудь знает, почему я могу восстановить только такую плохую точность с плавающей запятой из кадрового буфера?
Вот важный фрагмент кода, где я просто использую постоянное значение цвета colorValue для каждого треугольника. Если я установлю colorValue например до 1e-4 я могу восстановить нули только из кадрового буфера.
// Set viewport to desired map size
glViewport(0,0,imageWidth, imageHeight);
glClearColor(0.,0.,0.,1.); // Black background
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glDisable(GL_LIGHTING);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(-1,1.,-1,1);
glMatrixMode(GL_MODELVIEW);
// Draw scalar map
glBegin(GL_TRIANGLES);
for (unsigned int f=0; f<F.rows(); ++f)
{
val = colorVal;
glColor3f(val, val, val);
glVertex3f(...);
glVertex3f(...);
glVertex3f(...);
}
glEnd();
glFlush();
glFinish();
GLfloat* fbuffer = new GLfloat[imageWidth*imageHeight];
glReadPixels(0,0,imageWidth,imageHeight,GL_RED,GL_FLOAT,fbuffer);
Неважно, что вы пишете или читаете из кадрового буфера, а также то, что фактически делает кадровый буфер магазины.
GL с радостью преобразует цвета в / из без знака нормированный весь день напролет. Если у вас нет кадрового буфера с плавающей точкой, случается много неприятных вещей, таких как зажим ([0.0,1,0]) и масштабирование до диапазона значений с фиксированной точкой (обычно 8-битных).
Учитывая 8-битный нормализованный цветовой буфер без знака, наименьшее ненулевое значение цвета, которое вы можете сохранить и восстановить, ~ 0,0039 (1,0/255,0).
Процесс создания с плавающей точкой дефолт framebuffer зависит от платформы / фреймворка. Чтобы сделать то, что вы хотите переносимым, проще всего на самом деле нарисовать в FBO с цветным вложением с плавающей точкой, которое вы создаете после Вы устанавливаете кадровый буфер по умолчанию.