在GLSL中计算点后绘制三角形

时间:2014-01-11 12:07:01

标签: c++ opengl glsl

我有一项任务是在OpenGL中准备一个hipsometric globe。除了顶点的颜色,我需要一些顶点更高(山脉),有些顶点更低。

目前,我有一个程序生成一个地球仪,只有点(每1度),都在同一高度,我这样做是通过将纬度经度传递给GLSL中的程序,并计算转换矩阵为每个顶点。

现在,我可以轻松想象如何更高和更低地移动顶点 - 我将添加另一个统一变量" height",在GLSL中我将完成其余的工作。同样容易的是通过颜色 - 没问题。

但是,我不知道如何使用三角形创建整个地图(嗯,由两个三角形组成的四边形)。 我有的最好的解决方案是,当我有四个顶点(x1,x2,x3,x4)创建一个四边形时,我可以用这种方式转换一个四边形(以前在缓冲区中),生成一个四边形在我的四个顶点(x1,x2,x3,x4)中有角。然后,我将它传递给GLSL并渲染它。

但是,我不知道如何变换四边形以创建一个在我的顶点有角的新四边形。可能吗?或者也许是另一个想法如何实现这个四合院?

其他信息:

我正在使用OpenGL 3.3。

这就是我渲染点的方式:

for (double lng = 0; lng < 360; lng++) {
    for (double lat = 0; lat < 180; lat++) {
        draw_dots(MVP, lat, lng);
    }
}

// draw_dots function:
glUniform1f(latID, lat);
glUniform1f(lngID, lng);
glUniformMatrix4fv(MatrixID, 1, GL_FALSE, &MVP[0][0]);
glDrawElements(GL_POINTS, 1, GL_UNSIGNED_INT, field1_location);

这是我的顶点着色器:

gl_Position = MVP * transl_mtx * vec4(vertexPosition_modelspace, 1);

其中transl_mtx是根据统一变量计算的平移矩阵&#34; lat&#34;和&#34; lng&#34;。

1 个答案:

答案 0 :(得分:3)

不,不, nope

关于GPU渲染的事情通常是最大的性能打击是CPU-GPU同步点。因此,您通常希望将每帧的命令数减少到绝对最小值。我们无法删除的唯一功能是绘制调用;通常为glDrawElementsgDrawArrays

但是,您每帧都会调用此函数数千次。考虑到你的GPU(最有可能)有几千兆字节的内存,这是一个更好的解决方案:

  1. 将整组顶点离线生成到常规浮点数组。
  2. 通过VBO将其复制到GPU。
  3. 使用in变量而不是uniform,只能通过统一传递MVP矩阵。
  4. 只使用一个drawcall渲染整个模型。
  5. 这样你可以在CPU 上方便地操作和准备数据,然后使用GPU的荒谬速度来绘制数据。