簡體   English   中英

使用glReadPixels(...)讀取幀緩沖區時,精度較低

[英]Weak precision when reading framebuffer with glReadPixels(…)

我想利用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.00391.0 / 255.0 )。

創建浮點默認幀緩沖區的過程是特定於平台/框架的。 要輕巧地做您想做的事,實際上最簡單的方法是將FBO拖入帶有默認設置的幀緩沖區創建的浮點顏色附件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM