Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl 用于平铺水纹理的LibGDX中的片段着色器_Opengl_Libgdx_Shader_Fragment Shader - Fatal编程技术网

Opengl 用于平铺水纹理的LibGDX中的片段着色器

Opengl 用于平铺水纹理的LibGDX中的片段着色器,opengl,libgdx,shader,fragment-shader,Opengl,Libgdx,Shader,Fragment Shader,使用LibGDX,我试图找出如何编写一个简单的片段着色器,该着色器能够在X和Y方向上使用简单的正弦效果渲染平铺水纹理,但确保相邻平铺仍然连接在纹理边缘上(见图)。我很难弄明白这件简单的事情——我的数学可能有点生疏了。你能帮我吗 当然,当纹理坐标向内偏移时,着色器无法“猜测”纹理负部分上的内容,但纹理是一个自连接马赛克,因此我猜可以在这里做一些事情 片段着色器是: #ifdef GL_ES precision mediump float; #endif uniform sampler2D u_

使用LibGDX,我试图找出如何编写一个简单的片段着色器,该着色器能够在X和Y方向上使用简单的正弦效果渲染平铺水纹理,但确保相邻平铺仍然连接在纹理边缘上(见图)。我很难弄明白这件简单的事情——我的数学可能有点生疏了。你能帮我吗

当然,当纹理坐标向内偏移时,着色器无法“猜测”纹理负部分上的内容,但纹理是一个自连接马赛克,因此我猜可以在这里做一些事情

片段着色器是:

#ifdef GL_ES
precision mediump float;
#endif

uniform sampler2D u_texture;    // 0
uniform float time;             // elapsed time
uniform float xFactor;          // controls effect amplitude in the X and Y directions
uniform float yFactor;
uniform float xWobble;          // de-synchronize X and Y 'wobling' effect between layers
uniform float yWobble;

const float M_PI = 3.1415926538;

varying vec2 v_texCoords;

void main()
{
    vec2 l_texCoords = v_texCoords;
    l_texCoords = v_texCoords + vec2(xFactor * sin((1. - v_texCoords.x) * 2. * M_PI + time * xWobble), yFactor * cos((1. - v_texCoords.y) * 2. * M_PI + time * yWobble));
    gl_FragColor = texture2D(u_texture, l_texCoords);

}
然后,在Java方面,我会:

batch.setShader(waterShader);
batch.setProjectionMatrix(backgroundCamera1.combined); //Background 1
batch.begin();
batch.getShader().setUniformf("time", deltaAcc);
batch.getShader().setUniformf("xFactor", 0.05f);
batch.getShader().setUniformf("yFactor", 0.07f);
batch.getShader().setUniformf("xWobble", 0.12f);
batch.getShader().setUniformf("yWobble", 0.22f);
batchTileMapRenderer.setView(backgroundCamera1);
bTileMapRenderer.renderTileLayer(tilesBg1Layer); // The water layer, with 128x128 tiles
batch.end();
batch.setShader(null);

我希望您能解释一下这个看似简单的问题……

可重复的图像是地图册中的纹理区域,还是整个纹理?您好,谢谢您的回答。每个瓷砖都是具有相同纹理的区域。或多或少,我解决了一个特定情况下的问题,但当正弦以以下方式取决于变化的u\u纹理命令时:
float x\u offset=sin(time+(5.0*u\u textureCoord.x+5.0*u\u textureCoord.y)*因子)
并且我对y也这样做时,力矩因子与1.0不同,纹理边缘的瓷砖没有对齐。也许有一种方法可以让你穿上带有相位信息的制服,但我想不出来!如果这样做,您将无法批量绘制它们,因为SpriteBatch没有足够的顶点数据来保存有关在何处跳回UV以重复UV的信息。您必须为绘制的每个不同平铺设置一些不同的着色器制服。在这一点上,你最好不要把它们放在地图册中,然后很容易让它们自动无缝地重复。