2010-04-03 12 views

Respuesta

3

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.

+0

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. –

+0

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. –

+0

¿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? –

3

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

+2

Si un gato callejero es correcto sobre GL_PIXEL_PACK_BUFFER, quizás esto debería ser editado. –

1

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

1

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).

Cuestiones relacionadas