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
Java 2D glsl着色器变换_Java_Opengl_Libgdx_Glsl_Shader - Fatal编程技术网

Java 2D glsl着色器变换

Java 2D glsl着色器变换,java,opengl,libgdx,glsl,shader,Java,Opengl,Libgdx,Glsl,Shader,我想创建一个着色器,在使用libgdx构建的2D场景中模拟一个伪3D水面。我们的想法是重现以下效果: 但我一直在创建梯形形状,我想我不明白如何在opengl着色器上计算纹理坐标。我可以在顶点着色器中修改顶点,还是可以置换片段着色器上的纹理 我做了一个测试,但没有达到预期效果 顶点着色器: attribute vec4 a_position; attribute vec4 a_color; attribute vec2 a_texCoord0; uniform mat4 u_projTrans

我想创建一个着色器,在使用libgdx构建的2D场景中模拟一个伪3D水面。我们的想法是重现以下效果:

但我一直在创建梯形形状,我想我不明白如何在opengl着色器上计算纹理坐标。我可以在顶点着色器中修改顶点,还是可以置换片段着色器上的纹理

我做了一个测试,但没有达到预期效果

顶点着色器:

attribute vec4 a_position;
attribute vec4 a_color;
attribute vec2 a_texCoord0;

uniform mat4 u_projTrans;

varying vec4 v_color;
varying vec2 v_texCoord0;

void main()
{
    v_color = a_color;
    float factor = (a_texCoord0.x - 0.5) * (a_texCoord0.y);
    v_texCoord0 = a_texCoord0;
    v_texCoord0.x += factor;
    gl_Position =  u_projTrans * a_position;
}
片段着色器只是一个传递

varying vec4 v_color;
varying vec2 v_texCoord0;

uniform sampler2D u_texture;

void main()
{
    gl_FragColor = v_color * texture2D(u_texture, v_texCoord0);
}
以及结果图像


我确信我的方法太天真了。

最后,我决定只使用片段着色器来实现效果。 通过应用Y轴上的X位移进行假深度计算

这是鹬:

// simulate 3D surface
vec2 new_coord = v_texCoord0;
// calculate the stretching factor
float factor = ((0.5 - new_coord.x) * new_coord.y);
// apply the factor and stretch the image
new_coord.x += factor;

gl_FragColor = texture2D(u_texture, new_coord);