2014-01-15 7 views
1

Я пишу 3D-игру, которая нарисована с помощью искусства ASCII, чтобы добиться особого вида. Я переношу свои модели в ModelBatch, и теперь я хотел бы преобразовать каждый пиксель в символ ASCII, прежде чем рисовать конечный результат на экране. У меня уже есть код для преобразования пикселей в ASCII, но я не знаю, как получить пиксели результата рендеринга.LibGDX - изменить пиксели после рендеринга 3D-сцены

код до сих пор (не включая 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() { 
    } 
} 
+0

Можете ли вы нарисовать изображение, а затем получить доступ к пикселям изображения? –

+0

Это было бы идеальным решением, но как вы рисуете 3D-изображение в libGDX? Я должен, вероятно, обратить на ModelBatch, преобразовать его в изображение и затем нарисовать его с помощью SpriteBatch, но я точно не знаю, как это сделать. Я пробовал много способов, ни одна из которых не удалась. Я что-то пропустил? – Finnboy11

+0

Я просто бросаю идеи, но должен быть способ. В конце концов, вы оказываете 2D-буфер (экран), правильно? Я не знаю, как это сделать с моей головы, но рендеринг изображения/текстуры может стать местом для начала работы с документацией и форумами libGDX. –

ответ

1

Я думаю, что вы хотите сделать в текстуру, конвертировать текстуру в растровом изображении, а затем разобрать растровое изображение, чтобы нарисовать свои символы ASCII в реальный экран.

Во-первых, оказывать текстуры (закадровый буфер) в LibGDX, используйте FrameBufferObject:

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

Во-вторых, чтобы получить байт, которые могут использовать процессор, вы можете использовать [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, целое))).

+0

Итак, я должен использовать 'batch.render (instance);' между 'fbo.begin()' и 'fbo.end()'? Более того, у меня нет функции ScreenUtils.getFrameBufferPixmap. Слишком старая версия LibGDX? – Finnboy11

+0

Да, сделайте свою партию внутри 'fbo'. 'getFrameBufferPixmap' - простая оболочка, поэтому вы можете повторно ее реализовать, если вы не хотите обновлять: https://github.com/libgdx/libgdx/commit/1f5d9e98f65e9b91656bf1f0010f61de76b2eb31 –

+0

Большое спасибо. Попробуем в какой-то момент и сообщим о любых результатах. – Finnboy11

Смежные вопросы