2012-06-07 96 views
3

我想計算一個像素投影金字塔在glsl頂點着色器中當前頂點位置處的眼睛空間寬度,但我似乎無法得到正確的數學。這是一個明顯不正確的例子:GLSL頂點着色器中的眼睛空間像素寬度

// GLSL VERTEX SHADER 
#version 410 compatibility 

uniform vec4 viewport; // same as glViewport​ 
in vec4 gl_Vertex; 

void main() 
{ 
    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; 
    float pixelWidth = gl_Position.z/viewport.z; 
<snip> 

但是這並沒有考慮FOV或剪切平面。

回答

1

我完成了數學計算。 :)至於我曾希望有不需要額外的矩陣變換,只是一個鴻溝:

// GLSL VERTEX SHADER 
#version 410 compatibility 

uniform vec4 viewport; // same as glViewport​ 
in vec4 gl_Vertex; 

float pixelWidthRatio = 2./(viewport.z * gl_ProjectionMatrix[0][0]); 

void main() 
{ 
    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; 
    float pixelWidth = gl_Position.w * pixelWidthRatio; 
    <snip> 

或者:

<snip> 
float pixelHeightRatio = 2./(viewport.w * gl_ProjectionMatrix[1][1]); 

void main() 
{ 
    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; 
    float pixelHeight = gl_Position.w * pixelHeightRatio; 
<snip> 

正如預期的那樣,pixelWidthpixelHeight是,如果像素是正方形相同。

0

頂點着色器中,沒有像像素的世界空間寬度那樣的東西。 「寬度」僅在給定的Z距離處投影到像素中。一般來說,你有一個金字塔投影到一個像素。

在這裏你去:

  1. 轉換的兩畫面,點到NDC點:

    vec2 Screen = vec2(ScreenWidth, ScreenHeight); 
        vec3 Point1 = vec3(ScreenPt1/Screen * 2.0 - vec2(1.0), 1.0); 
        vec3 Point2 = vec3(ScreenPt2/Screen * 2.0 - vec2(1.0), 1.0); 
    
  2. Unproject NDC點到世界空間中的位置:

    vec4 R1 = vec4(Point1, 1.0); 
        vec4 R2 = vec4(Point2, 1.0); 
    
        R1 = Projection.GetInversed() * R1; 
        R1 = ModelView.GetInversed() * R1; 
        R1 /= R1.W; 
    
        R2 = Projection.GetInversed() * R2; 
        R2 = ModelView.GetInversed() * R2; 
        R2 /= R2.W; 
    
  3. 查找R1和R2之間的距離。

片段着色器你可以使用本地的衍生物。看看這裏:

http://www.opengl.org/sdk/docs/manglsl/xhtml/dFdx.xml

和這裏:

http://www.opengl.org/sdk/docs/manglsl/xhtml/fwidth.xml

僅可在片段着色器,dFdx和dFdy分別返回表達式p的偏導數在x和y。偏差是使用局部差分來計算的。像dFdx(dFdx(n))這樣的混合階導數,含有高階導數的表達式如dFdx(dFdx(n))具有未定義的結果。假定表達式p是連續的,因此,通過非均勻控制流評估的表達式可能是不確定的。

+1

這些函數僅在片段着色器中可用,我在詢問頂點着色器,所以這對我沒有幫助。 – atb

+1

查看我更新的答案。 –

+0

好的,使用你的語義我需要在頂點着色器當前頂點z深度處的「像素金字塔」的世界空間寬度。你的答案仍然不能幫助我,但感謝您的信息。 – atb

相關問題