Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





MFC en DirectX

Iniciado por Drácula, 01 de Enero de 1970, 01:00:00 AM

« anterior - próximo »

Drácula

                                Necesito tener más de un Rendering Context. En OGL esto es muy sencillo, pero en DX(como es de esperar) la cosa se complica.
¿Alguien conoce una forma sencilla de implementar varias ventanas asociadas a buffers de DX para ir renderizando a cada una por separado?
Sé que puede hacerlo cambiando el SetRenderingTarget, pero NO quiero hacerlo así. Quiero asociar un DeviceContext a un Rendering Target, así como se puede hacer en OGL.

El ejemplo perfecto sería utilizar MFC con multidocumentos!                                
ltimas mejoras en Merlín: Multitextura.Control y generación automática de LOD.Importa ASE y X. Frustum Clipping por BB.Render añadido de wireframe y del BB.Animaciones por interpolación.Animaciones de textura...
Actualmente:Octree y jerarquías

fiero

                                Hola,
Yo utilizo DirectX y MFC. Me he hecho una clase que la llamo Visor que se encarga de gestionar todas las superficies de visualización. A la hora de inicializar un objeto de esa clase, le paso un handle HWND de la ventana en la que quiero que se incruste y listo. Internamente, la clase utiliza ese handle para redimensionar las superficies de DirectX, por medio de la función  GetClientRect(HWND hWnd,LPRECT lpRect); de la API de Windows, y funciones por el estilo.

Utilizo el editor de recursos de VC para poner los controles y luego hago que cualquier control sea un visor 3D.

Ahora estoy haciendo un editor 3D y he añadido una propiedad más, la de poder cambiar el handle de la ventana de salida. Así puedo tener varias vistas simultaneas de la misma escena, cambio la cámara, cambio el handle de la ventana y renderizo...

En realidad no entiendo por qué decis que DirectX es dificil para multi-vistas (no sé si te leí a ti Drácula en un post sobre este tema). Para hacer un Flip() de las superficies de visualización en DirectX, solo se necesita saber las coordenadas de pantalla de la superficie frontal,

hRes=m_pSuperficieFrontal->Blt(lpRectanguloDestino,m_pSuperficiePosterior,NULL,DDBLT_ASYNC|DDBLT_WAIT,NULL);

...y estas coordenadas las puedes sacar de donde quieras, de un rectangulo, de un botón, del frame de una ventana hija en una aplicación MDI.... o sea, cualquier objeto CWnd vale, cualquier rectangulo puede ser un visor 3D...

si te interesa algo de código en particular para clarificar ya sabes...

un saludo
                               
www.videopanoramas.com Videopanoramas 3D player

Drácula

                                Si entiendo lo que dices, tu lo que haces es renderizas a una surface y después copias al lugar que tu necesitas. Si es así, no es esto lo que yo quiero. Yo quiero poder renderizar directamente sin tener que ir copiando, es decir, como se puede hacer en OGL.
Sé que puede hacerse utilizando CreateAdditionalSwapChain, pero no he visto ningún código.

Muchas gracias de todas formas.                                
ltimas mejoras en Merlín: Multitextura.Control y generación automática de LOD.Importa ASE y X. Frustum Clipping por BB.Render añadido de wireframe y del BB.Animaciones por interpolación.Animaciones de textura...
Actualmente:Octree y jerarquías

fiero

                                Hola otra vez,
bueno, yo en realidad utilizo la surface solo como memoria auxiliar, ya que renderizo por software con una función propia de relleno de polígonos. Utilizo doble buffer porque así el sistema se encarga de ver si hay una ventana encima del visor, etc... además la copia de superficies se hace por hardware y en pantalla completa utilizo Flip() que es mas rápido...

Oye una pregunta, eso de renderizar directamente te refieres a no usar surfaces para doble o triple buffering?... y si es así, ¿no se producen parpadeos entre imágenes?

un saludo                                
www.videopanoramas.com Videopanoramas 3D player

BeRSeRKeR

                                Hola Drácula.

Para renderizar en múltiples vistas tienes que utilizar, efectivamente, las swap chains.

Para ello espero que este http://www.mvps.org/directx/articles/rendering_to_multiple_windows.htm" target=_blank>artículo te sirva.

Un saludo

_________________
BeRSeRKeR
http://www.planetquake.com/digitalys">DiGiTALYS TEAM

[ Este Mensaje fue editado por: BeRSeRKeR el 2002-03-26 01:21 ]                                
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

Drácula

                                Genial esta dirección Berserker, no la conocía!!

Gracias a todos por la ayuda, desde luego este foro..¡funciona!                                
ltimas mejoras en Merlín: Multitextura.Control y generación automática de LOD.Importa ASE y X. Frustum Clipping por BB.Render añadido de wireframe y del BB.Animaciones por interpolación.Animaciones de textura...
Actualmente:Octree y jerarquías

efreet

                                Hay un modo muy sencillo de renderizar varias vistas en la misma pantalla ,sin tener que copiar surfaces y sin MFC´s

El pseudocodigo seria algo así:

D3DVIEWPORT8 Vista1= {0,0,100,100};
D3DVIEWPORT8 Vista2= {100,0,100,100};

Device->SetViewport(&Vista1);
Device->SetTrasform(MatrizVista1);

RenderizarEscena(...);

Device->SetViewport(&Vista2);
Device->SetTrasform(MatrizVista1);

RenderizarEscena(...);

Solo tienes que cambiar los valores del viewport con los valores de las vistas que quieres renderizar y ya está.


No se si esto es lo que querias ,
espero haberte ayudado.

Un saludo.
Efreet


                               

Drácula

                                No es esto exactamente. Yo lo que quiero es tener una Surface diferente para cada ventana. Lo que tu dices sólo funciona EN LA MISMA ventana.                                
ltimas mejoras en Merlín: Multitextura.Control y generación automática de LOD.Importa ASE y X. Frustum Clipping por BB.Render añadido de wireframe y del BB.Animaciones por interpolación.Animaciones de textura...
Actualmente:Octree y jerarquías

fiero

                                Yo pienso que no se pierde nada usando la función Blt. En realidad es la única forma de renderizar algo cuando no se está en modo pantalla completa. La copia de surfaces se realiza por hardware desde las antiguas S3 Virge, Revolution 3D, etc. y no digamos en las nuevas tarjetas, por lo tanto el consumo de tiempo no es apreciable...(se nota, pero no hay mas remedio)

La función Present() de DirectX 8 no es mas que la función Flip() de las anteriores versiones, cuando se está en pantalla completa, y la función Blt cuando se está en modo ventana, por tanto siempre se realizan copias de surfaces. Por lo que tengo entendido sobre el funcionamiento de las aceleradoras, siempre renderizan en un área rectangular, y luego es la función de copia de surfaces la que se encarga de recortar los trozos que no se ven (fuera de pantalla o debajo de otras ventanas...), por tanto la copia es inevitable...

por favor, decidme si he dicho alguna burrada muy gorda :riendo:

un saludo                                
www.videopanoramas.com Videopanoramas 3D player

Drácula

                                No has dicho ninguna burrada. Pero no es lo mismo renderizar directamente que hacer un Blt. Digamos que se parece mucho...¡pero no lo es! A fin de cuentas, es cuestión de tiempo, pero...¡es que los juegos dependen mucho del tiempo!                                
ltimas mejoras en Merlín: Multitextura.Control y generación automática de LOD.Importa ASE y X. Frustum Clipping por BB.Render añadido de wireframe y del BB.Animaciones por interpolación.Animaciones de textura...
Actualmente:Octree y jerarquías






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.