En OpenGL, ¿hay alguna manera de usar datos de framebuffer como datos de vértice sin mover los datos a través de la CPU? Idealmente, un objeto framebuffer podría ser refundido como un objeto buffer de vértice directamente en la GPU. Me gustaría utilizar el sombreador de fragmentos para generar una malla y luego renderizar esa malla.Uso de un framebuffer como buffer de vértice sin mover los datos a la CPU
Respuesta
Hay un par de maneras que usted puede ir sobre esto, la primera ya ha sido mencionado por spudd86 (excepto que necesitas usar GL_PIXEL_PACK_BUFFER
, esa es la que está escrita por glReadPixels
).
La otra es usar un objeto framebuffer y luego leer de su textura en el sombreador de vértices, mapeando desde un id de vértice (que debería gestionar) a una ubicación de textura. Si esta es una operación de una sola vez, me gustaría copiarla a un PBO y luego vincularla al GL_ARRAY_BUFFER
y luego usarla como VBO.
Simplemente use las funciones para hacer la copia y deje que el conductor averigüe cómo hacer lo que desee, lo más probable es que con la copia directamente en el búfer de vértices no haga una copia, sino que simplemente haga su VBO una referencia a los datos.
Lo principal a tener cuidado es que algunos conductores no pueden, como el uso de algo que le dijo que era para los datos de vértice con una operación de datos de píxeles ...
Editar: probablemente algo como lo siguiente puede o puede no funcionar ... (IIRC la especificación dice que debería)
int vbo;
glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, vbo);
// use appropriate pixel formats and size
glReadPixels(0, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE, 0);
glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, 0);
glEnableClientState(GL_VERTEX_ARRAY);
glBindBufferARB(GL_ARRAY_BUFFER_ARB, vbo);
// draw stuff
Editado para corregir los enlaces de amortiguación gracias Phineas
Si un gato callejero es correcto sobre GL_PIXEL_PACK_BUFFER, quizás esto debería ser editado. –
La especificación para GL_pixel_buffer_object da un ejemplo que demuestra cómo renderizar en una matriz de vértices en "Ejemplos de uso".
Las siguientes extensiones son útiles para resolver este problema:
GL_texture_float - formatos internos de punto flotante a utilizar para la fijación buffer de color GL_color_buffer_float - Desactivar la sujeción automática para los colores de fragmentos y glReadPixels GL_pixel_buffer_object - las operaciones para la transferencia de datos de píxeles para almacenar en memoria intermedia los objetos
Si puede hacer su trabajo en un sombreado de vértices/geometría, puede usar la información de transformación para escribir directamente en un objeto de memoria intermedia. Esto también tiene la opción de omitir el rasterizador y el sombreado de fragmentos.
Transform feedback está disponible como EXT_transform_feedback o versión principal desde GL 3.0 (y el equivalente de ARB).
- 1. ¿Múltiples mallas en un buffer de vértice?
- 2. ¿Qué son los objetos de matrices vértice?
- 3. ¿Copiar datos de fstream a stringstream sin buffer?
- 4. Objeto de búfer OpenGL Vertex, ¿puedo acceder a los datos de vértice para otros usos, como la detección de colisión?
- 5. C#: Crear uso de la CPU a un porcentaje personalizado
- 6. OpenGL, cómo utilizar depthbuffer del uso de este dispositivo como buffer de profundidad habitual
- 7. Uso de memcached como buffer de base de datos para mensajes de chat
- 8. ASP.NET: Alto uso de la CPU sin carga
- 9. CPU de acelerador Uso de la aplicación
- 10. framebuffer y uso de sombreadores en opengl
- 11. Android - uso de memoria/CPU
- 12. Android Sensor Uso de la CPU
- 13. Representación de componentes Swing a un buffer sin pantalla
- 14. Cómo renderizar/dibujar objeto de búfer en framebuffer sin glDrawPixels
- 15. Cálculo del uso de CPU
- 16. buffer de anillo sin inversión de prioridad
- 17. Conseguir uso de la CPU de un proceso en C#
- 18. Cómo mover los datos espaciales de Oracle a PostgreSQL
- 19. Uso de la CPU de Jquery
- 20. Flujo máximo - a través de vértice - ¿cómo?
- 21. Cómo reducir el uso de la CPU al mover un componente en un evento OnMouseMove en Delphi 7?
- 22. monitoreo de uso de la CPU Java
- 23. Plugin de Firefox Uso de CPU
- 24. Python/PySerial y uso de CPU
- 25. El uso de std :: mover
- 26. Renderizar a framebuffer contextura o fuera de pantalla
- 27. Cómo limitar el uso de la CPU de un proceso
- 28. Cómo reducir el uso de CPU de un programa?
- 29. Acceso directo a linux framebuffer - copyarea
- 30. ARM11 Uso de la traducción Lookaside Buffer (TLB)?
Entonces, si estoy haciendo esto en cada cuadro, entonces debería ir con el segundo método (usando el framebuffer como una textura en el sombreado de vértices)? Me imagino que copiar el framebuffer a un VBO cada fotograma puede ser lento. –
Este tipo de cosas depende bastante del hardware. Podría ser que el hardware sea realmente bueno para copiar en un PBO, o tal vez el hardware no tenga tantas tuberías desde las unidades de textura hasta los sombreadores de vértices. La única forma real de saber es probar ambos y el punto de referencia. –
¿Estás seguro de que los datos no se envían a través de la CPU? ¿Este método _guarantee_ es recuperado por la GPU? –