我有一项任务是在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;。
答案 0 :(得分:3)
不,不, nope 。
关于GPU渲染的事情通常是最大的性能打击是CPU-GPU同步点。因此,您通常希望将每帧的命令数减少到绝对最小值。我们无法删除的唯一功能是绘制调用;通常为glDrawElements
或gDrawArrays
。
但是,您每帧都会调用此函数数千次。考虑到你的GPU(最有可能)有几千兆字节的内存,这是一个更好的解决方案:
in
变量而不是uniform
,只能通过统一传递MVP矩阵。这样你可以在CPU 上方便地操作和准备数据,然后使用GPU的荒谬速度来绘制数据。