用现代OpenGL绘制圆点

用现代OpenGL绘制圆点,opengl,Opengl,我知道使用固定管道。然而,我需要使用现代OpenGL做同样的事情。可能吗,或者我应该使用点精灵和纹理吗 对于感兴趣的用户。以下是如何使用固定管道: glEnable(GL_ALPHA_TEST); glAlphaFunc(GL_NOTEQUAL, 0); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable( GL_POINT_SMOOTH )

我知道使用固定管道。然而,我需要使用现代OpenGL做同样的事情。可能吗,或者我应该使用点精灵和纹理吗

对于感兴趣的用户。以下是如何使用固定管道:

        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);

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

uniform sampler2D circle;

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

如果不使用点精灵和纹理,如何使用固定管道绘制圆形点?您是否将
glPointSize
GL\u POINT\u SMOOTH
一起使用?我认为这从来都不是一个可靠的方法。有一个黑客;)查看更新。事实上,我已经问过,如果不在着色器中执行vodoo,是否有可能……但是+1表示链接:)在现代OpenGL中,如果不在着色器中执行任何操作,则什么都不可能。我宁愿把
GL\u POINT\u SMOOTH
voodoo的怪异行为称为“阴影中的巫毒”——这不是你应该怎么想的,也不仅仅是画圆。最好开始做这个项目,因为从现在开始就是这样做的。固定函数是legacy虽然这个答案可能有用,但你应该在其中附加更多的解释,因为外部链接可能会在以后过期,并且答案变得不可用。为什么我需要自制alpha测试?如果纹理带有alpha,那么硬件alpha混合就足够了。是吗?@MichaelIV,但是alpha测试已经被弃用,不再是核心配置文件的一部分。也许alpha混合就足够了,但是如果可能的话,通常会首选alpha测试,因为它不会用“不可见”的片段污染深度缓冲区(而且可能会稍微快一点,因为
丢弃
是一个早期的方法)。就像我说的,没有纹理的方法无论如何都会更好。@MichaelIV想象你想要画很多不透明但圆形的粒子(是的,五彩纸屑时间!)。当使用alpha测试而不仅仅是alpha混合时,绝对不需要对粒子进行深度排序。但是,如果粒子是透明的,您仍然需要对它们进行排序并使用alpha混合,因此从
丢弃
@ChristianRau中可能真的没有功能改进:单独的alpha测试(没有alpha混合)将导致锯齿状边缘。@SigTerm确实正确,但也有解决方案。任何绘制到离散像素网格的内容都将导致锯齿状边缘。解决这个问题的方法是使用多重采样,并结合alpha-to-coverage来解决这个问题(您仍然需要实际的alpha,但不需要alpha混合和深度排序)。
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;