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

Drawing triangles after calculating points in GLSL

本文关键字:绘制 三角形 计算 GLSL      更新时间:2023-10-16

我有一项任务要在OpenGL中准备一个hipsomemetric地球仪。除了顶点的颜色之外,我还需要一些顶点更高(山),一些更低。

目前,我有一个程序,它生成一个地球仪,只有点(每1度),都在同一高度上,我通过将纬度和经度传递给GLSL中的程序来实现这一点,它计算每个顶点的平移矩阵。

现在,我可以很容易地想象如何将顶点移动得更高和更低-我只需添加另一个统一的变量"高度",然后在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是由统一变量"lat"answers"lng"计算的平移矩阵。

不,不,Nope

GPU渲染通常最大的性能打击是CPU-GPU同步点。因此,您通常希望将每帧的命令数量减少到绝对最小值。我们唯一不能删除的函数是绘制调用;通常为CCD_ 1或CCD_。

但是,您在每帧调用此函数数千次。考虑到你的GPU(很可能)有几GB的内存,这里有一个更好的解决方案:

  1. 将整个顶点集离线生成为常规浮点数组
  2. 通过VBO将其复制到GPU
  3. 使用in变量而不是uniform,并且仅通过均匀传递MVP矩阵
  4. 只需使用一个drawcall即可渲染整个模型

这样你就可以在CPU上方便地操作和准备数据一次,然后使用GPU的荒谬速度来绘制它。