2014-04-04 9 views
0

원형 스 플랫을 그려야하지만 내 유일한 데이터는 정점 위치입니다. 그래서 C++로 포인트를 그려서 올바른 위치에 나타납니다. 내 포인트 크기는 20 픽셀로 설정되므로 포인트는 원을 만들기 위해 일부 픽셀을 버릴만큼 충분히 큽니다.정점 위치에서 원형 스 플랫 그리기

버텍스 쉐이더에서 버텍스 쉐이더로 버텍스 픽셀 위치를 보내고 프래그먼트 위치와 버텍스 위치 사이의 거리를 계산할 수 있다고 생각했습니다. 원형 표시가 나오지만 대부분은 숨겨집니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

CG 정점 셰이더 :

void main(
    float4 pvec: POSITION, 

    uniform float4x4 modelView, 
    uniform float4x4 modelViewIT, 
    uniform float4x4 modelViewProj, 
    uniform float2 wsize, 
    uniform float near, 
    uniform float top, 
    uniform float bottom, 

    out float4 pout: POSITION, 
    out float4 color: COLOR, 
    out float2 vpos: TEXCOORD0 
) 
{ 
    //position of point correctly projected 
    pout = mul(modelViewProj, pvec); 

    vpos = float2((pout.xy * 0.5 + 0.5) * wsize); 
    color = float4(0.0, 0.0, 1.0, 1.0); 
} 

CG 단편 쉐이더 :

void main(
    float4 col : COLOR, 
    float2 wpos : WPOS, 
    float2 vpos: TEXCOORD0, 

    uniform float2 unproj_scale, 
    uniform float2 unproj_offset, 
    uniform float f_near, 
    uniform float zb_scale, 
    uniform float zb_offset, 
    uniform float epsilon, 

    out float4 colorout : COLOR 
) 
{ 
    float xDiff = abs(vpos.x - wpos.x); 
    float yDiff = abs(vpos.y - wpos.y); 

    if ((xDiff * xDiff + yDiff * yDiff) > 20.0) { 
     col.r = 1.0; 
    } 

    colorout = col; 
} 

Screenshot, blue circles, purple is discarded (now just colored) Screenshot, blue circles, purple is discarded (now just colored)

+1

화면 공간에서 위치를 계산할 때 원근감 나누기가 누락되었습니다.) – Joost

+0

정확합니다 .. 감사합니다 :) – Aloys

답변

1

정점 셰이더로부터 스크린 공간에서의 위치를 ​​계산, 기억 그거 그 그래픽 파이프 라인은 이라는 투시 부분을 수행하여 클립 공간 (x,y,z,w)의 포인트를 정규화 된 장치 좌표 (x/w,y/w,z/w,1)으로 변환합니다. 그런 다음 위치가 [-1,1]의 범위에 있고 화면 공간을 올바르게 변형 한 것입니다.