2

我希望使用 OpengGL 4.0 在 X 轴上的有限空间内绘制 2D 网格。

我希望使用 GLSL 使用 vert/frag 着色器等来渲染光线(使它们出现)。

它可以使用较旧的 OpenGL 2.0 方法使用最简单的代码来完成,但当然它不使用照明/着色器来为它们着色:

    void Draw_Grid()
    {
     for(float i = -500; i <= 500; i += 5)
        {
         glBegin(GL_LINES);
            glColor3ub(150, 190, 150);
            glVertex3f(-500, 0, i);
            glVertex3f(500, 0, i);
            glVertex3f(i, 0,-500);
            glVertex3f(i, 0, 500);
         glEnd();
        }
    }

但是我找不到除此之外的任何教程,这些教程不太了解,无法在 3D 空间中从图形转换为简单的 2D 网格。

4

2 回答 2

5

是的,您可以只使用着色器来生成几何图形...

  1. 不要绑定任何 VBO。
  2. 称呼glDrawArrays()
  3. gl_VertexID在顶点着色器或几何着色器中使用gl_PrimitiveID以程序生成您的东西。

它可以更快,因为没有顶点属性或输入数据。更不用说节省的空间和初始化时间几乎没有。

下面是一个使用 绘制网格的顶点着色器示例GL_TRIANGLES

#version 150

uniform mat4 modelviewMat;
uniform mat3 normalMat;
uniform mat4 projectionMat;

uniform ivec2 dim;

out vec3 esNorm;

const vec2 triOffset[] = vec2[](
    vec2(0,0),
    vec2(0,1),
    vec2(1,1),
    vec2(0,0),
    vec2(1,1),
    vec2(1,0));

void main()
{
    int triVert = gl_VertexID % 6;
    int gridIndex = gl_VertexID / 6;
    vec2 coord = vec2(gridIndex / dim.x, gridIndex % dim.x);
    coord = (coord + triOffset[triVert]) / vec2(dim);
    vec4 esVert = modelviewMat * vec4(coord * 2.0 - 1.0, 0.0, 1.0);
    gl_Position = projectionMat * esVert;
    esNorm = normalMat * vec3(0.0, 0.0, 1.0);
}

如果没有绑定在我古老的 ATI 卡上的 VBO,我确实在绘图时遇到了一些麻烦。这种方法在我的带有新驱动程序的 Nvidia 卡上运行良好。此处进一步讨论:Opengl,DrawArrays without binding VBO,建议将glDrawArraysInstanced/gl_InstanceID作为替代方案。

进一步说明。我注意到%在某些情况下模算术可能会有点慢。使用更简单的按位运算或其他技巧可能会加快速度。

于 2013-11-10T13:03:56.270 回答
-1

GLSL 不适合做这样的事情。GLSL 用于编写以下着色器:

  • 将简单的几何图形细分为稍微复杂的几何图形
  • 将抽象空间中的简单基元转换为剪辑空间
  • 控制片段光栅化过程

GLSL 并不打算用于实际进行绘图调用。是的,您可以使用着色器来生成程序几何体,但您总是从在客户端进行的几何体和绘制调用开始。

于 2013-11-09T20:48:15.083 回答