2010-02-28 17 views
12

Parece que GL se ha generalizado para todas las plataformas de juego (¡incluso para dispositivos de mano!) Esto ha impulsado la implementación de conjuntos de chips de GPU modernos para un gran número de consumidores.¿Es posible hacer 2d blitting de la vieja escuela en la GPU moderna?

Esto es asombroso.

Con los sistemas de GPU modernos que existen ahora, ¿es posible hacer programación genérica de la vieja escuela programación (también conocida como blit de X rect a Y rect usando VRAM)? (Piensa en Amiga) ¿O están las operaciones centradas en alrededor de los sombreadores de vértices y píxeles?

¿Es esto accesible desde GL? OpenGL ES?

La representación de un cuadrante texturizado está bien, pero requeriría doble almacenamiento en búfer y una nueva representación de toda la escena. Estaba viendo si podía evitar esto.

+0

tengo casi nula experiencia en esta área, por lo que este puede ser una sugerencia estúpida, pero si los gráficos 3D son rápidos y necesitas gráficos 2D, ¿no puedes simplemente usar capacidades 3D pero mantener Z = 0 y solo dejar que X e Y varíen? –

+0

NUNCA podrá hacer nada más rápido en su propio código que se puede hacer en hardware 3D, usted está perdiendo el tiempo en la optimización prematura. –

+0

@Earwicker, eso es lo que sugieren algunas de las respuestas ... – Earlz

Respuesta

7

Comprueba la rutina BlitFramebuffer (Framebuffer Object). Necesita un controlador actualizado.

Tenga en cuenta que puede usar el framebuffer predeterminado, pero creo que será más divertido usar objetos framebuffer.

Mantenga su sprite en frambuffers separados (tal vez representados con OpenGL), y configúrelos como leídos (usando glReadBuffers) y blitelos en el framebuffer de draw (usando glDrawBuffers). Es bastante simple y rápido.

2

Bueno, puede usar libSDL y obtener un puntero al framebuffer de la pantalla y hacer lo que quiera con los píxeles. O puede hacer todo el dibujo en un búfer de memoria, cargar hasta una textura GL y dibujar cuadrículas con textura, que probablemente sea más rápido debido a la aceleración del hardware.

+0

No quiero un framebuffer, puntero, quiero usar código en una GPU para hacerlo todo. – drudru

+0

@drudru, ¿has oído hablar de OpenCL? Creo que tiene algo que ver con la ejecución de código arbitrario en ciertas GPU Nvidia – Earlz

+0

@Earls - sí, ese podría ser el ticket. Esperaba que alguien de ese campamento pudiera entrar. – drudru

1

En algunos sistemas incorporados, es posible obtener un puntero de framebuffer y escribirlo directamente, pero en estos días es mejor utilizar OpenGL | ES y renderizar una textura. Será más portátil, y probablemente más rápido.

Puede crear un búfer en la memoria principal, hacer todos los giros que desee y luego renderizarlo como una textura. Puede DMA sus datos de textura a VRAM para la velocidad, y luego renderizarlos en un quad, que es equivalente a un blit, pero no utiliza ningún ciclo de CPU y se ejecuta tan rápido como la GPU puede procesar.

Es sorprendente lo que puede hacer con sombreadores y tuberías programables en estos días.

+0

No quiero un framebuffer, puntero, quiero usar código en una GPU para hacerlo todo. – drudru

+1

Bien, eche un vistazo a la [técnica de renderizar a textura] (http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=36). Usas sombreadores para renderizar lo que quieras con una textura, y luego dibujas esa textura usando un cuadrante, que lo ajustará a la pantalla. También puede elegir entre una variedad de ROP, según los parámetros de textura y los modos de fusión. – gavinb

+0

bien, voy a echar un vistazo – drudru

1

Si está dibujando cuadrículas con textura, con las que puede simular fácilmente el blitting de la "vieja escuela", entonces los píxeles se copian de la memoria de video mediante la GPU. También tenga en cuenta que aunque las operaciones de mapa de bits son posibles en OpenGL, pueden ser extremadamente lentas porque la ruta 3D está optimizada en tarjetas de video de grado de consumo, mientras que las rutas 2D no lo son.

+0

¿cómo evita esto hacer una actualización de cuadro completo? – drudru

+0

La reproducción de cuadrantes tiene poco que ver con el doble almacenamiento en búfer. Puede usar un único búfer si así es como se supone que deben hacerse las cosas en el dispositivo de destino. Sin embargo, si todo el fotograma cambia, tendrás que actualizar todo de todos modos. – atis

+0

cierto, pero para mi aplicación, el 90% de las operaciones son de desplazamiento. En el hardware de la vieja escuela, esto solo sería una cuestión de mover el puntero VRAM de hardware a una nueva ubicación con un módulo preestablecido. Un blitz rápido también haría el truco. En mi aplicación, puedo evitar un redibujado completo. Sin embargo, por su respuesta. – drudru

0

Además, glCopyPixels parece ser el truco si tiene el entorno configurado correctamente.

0

En Windows, puede utilizar las funciones de copia de mapa de bits de nivel bajo, que coinciden con la vieja descripción precisa sin ningún tipo de OpenGL, etc.

BOOL BitBlt(
    _In_ HDC hdcDest, 
    _In_ int nXDest, 
    _In_ int nYDest, 
    _In_ int nWidth, 
    _In_ int nHeight, 
    _In_ HDC hdcSrc, 
    _In_ int nXSrc, 
    _In_ int nYSrc, 
    _In_ DWORD dwRop 
); 

https://msdn.microsoft.com/en-us/library/dd183370%28v=vs.85%29.aspx

Cuestiones relacionadas