2012-06-07 4 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 거리에서만 픽셀에 투영됩니다. 일반적으로 픽셀에 투영 된 피라미드가 있습니다. 여기

당신은 갈 : 월드 공간 위치에

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); 
  • 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; 
    
  • 것은 찾기

    1. 는 NDC 지점에 두 개의 화면 포인트로 변환 R1과 R2 사이의 거리. 조각 쉐이더에서

    당신은 지역의 파생 상품을 사용할 수 있습니다. 여기 봐 여기

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

    과 :

    만 프래그먼트 쉐이더 가능

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

    , dFdx 및 dFdy는 각각 X 및 Y에서 식 (P)의 편미분을 반환한다. 계산은 지역 차이를 사용하여 계산됩니다. dFdx (dFdx (n))와 같은 고차 유래 물을 암시하는 표현식은 dFdx (dFdy (n))와 같은 혼합 주문 파생물처럼 정의되지 않은 결과를 가져옵니다. 표현 p가 연속적이며, 따라서 비 균일 제어 흐름을 통해 평가 된 표현은 정의되지 않을 수 있습니다.

  • +1

    이 함수는 프래그먼트 셰이더에서만 사용할 수 있으며 꼭 꼭 사용해야하는 것은 아닙니다. – atb

    +1

    업데이트 된 답변보기 –

    +0

    OK, 의미론을 사용하여 버텍스 셰이더의 현재 버텍스 z- 깊이에서 "픽셀 피라미드"의 월드 - 스페이스 너비가 필요합니다. 당신의 대답은 여전히 ​​도움이되지 않지만, 정보를 주셔서 감사합니다. – atb