Warp着色器在移动设备和桌面设备上的表现不同

时间:2016-05-25 13:56:32

标签: android opengl-es libgdx glsl glsles

我尝试实现warp着色器(黑洞)。它在桌面上运行良好,但在移动设备上看起来不对。问题在于它的大小。当我增加黑洞的大小时,翘曲的边缘消失。如果它的尺寸非常小,它看起来就像我想要的那样。我正在使用LibGDX。

它应该是什么样子(桌面): enter image description here

它在具有相同尺寸的移动设备上的外观如何: enter image description here

当我减小尺寸时,会出现扭曲的边缘: enter image description here

顶点着色器:

attribute vec2 a_position;

void main()
{   
   gl_Position = vec4(a_position.xy, 0.0, 1.0);    
}

片段着色器:

#ifdef GL_ES
precision mediump float;
#endif

uniform sampler2D u_texture;
uniform vec2 u_res;
uniform float u_size;

// Gravitational field at 
// position pos, given a black hole
// of mass m at position center
// (ignoring G constant)
vec2 Fgrav(float m, vec2 center, vec2 pos)
{
    vec2 dir = center - pos;
    float distance = length(dir);
    dir /= distance;
    return dir * (m / (distance*distance));
}

void main(void)
{   
    vec2 texCoord = gl_FragCoord.xy / u_res.xy; 
    vec4 sceneColor;    

    vec2 blackHoleCenters = vec2(u_res.xy*.5);                                      
    vec2 netGrav = Fgrav( (50. - u_size) * 500., blackHoleCenters, gl_FragCoord.xy);                
    float netGravMag = length(netGrav);

    if(netGravMag < 1.0)        
    {
        texCoord = (gl_FragCoord.xy + netGrav*((50. - u_size) * 15.0))/u_res.xy;            
    }
    else texCoord.xy=vec2(.5,.5);   

    sceneColor = texture2D(u_texture, texCoord);    
    gl_FragColor = sceneColor;  
}

如何解决此问题?感谢。

更新

我是如何得到u_size参数:

public float getDistance(Camera cam){
    return (float) Math.sqrt(Math.pow(cam.position.x, 2) + Math.pow(cam.position.y, 2) + Math.pow(cam.position.z, 2));
}

public void render(Camera cam, Mesh quad) {
    program.begin();        
    program.setUniformf(u_size, getDistance(cam));

...

初始化相机:

cam = new PerspectiveCamera(64, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
cam.position.set(0f, 0.0f, 30.0f);
cam.lookAt(0,0.0f,0);
cam.near = 0.1f; 
cam.far = 450f;
cam.update();

因此,u_size的初始值为30

0 个答案:

没有答案