在贴图上的libgdx中使用相机进行着色器高度图转换

时间:2014-09-11 14:59:58

标签: opengl libgdx glsl shader tile

我试图在使用高度图的基于libgdx的2D游戏上使用着色器创建漂亮的水失真效果。

首先,我将整个场景渲染为FBO

first rendering with no effects

然后我将失真效果应用于渲染的FBO并使用蒙版来确定瀑布位置。 在应用面具之前:

before the mask

enter image description here

为了达到这个效果,我根据时间在着色器中平移高度图的Y坐标,并使用fract(heighmapCoord)在其中循环。

问题是当相机移动到跟随播放器时,高度图在X轴上保持静止。 我决定根据heightmapCoordcamera.position函数翻译fract()。 heighmap似乎跟随相机,但速度较慢,导致效果在瀑布面罩内滑动。

似乎存在预测问题。此外,我不确定这是否是创造这种效果的好方法。

如何使高度贴图完全跟随相机移动?

编辑:

我只使用片段着色器,顶点一个是passthrought着色器:

void main() {
    v_color = a_color;
    v_texCoord0 = a_texCoord0;
    gl_Position =  u_projTrans * vec4(a_position, 1.);
}

1 个答案:

答案 0 :(得分:0)

我找到了解决方案。您必须将坐标从屏幕转换为着色器,如下所示:

假设屏幕为15 * 10个瓷砖(宽度*高度)的视口,您需要将heighmap纹理坐标转换为

texCoord.x += camera.x / viewPortTileWidth;  // 15
texCoord.y += camera.y / viewPortTileHeight; // 10

然后当玩家移动时,heighmap将不再滑动。