【问题标题】:Libgdx shader optimizationLibgdx 着色器优化
【发布时间】:2021-10-06 18:32:09
【问题描述】:

大家好使用 libgdx!

由于着色器,我在游戏中有 40 fps。这个着色器绘制背景,我想减少它处理的像素数。

在 Create 方法中,我使用 Pixmap 生成一个纹理,其宽度和高度是实际屏幕尺寸的 1/10。

pixmap = new Pixmap( (int)(Math.ceil(WIDTH/10f)), (int)(Math.ceil(HEIGHT/10f)), Pixmap.Format.RGBA8888 );
backGround = new Texture(pixmap);

然后我将 camera.zoom 设置为 0.1,因此纹理现在是全屏的。

camera.position.set( WIDTH/2f*0.1f, HEIGHT/2f*0.1f, 0);
camera.zoom = 0.1f;
camera.update();
batch.setProjectionMatrix(camera.combined);

然后 Render 方法中的着色器画了一个圆,但是该着色器处理屏幕的像素而不是纹理的像素,我得到了像以前一样漂亮流畅的画面。

Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
batch.draw(backGround,0,0);

片段着色器的代码:

vec3 yellow = vec3(0.93, 0.93, 0.32);

vec2 relativePosition = gl_FragCoord.xy / u_ScreenResolution;
relativePosition.x *= u_ScreenResolution.x / u_ScreenResolution.y;
float normDistance = pow(   (  pow(relativePosition.x - 0.3,2.0) + pow(relativePosition.y - 0.5,2.0)  ), 0.5   );
int distance = int(  round( normDistance + 0.4  )  );
gl_FragColor = vec4(vec3(0.0) + yellow*clamp(1.0-distance, 0.0, 1.0), 1.0);

不确定我是否正确地表达了这个想法,所以这是一张图片:

【问题讨论】:

    标签: android opengl-es libgdx shader textures


    【解决方案1】:

    “着色器处理屏幕的像素而不是纹理的像素”

    您有一个由像素图(分辨率较低)支持的纹理,但您没有先绘制到该较低分辨率的像素图。发生的情况是,您在屏幕上看到的内容是着色器根据-屏幕坐标-计算得出的。即你的像素图分辨率是无关紧要的,因为你得到的是由着色器计算的,而不是从像素图派生的。

    您想要的效果需要首先使用着色器绘制由像素图支持的低分辨率纹理,然后使用映射到纹理的默认着色器将 - 低分辨率渲染纹理 - 放大到屏幕。

    使用帧缓冲区,它实际上是一个屏幕,除了内存中实际上不在屏幕上,以允许 openGL 将您的低分辨率像素图视为屏幕,首先绘制到该屏幕,然后使用生成的块状纹理作为纹理以缩放到屏幕。这是

    FrameBuffer fbo = new FrameBuffer(Format.RGB888, screenwidth, screenheight, false);
    fbo.begin();
    //render here
    fbo.end();
    //grab and use as texture scaled to the full  screen
    

    这里有一个例子

    LibGDX FrameBuffer

    【讨论】:

    • 谢谢!它工作得非常好,我还添加了过滤器 texture.setFilter(Texture.TextureFilter.Nearest, Texture.TextureFilter.Nearest);所以它看起来很完美!
    猜你喜欢
    • 2017-07-03
    • 2019-03-04
    • 2019-02-17
    • 2013-09-11
    • 1970-01-01
    • 1970-01-01
    • 2011-09-19
    • 1970-01-01
    • 2018-09-27
    相关资源
    最近更新 更多