2014-04-04 34 views
0

我想绘制圆形图形,但是我唯一的数据是顶点位置。所以我用C++画出了点,并且它们出现在正确的位置上。我的点大小设置为20像素,因此这些点大到足以丢弃一些像素以获得一个圆。从顶点位置绘制圆形图示

我想我可以从顶点着色器发送顶点像素位置到片段着色器,然后计算片段位置和顶点位置之间的距离。这导致了圆形的splats,但是其中大部分将被隐藏。我究竟做错了什么?

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

当计算在从顶点着色器屏幕空间中的位置,记那个t他的图形管线执行所谓的透视分区将剪辑空间(x,y,z,w)中的点转换为标准化的设备坐标(x/w,y/w,z/w,1)。只有这样,该位置才会在[-1,1]的范围内,并且正在转换为正确的屏幕空间。