【问题标题】:Drawing round points using modern OpenGL使用现代 OpenGL 绘制圆点
【发布时间】:2013-06-24 20:16:35
【问题描述】:

我知道how to draw round points 使用固定管道。但是我需要使用现代 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);

【问题讨论】:

  • 如果不使用点精灵和纹理,您是如何使用固定管道绘制圆点的?您是否将glPointSizeGL_POINT_SMOOTH 一起使用?我不认为这是一种可靠的方法。
  • 有一个 hack ;) 查看更新。

标签: opengl


【解决方案1】:

一种方法是在片段着色器中使用圆形纹理和自制的 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;

【讨论】:

  • 为什么我需要自制 alpha 测试?如果纹理带有 alpha,那么硬件 alpha 混合就足够了。不应该吗?
  • @MichaelIV 但是 alpha 测试已被弃用,不再是核心配置文件的一部分。也许 alpha 混合对您来说就足够了,但如果可能的话,通常会首选 alpha 测试,因为它不会用“不可见”片段污染深度缓冲区(并且可能会稍微快一些,因为discard 是一个早期的淘汰)。就像说的那样,无论如何,没有纹理的方法会更好。
  • @MichaelIV 想象一下,您想绘制许多不透明但圆形的粒子(耶,五彩纸屑时间!)。当使用 alpha 测试而不是 alpha 混合时,绝对不需要对粒子进行深度排序。但是,如果粒子仍然是透明的,您仍然需要对它们进行排序并使用 alpha 混合,因此discard 的功能可能确实没有改进。
  • @ChristianRau:单独的 Alpha 测试(没有 Alpha 混合)将导致锯齿状边缘。
  • @SigTerm 确实是对的,但也有解决方案。任何绘制到离散像素网格的东西都会导致锯齿状边缘。解决这个问题的方法是使用多重采样,并与 alpha-to-coverage 一起解决这个问题(您仍然需要实际的 alpha,但不需要 alpha 混合和深度排序)。
【解决方案2】:

【讨论】:

  • 事实上我已经问过是否可以在着色器中不做 vodoo...但是 +1 链接:)
  • 在现代 OpenGL 中,nothing 在着色器中不做 anything 是可能的。我宁愿称GL_POINT_SMOOTHvoodoo 的怪异行为。
  • “着色器中的巫术”——不是你应该怎么想的,也不仅仅是关于画圈。更好地使用该程序,因为这就是从现在开始完成的方式。固定函数是legacy
  • 虽然这个答案可能很有用,但您应该在其中添加更多解释,因为外部链接可能会在以后过期并且答案变得无用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-08
相关资源
最近更新 更多