VBO和glTranslatef做GLSL着色器中的gl_vertex需要乘以什么?

时间:2012-04-04 05:09:06

标签: c++ opengl glsl shader 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的范围内,因为在我将它们转换到它们的实际位置之前它们都被设置为。这使波仍然出现,但现在在维管组的边缘,水是分开的,因为cos(0)!= cos(512)。

在着色器中我需要做些什么才能获得世界中顶点的实际位置?

1 个答案:

答案 0 :(得分:1)

作为制服传递世界位置。