我有 VBO 来划分我的世界,有点像游戏暗黑破坏神。我曾经将顶点数据本身设置为世界中的确切位置,但随着位置的增长,浮点数学错误也随之增加。
我现在已经更改了它,以便顶点数据相对于 0,0,0,并且我正在使用 glTranslatef 将每个 VBO 设置到播放器周围的正确位置。
glPushMatrix();
glTranslatef(m_X, m_Y, m_Z);
draw VBO
glPopMatrix();
这使得玩家的 X 和 Z 位置始终在 0-512 范围内(1 VBO 的物理大小),当他们离开时,世界会以相反的方式移动。这很好用并修复了浮点错误,但是它引入了一个新错误。
在我的着色器中,我通过将顶点的 X 和 Z 位置的 cos/sin 乘以时间变量并用它们修改 Y 位置来创建类似水波的效果。
uniform float timeVar;
...
vec4 v = vec4(gl_Vertex);
v.y += (sin(v.x+timeVar*2)+cos(v.z+timeVar))*2-5;
...
gl_Position = gl_ModelViewProjectionMatrix * v;
当顶点位置准确时,这是有效的,但现在我怀疑它们在 0-512 范围内,因为在我将它们 glTranslatef 到它们的实际位置之前,它们都是设置的。这使得波浪仍然出现,但现在在 VBO 的边缘,由于 cos(0) != cos(512),水是分开的。
我需要在着色器中做些什么来获得顶点在世界中的实际位置吗?