¿Es posible representar una Vista (por ejemplo, una Vista Web) en un FBO para que pueda usarse como una textura en una composición OpenGL?¿Es posible renderizar una vista de Android a un OpenGL FBO o textura?
Respuesta
Sí es ciertamente posible, he redactado un how-to aquí; http://www.felixjones.co.uk/neo%20website/Android_View/
Sin embargo, para los elementos estáticos que no cambian, la opción de mapa de bits puede ser mejor.
Encontré que no todas las vistas se pueden dibujar. TextureView no se puede dibujar así. ¿Podrías resolverlo? – dragonfly
@fadden Si uso TextureView, encontré onSurfaceTextureAvailable de TextureView.OnFrameAvailableListener no devuelto la llamada. ¿Por qué no se dibuja TextureView así? – dragonfly
Al menos alguien se las arregló para hacer que el texto de esta manera:
Rendering Text in OpenGL on Android
En él se describe el método que utiliza para la prestación de alta calidad de texto dinámico eficiente usando OpenGL ES 1.0, con TrueType/OpenType archivos de fuentes.
[...]
Todo el proceso es realmente muy fácil. Generamos el mapa de bits (como una textura), calculamos y almacenamos el tamaño de cada personaje, así como su ubicación en la textura (coordenadas UV). Hay algunos otros detalles más finos, pero llegaremos a eso.
OpenGL ES 2.0 Versión: https://github.com/d3kod/Texample2
El proyecto de demostración completo que permite ver texturas GL en tiempo real de manera eficiente se puede encontrar en this repo. Muestra cómo renderizar WebView a textura GL en tiempo real como un ejemplo.
también un código breve para esto puede ser similar al siguiente (tomado del proyecto de demostración de la cesión temporal anterior):
public class GLWebView extends WebView {
private ViewToGLRenderer mViewToGLRenderer;
...
// drawing magic
@Override
public void draw(Canvas canvas) {
//returns canvas attached to gl texture to draw on
Canvas glAttachedCanvas = mViewToGLRenderer.onDrawViewBegin();
if(glAttachedCanvas != null) {
//translate canvas to reflect view scrolling
float xScale = glAttachedCanvas.getWidth()/(float)canvas.getWidth();
glAttachedCanvas.scale(xScale, xScale);
glAttachedCanvas.translate(-getScrollX(), -getScrollY());
//draw the view to provided canvas
super.draw(glAttachedCanvas);
}
// notify the canvas is updated
mViewToGLRenderer.onDrawViewEnd();
}
...
}
public class ViewToGLRenderer implements GLSurfaceView.Renderer{
private SurfaceTexture mSurfaceTexture;
private Surface mSurface;
private int mGlSurfaceTexture;
private Canvas mSurfaceCanvas;
...
@Override
public void onDrawFrame(GL10 gl){
synchronized (this){
// update texture
mSurfaceTexture.updateTexImage();
}
}
@Override
public void onSurfaceChanged(GL10 gl, int width, int height){
releaseSurface();
mGlSurfaceTexture = createTexture();
if (mGlSurfaceTexture > 0){
//attach the texture to a surface.
//It's a clue class for rendering an android view to gl level
mSurfaceTexture = new SurfaceTexture(mGlSurfaceTexture);
mSurfaceTexture.setDefaultBufferSize(mTextureWidth, mTextureHeight);
mSurface = new Surface(mSurfaceTexture);
}
}
public Canvas onDrawViewBegin(){
mSurfaceCanvas = null;
if (mSurface != null) {
try {
mSurfaceCanvas = mSurface.lockCanvas(null);
}catch (Exception e){
Log.e(TAG, "error while rendering view to gl: " + e);
}
}
return mSurfaceCanvas;
}
public void onDrawViewEnd(){
if(mSurfaceCanvas != null) {
mSurface.unlockCanvasAndPost(mSurfaceCanvas);
}
mSurfaceCanvas = null;
}
}
La demo de salida de pantalla:
- 1. Framebuffer FBO renderizar a textura es muy lento, con OpenGL ES 2.0 en Android, ¿por qué?
- 2. ¿Es posible adjuntar el renderbuffer predeterminado a un FBO?
- 3. Android OpenGL - ES Textura sangrando
- 4. OpenGL FBO renderbuffer o text attatchment
- 5. OpenGL: Problemas con Renderizar a Textura y Objeto Framebuffer
- 6. Android opengl textura corrupción
- 7. Renderizar a parte de la textura
- 8. Android OpenGL ES Framebuffer - Representación profundidad de búfer a la textura
- 9. Textura transparente en OpenGL ES para Android
- 10. Android Opengl-es cargando un no poder de 2 textura
- 11. libgdx SpriteBatch renderizar a la textura
- 12. Mostrar un texto como textura con OpenGL ES 2.0
- 13. OpenGL render-to-texture-via-FBO - visualización incorrecta frente a la textura normal
- 14. Representación de OpenGL ES 2.0 con una textura
- 15. OpenGL - Interpretación en una textura
- 16. ¿Cuál es la mejor manera de manejar FBO en OpenGL?
- 17. Textura de pantalla completa iPhone OpenGL ES
- 18. ¿Es posible enmascarar una vista en Android?
- 19. Android: ¿Por cuánto tiempo OpenGL almacena una textura?
- 20. ¿Cuáles son los pasos necesarios para renderizar mi escena en un objeto framebuffer (FBO) y luego renderizar ese FBO en la pantalla?
- 21. Proyectar una textura en OpenGL
- 22. cómo compartir la textura entre 2 contextos OpenGL?
- 23. Textura OpenGL Cargando
- 24. OpenGL y textura monocromática
- 25. problema al guardar OpenGL FBO mayor que la ventana
- 26. Android OpenGLES Renderizar para texturizar
- 27. Voltear la textura OpenGL
- 28. OpenGL ES renderizar para texturizar, luego dibujar texturas
- 29. Representación a una textura sin poder de encendido en iPhone
- 30. vista personalizada de transición en OpenGL ES
continuamente? ¿O como un tipo de transacción instantánea? – kabuko
@kabuko continuamente. – bobpoekert
Hasta donde yo sé, no. AFAIK lo mejor que puedes hacer es renderizar View to Bitmap y asignarlo a texturas usando GLUtils. – harism