在3D空间中使用GLSL绘制2D网格

时间:2013-11-09 17:47:34

标签: opengl glsl

我希望使用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();
        }
    }

但是我可以找到除this以外的任何教程,我不太了解它可以很好地将图形转换为3D空间中的简单2D网格。

2 个答案:

答案 0 :(得分:4)

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

  1. 不要绑定任何维管组织。
  2. 致电glDrawArrays()
  3. 在顶点着色器中使用gl_VertexID或在几何着色器中使用gl_PrimitiveID来程序生成您的内容。
  4. 它可以更快,因为没有顶点属性或输入数据。更不用说节省的空间和初始化时间几乎没有。

    以下是使用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作为替代。

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

答案 1 :(得分:-1)

GLSL不是为了做那样的事情。 GLSL用于编写着色器:

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

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