【问题标题】:Render large circular points in modern OpenGL在现代 OpenGL 中渲染大圆形点
【发布时间】:2014-11-24 05:20:36
【问题描述】:

我想围绕一组点渲染动态变化半径的实心圆,这些点的二维坐标存储在 VBO 中。到目前为止,我使用的是 GL_POINT_SMOOTH,但现在已经转移到 OpenGL 4.0,这个选项不再可用。我看到了一个类似的问题here,但这并不完全适合我的需要,因为该示例中的圆心在片段着色器中是硬编码的。我该怎么做?

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

#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;
}

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

【问题讨论】:

    标签: opengl-4


    【解决方案1】:

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

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

    【讨论】:

    • 完美!我的困惑源于对片段着色器缺乏了解。现在我明白了这是如何工作的!非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-06
    • 1970-01-01
    • 1970-01-01
    • 2018-08-10
    • 1970-01-01
    相关资源
    最近更新 更多