c++ - VBO 和 glTranslatef 是否需要将 GLSL 着色器中的 gl_vertex 与某些东西相乘?

标签 c++ opengl glsl shader vbo

我有 VBO 来划分我的世界,有点像暗黑破坏神游戏。我曾经将顶点数据本身设置为世界中的确切位置,但随着位置的增加, float 学错误也随之增加。

我现在更改了它,以便顶点数据相对于 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)。

我需要在着色器中做些什么来获取顶点在世界中的实际位置吗?

最佳答案

统一传入世界位置。

关于c++ - VBO 和 glTranslatef 是否需要将 GLSL 着色器中的 gl_vertex 与某些东西相乘?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10005257/

相关文章:

C++ 指针指向对象数组的索引

c++ - 在现代 OpenGL 中绘制多个对象的最佳方式是什么?

c++ - 雅可比矩阵的 5 DOF 逆运动学

math - 为什么在着色器中反转向量矩阵多序是合法的?

C++:函数在输出前自动使用50减去/增加输入数

c++ - 在读取数据文件时,如何找到用户输入的字符串的变位词?

c++ - 与 cusparse 相比,cublas 异常缓慢

c++ - 翻译过程中 MVP 行为异常

opengl - 从 uint64_t 图像句柄创建 image2D

ios - 当运行时间过长时,我可以让 glsl 退出循环吗?