Libgdx 着色器优化

时间:2021-07-31 16:46:47

标签: android opengl-es libgdx shader textures

大家好,使用 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);

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

image i drawn

1 个答案:

答案 0 :(得分:0)

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

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

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

使用帧缓冲区,它实际上是一个屏幕,除了在内存中实际上不在屏幕上,允许 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