2013-06-24 80 views
11

我知道使用固定管线的how to draw round points。不过,我需要使用现代OpenGL来做同样的事情。这是可能的,还是应该使用点精灵和纹理?使用现代OpenGL绘制圆点

对于interested.Here是它是如何与固定管道进行:

 glEnable(GL_ALPHA_TEST); 
    glAlphaFunc(GL_NOTEQUAL, 0); 
    glEnable(GL_BLEND); 
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
    glEnable(GL_POINT_SMOOTH); 
    glPointSize(8.0); 

    glMatrixMode(GL_PROJECTION); 
    glLoadMatrixf(myMatrix); 
    glMatrixMode(GL_MODELVIEW); 
    glLoadMatrixf(myAnotherMatrix); 

    glBegin(GL_POINTS); 
    glColor3f(1,1,1); 

    glVertex3fv(position); 


    glEnd(); 
    glDisable(GL_POINT_SMOOTH); 
    glBlendFunc(GL_NONE, GL_NONE); 
    glDisable(GL_BLEND); 
+0

你是如何得出使用固定的管道,不过,如果不是回合点数使用点精灵和纹理?你是否将'glPointSize'和'GL_POINT_SMOOTH'一起使用?我不认为这是一种可靠的方法。 –

+0

有一个黑客;)看到更新。 –

回答

7
+0

事实上,我问过没有在着色器中做vodoo是可能的......但+1为链接:) –

+4

在现代OpenGL *中,没有任何东西可以在着色器中做任何事情,尽管如此。我宁愿调用'GL_POINT_SMOOTH'巫术的奇怪行为。 –

+0

“着色器中的巫术” - 不是你应该怎么考虑它,而不仅仅是绘画圈。更好地获得该计划,因为这是从这里开始实现的。固定功能是*传统* –

7

一种方法是绘制点精灵用圆圈纹理和片段着色器自制的alpha测试:

uniform sampler2D circle; 

void main() 
{ 
    if(texture(circle, gl_PointCoord).r < 0.5) 
     discard; 
    ... 
} 

但事实上,你甚至都不需要纹理这是因为一个圆是一个相当明确的数学概念。所以刚才只检查gl_PointCoord,它说在其中占整点你的当前片段[0,1]方的部分是:

vec2 coord = gl_PointCoord - vec2(0.5); //from [0,1] to [-0.5,0.5] 
if(length(coord) > 0.5)     //outside of circle radius? 
    discard; 
+0

为什么我需要自制alpha测试?如果纹理带有alpha那么硬件alpha混合就足够了。不应该吗? –

+0

@MichaelIV但alpha测试已被弃用,而不再是核心配置文件的一部分。也许alpha混合对你来说就足够了,但是如果可能的话,通常alpha测试是首选,因为它不会以“不可见”的片段污染深度缓冲区(也可能稍微快一点,因为“丢弃”是一个早期)。就像所说的那样,没有纹理的方法反而会更好。 –

+0

@MichaelIV想象一下,你想绘制许多不透明但圆形的粒子(耶,五彩纸屑时间!)。当使用alpha测试而不是alpha混合时,绝对不需要对粒子进行深度分类。但是,如果颗粒无论如何都是透明的,那么您仍然需要对它们进行排序并使用alpha混合,所以实际上可能没有'discard'功能的改进。 –