在现代 OpenGL 中渲染大圆形点

  • 本文关键字:OpenGL opengl-4
  • 更新时间 :
  • 英文 :


我想围绕一组 2D 坐标存储在 VBO 中的点渲染动态变化半径的填充圆。到目前为止,我使用的是GL_POINT_SMOOTH,但现在已切换到OpenGL 4.0,此选项不再可用。我在这里看到了一个类似的问题,但这不太适合我的需求,因为该示例中的圆心在片段着色器中是硬编码的。我该怎么做?

目前,我的顶点着色器如下所示:

#version 400
layout(location=0) in vec2 in_Position;
layout(location=1) in vec4 in_Color;
out vec4 ex_Color;
uniform vec4 bounds;
void main(void){
    float x = -1+2/(bounds.y-bounds.x)*(in_Position.x-bounds.x);
    float y = -1+2/(bounds.w-bounds.z)*(in_Position.y-bounds.z);
    gl_Position = vec4(x,y,0,1);
    ex_Color = in_Color;
}

我的片段着色器看起来像这样:

#version 400
in vec4 ex_Color;
out vec4 out_Color;
void main(void){
    out_Color = ex_Color;
}

使用这些着色器,我得到了平方点。

绘制点的"现代"方式是这样的:

  1. 启用程序点大小模式:

    glEnable(GL_PROGRAM_POINT_SIZE);
    
  2. 使用GL_POINTS基元模式渲染顶点。

  3. 在顶点着色器中,将内置变量gl_PointSize设置为单个点的所需大小:

    gl_Position = ...;
    gl_PointSize = ...;
    
    如果此点大小始终相同,则用于此点大小的值可以是

    常量;如果您希望能够在绘制调用之间调整它,则为均匀值;如果点大小是每个点可变的,则用于顶点属性的值可以是固定值。

  4. 这将生成由 gl_PointSize 值指定大小的平方点的片段。在片段着色器中,您可以使用内置的 gl_PointCoord 变量,该变量为您提供点内片段的相对坐标。它的工作方式与纹理坐标非常相似,在每个方向上提供 [0, 1] 的范围。

    例如,如果你想要纹理点(这对粒子系统非常有用),片段着色器代码可以包含:

    outColor = texture(particleTex, gl_PointCoord);
    

    或者,如果你想要圆点,你可以根据与中心的距离丢弃圆圈外的所有内容:

    vec2 circCoord = 2.0 * gl_PointCoord - 1.0;
    if (dot(circCoord, circCoord) > 1.0) {
        discard;
    }
    

    或者类似地,您可以使圆外的片段透明,并启用混合,以获得圆点。

请注意,支持的磅值范围取决于实现。您可以使用以下命令查询可用范围:

GLfloat sizeRange[2] = {0.0f};
glGetFloatv(GL_POINT_SIZE_RANGE, sizeRange);

相关内容

  • 没有找到相关文章