2014-01-15 39 views
1

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

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

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() { 
    } 
} 
+0

你可以绘制图像,然后访问图像中的像素? –

+0

这将是理想的解决方案,但是如何将3D绘制到libGDX中的图像?我应该画一个ModelBatch,将其转换为图像,然后用SpriteBatch绘制它,但我不知道如何做到这一点。我尝试过很多方法,但都没有成功。我错过了什么? – Finnboy11

+0

我只是把想法抛出去,但必须有一种方法。毕竟,你正在渲染2D缓冲区(屏幕),对吧?我不知道如何从头到尾做,但渲染图像/纹理可能是一个开始搜索libGDX文档和论坛的地方。 –

回答

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 )。您可以获得Pixmap或原始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)))。

+0

因此,我应该在'fbo.begin()'和'fbo.end()'之间使用'batch.render(instance);'而且,我没有ScreenUtils.getFrameBufferPixmap函数。太旧的LibGDX版本? – Finnboy11

+0

是的,在'fbo'中渲染你的批处理。 'getFrameBufferPixmap'是一个简单的包装,所以你可以重新实现它,如果你不想升级:https://github.com/libgdx/libgdx/commit/1f5d9e98f65e9b91656bf1f0010f61de76b2eb31 –

+0

非常感谢。将尝试在某个时刻,并报告任何结果。 – Finnboy11