1

我正在编写一个用 ASCII 艺术绘制的 3D 游戏,只是为了获得一种特殊的外观。我将模型渲染为 ModelBatch,现在我想在将最终结果绘制到屏幕之前将每个像素转换为 ASCII 符号。我已经有了将像素转换为 ASCII 的代码,但我不知道如何获取渲染结果的像素。

到目前为止的代码(不包括 ASCII 转换):

import com.badlogic.gdx.ApplicationListener;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.GL10;
import com.badlogic.gdx.graphics.PerspectiveCamera;
import com.badlogic.gdx.graphics.VertexAttributes.Usage;
import com.badlogic.gdx.graphics.g3d.Model;
import com.badlogic.gdx.graphics.g3d.ModelBatch;
import com.badlogic.gdx.graphics.g3d.ModelInstance;
import com.badlogic.gdx.graphics.g3d.materials.ColorAttribute;
import com.badlogic.gdx.graphics.g3d.materials.Material;
import com.badlogic.gdx.graphics.g3d.utils.ModelBuilder;

public class MyGame implements ApplicationListener {
    private PerspectiveCamera cam;
    private ModelBatch batch;

    public Model model;
    public ModelInstance instance;

    @Override
    public void create() {      
        //float w = Gdx.graphics.getWidth();
        //float h = Gdx.graphics.getHeight();

        cam = new PerspectiveCamera(67, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
        cam.position.set(10f, 10f, 10f);
        cam.lookAt(0,0,0);
        cam.near = 0.1f;
        cam.far = 300f;
        cam.update();

        batch = new ModelBatch();

        ModelBuilder modelBuilder = new ModelBuilder();
        model = modelBuilder.createBox(5f, 5f, 5f,
            new Material(ColorAttribute.createDiffuse(Color.GREEN)),
            Usage.Position | Usage.Normal);
        instance = new ModelInstance(model);
    }

    @Override
    public void dispose() {
        batch.dispose();
        model.dispose();
    }

    @Override
    public void render() {      
        Gdx.gl.glViewport(0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
        Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);

        batch.begin(cam);
        batch.render(instance);
        batch.end();
    }

    @Override
    public void resize(int width, int height) {
    }

    @Override
    public void pause() {
    }

    @Override
    public void resume() {
    }
}
4

1 回答 1

1

我认为您想渲染为纹理,将纹理转换为像素图,然后解析像素图以将 ASCII 字符绘制到真实屏幕上。

首先,要在 LibGDX 中渲染到纹理(屏幕外缓冲区),请使用FrameBufferObject

fbo = new FrameBuffer();
fbo.begin();
// draw your stuff
// ...
fbo.end();

其次,要获取 CPU 可以使用的字节,您可以使用 [ScreenUtils类]( http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/utils/ScreenUtils.html )。您可以得到 aPixmap或 raw byte[]。例如,将// ...上面的内容替换为:

Pixmap p = ScreenUtils.getFrameBufferPixmap(0, 0, width, height);

现在您可以在像素图上漫游,检查像素(使用 [ Pixmap.getPixel]( http://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/graphics/Pixmap.html#getPixel(int , int)) )。

于 2014-01-16T05:59:39.680 回答