[英]Return floats from fragmentshader
對於應用程序,我需要創建網格的深度圖像。 基本上我想要一張圖像,其中每個像素都指示相機中心和相交點之間的距離。 我選擇使用OpenGL執行此任務,以便大多數計算可以在GPU而不是CPU上完成。
這是我的頂點着色器代碼。 它計算相交點的實際坐標,並將坐標存儲在varying vec4
,以便我可以在片段着色器中訪問它。
varying vec4 verpos;
void main(void)
{
gl_Position = ftransform();
verpos = gl_ModelViewMatrix*gl_Vertex;
}
這里是片段着色器的代碼。 在片段着色器中,我使用這些坐標來使用畢達哥拉斯計算到原點(0,0,0)的歐式距離。 為了訪問CPU上的計算值,我的計划是使用gl_FragColor
將距離存儲為顏色,並使用glReadPixels(0, 0, width, height, GL_RED, GL_FLOAT, &distances[0]);
提取顏色值glReadPixels(0, 0, width, height, GL_RED, GL_FLOAT, &distances[0]);
varying vec4 verpos;
void main()
{
float x = verpos.x;
float y = verpos.y;
float z = verpos.z;
float depth = sqrt(x*x + y*y + z*z) / 5000.0;
gl_FragColor = vec4(depth, depth, depth, 1.0);
}
問題是,我僅以0.003921569
( =1/255
0.003921569
的精度接收結果。 結果值包含例如0.364705890, 0.364705890, 0.364705890, 0.364705890, 0.368627459, 0.368627459, 0.368627459
。 連續的大多數值都完全相同,然后跳了1/255。 因此,OpenGL在gl_FragColor
和glReadPixels
某個gl_FragColor
將浮點數轉換為8位,然后再將其轉換回浮點數。
如何在不損失精度的情況下將距離值提取為float?
將R32F或R16F紋理附加到FBO並渲染。 然后使用glGetTexImage2D()
提取像素,就像使用glReadPixels()
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.