簡體   English   中英

從fragmenthader返回浮子

[英]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_FragColorglReadPixels某個gl_FragColor將浮點數轉換為8位,然后再將其轉換回浮點數。

如何在不損失精度的情況下將距離值提取為float?

將R32F或R16F紋理附加到FBO並渲染。 然后使用glGetTexImage2D()提取像素,就像使用glReadPixels()

暫無
暫無

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

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