Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Menu

Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menu

Mensajes - fiero

#46
El motor 3D es el plugin para visualización de fotografias panorámicas de mi empresa www.devalvr.com . Básicamente es solo un renderizador de triángulos, no tiene ninguna de las otras cosas que debería tener un motor 3D, pero por lo menos me da una compatibilidad hacia atrás, de tal manera que el visor funciona en un WindowsNT 4 sin DirectX.

Ahora estoy añadiendo DX9 y OpenGL, para seguir avanzando en cosas que requieren más velocidad de render.

saludos!
#47
Si que funciona!!!!!!  :D  ¡¡Gracias senior wapo!!

Ayer estube buscando en las MSDN y en google por "reservar segmento de código" "reservar memoria para ejecución de código", y cosas parecidas, tambien en inglés, y no conseguí encontrar la función VirtualProtect (y eso que está en el grupo de funciones tan conocidas como ZeroMemory).

Funciona perfecto con el DEP activado en XP, voy a probar en Vista, pero me parece que no abrá problemas.

Lo dicho, muchas gracias!  :D
#48
Hombre, ya sé que suena guarro, "generar código en un buffer y ejecutarlo", pero nunca ningún antivirus dijo nada todos estos años.

En fin, voy a cambiarlo todo por llamadas a pequeñas rutinas a ver si no baja mucho el rendimiento.

un saludo
#49
Hola guys,

Problema:
Me he dado cuenta de que mi programa no es compatible con DEP. Para el que no lo sepa DEP es una función que viene con XP SP2 y Vista que previene la ejecución de código en segmentos de memoria de datos. Esto es muy bueno para evitar la ejecución de la mayoría de virus, ya que casi todos utilizan bugs de desbordamiento de buffers y cosas así para ejecutar "código malicioso" (como lo llaman los entendidos)

Antecedentes:
Resulta que mi programa es un motor 3D por software, y en el núcleo del motor lo que hago es generar el código de pintado de triángulos de forma dinámica, es decir, construyo el bucle en un buffer de memoria de datos, añadiendo cada instrucción en ensamblador y luego lo ejecuto. Esto es hiper-rapido y además es muy facil de mantener. Esto lo hago así porque el numero de opciones que puede tener el bucle es enorme, que si con/sin Z buffer, con/sin bilinear, con/sin antialiasing, con/sin blending, con/sin iluminacion, etc. etc., además a cada una de estas opciones hay que añadir que la textura sea de 8, 15, 16, 24 o 32 bits, y que el buffer de pantalla sea de 8, 15, 16, 24 o 32 bits, con lo cual, el bucle interno de pintado de triángulos se llena de "cases" y/o de "if". Teniendo en cuenta que todas estas bifurcaciones se ejecutan al renderizar cada pixel, el rendimiento global del motor se puede ir al carajo.

Solución:
La solución podria ser reservar memoria de programa en tiempo de ejecución (no de datos). He buscado, pero no encuentro nada.

¿Alguien que sepa algo de esto? ¿O quizás no es posible?

Muchas gracias!
#50
Off-topic / Elton John quiere cerrar internet
03 de Agosto de 2007, 02:24:25 PM
Yo tengo ahora un bug en el programa... creo que la causa es la pirateria.

Ah!, y me ha salido una berruga en la axila.. creo que la causa es la piratería.

un saludo
#51
Programación gráfica / Sprites 2D con DX9
27 de Julio de 2007, 03:19:50 PM
Sí, al final he solucionado el problema restando y sumando unos offsets al quad. Con la matriz ortogonal que utilizo no le desplazo siempre ese -0.5 (solo cuando el tamaño del viewpor es impar), aunque tengo que probar en más tarjetas a ver que pasa, hasta ahora parece que se ve perfecto.

Gracias! un saludo
#52
Programación gráfica / Sprites 2D con DX9
27 de Julio de 2007, 01:45:47 AM
Hola Loover,

Me ha llamado la atención ese "near Z" que pones para crear la matriz ortogonal, con -2048. ¿El 0 no está en la cámara? ¿Entonces el Z cercano lo pones detras de la camara?

un saludo y gracias!
#53
Programación gráfica / Sprites 2D con DX9
25 de Julio de 2007, 12:44:41 PM
No, yo uso D3DFVF_XYZ, pero no uso vertex shaders. Habia hablado de D3DFVF_XYZRHW, pero solo en el caso de que no consiguiera hacerlo funcionar.

El vertice inferior derecho sería:

   vertice_inferior_derecho.x= vertice.x + tx;
   vertice_inferior_derecho.y= vertice.y + ty;
   vertice_inferior_derecho.z= 1.0;

Si utilizas coordenadas en clipspace tendrás que jugar sumando o restando ese medio pixel creo yo. Contando con que
medio pixel en coordenadas de clip space = (2.0 / widthPixelsViewport) *0.5

Ya nos contarás!
#54
Programación gráfica / Sprites 2D con DX9
25 de Julio de 2007, 10:54:03 AM
Cita de: "XÑA"¿Entonces al final como te queda tu matriz?

Como puse al principio. Las dos lineas anteriores no formaban parte de mi función D3DXMatrixOrthoLH, así que no me dí cuenta de ponerlas cuando inicié el post. Mi matriz queda así:

   D3DXMATRIX matriz;
   float zn=0.0, zf=100000.0;
   int w;   //El ancho de la ventana
   int h;   //El alto de la ventana

   ZeroMemory(&matriz,sizeof(D3DXMATRIX));
   matriz._11=2.0/w;
   matriz._22=2.0/h;
   matriz._33=1.0/(zf-zn);
   matriz._34=zn/(zn-zf);
   matriz._44=1.0;


Despues en la función de imprimir el sprite, creo el primer vertice del quad (superior izquierdo) en:

   int posx;           //Posixion del sprite en la pantalla
   int posy;
   int tx;               //Tamaño de la imagen 2D
   int ty;

   offx= w /2 + (w&1);
   offy= h /2 + (h&1);
   vertice.x= posx + (tx/2) - offx;
   vertice.y= -posy - (ty/2) + offy;
   vertice.z= 1.0;


un saludo
#55
Programación gráfica / Sprites 2D con DX9
24 de Julio de 2007, 05:59:42 PM
Hi all,

Cita de: "[EX3"]Hombre, visto asi... aceptamos barco :)

Es que estoy mu extresao y parece que respondo siempre defendiendome ;), (menudo rollo he soltao como para no aceptarme barco como animal marino...)

Si XÑA, eso era. Lo que yo hacia para desplazar todo a la esquina superior izquierda era:

matProjectionOrto._31=-1;
matProjectionOrto._32=1;

Con esto se consigue que el 0,0 sea la esquina superior izquierda, pero si el viewport tiene un numero impar de pixels, el 0,0 cae justo en medio de un pixel. Por lo visto no todas las tarjetas funcionan igual al asignar ese medio pixel a uno o a otro, sobre todo hay diferencias entre ATI y nVidia (como no).

Ahora lo que hago es restarle al quad un offset que es el numero de pixels del viewport/2 (+ 1 si el tamaño del viewpor es impar) y parece que funciona bien.

un saludo
#56
Programación gráfica / Sprites 2D con DX9
23 de Julio de 2007, 11:24:02 PM
Cita de: "[EX3"] Prueba y echa un vistazo, la razon de los 200kb de mas por la libreria extra a añadir al plugin hoy dia no le veo mucho sentido ;)

Ahora mismo se descargan el plugin 75000 personas al mes, y el plugin son unos 280KB, esto hacen un total de 21GB de transferencia mensual. Ahora mismo las descargas aumentan a razón de unas 5000 al mes, pero creo que puede llegar un momento que se produzca una repentina subida, (sobre todo si páginas con muchos usuarios se deciden a usarlo). Los últimos años de desarrollo me he cuidado mucho de hacer todo por mi cuenta y no meter librerías, quizás me hubiera ahorrado unos meses de trabajo, pero el plugin tendría ahora más de 1 ó 2 MB seguramente.Mi idea es que el plugin se extienda cada vez más, y los 250KB de tamaño son un buen reclamo.

Quizás me he vuelto demasiado quisquilloso con los años, pero creo que en este caso, el tamaño importa ;)

Acerca de los fallos de los sprites creo que he encontrado el problema, luego lo explico, tengo que ver si me hacen unas pruebas más.

un saludo
#57
Programación gráfica / Sprites 2D con DX9
21 de Julio de 2007, 01:54:57 AM
Yo utilizo tambien uso indistintamente DrawIndexedPrimitive o DrawIndexedPrimitiveUP y dibujo cada quad por separado. Seguramente utilizarás vertices ya transformados, por eso te da igual que matriz de proyección haya. Creo que voy a pelearme con esto de los vertices transformados, quizás sea la solución, ya que si las coordenadas de pantalla las creo yo, estoy seguro de que son las mismas en todas las tarjetas. Me refiero a usar D3DFVF_XYZRHW en el FVF.

Lo de utilizar ID3DXSprite no me gusta, ya que tendria que meter la librería de DX9 "d3dx9.lib" y eso aumenta 100 o 200 KB el tamaño total del plugin. Además, prefiero tener el control de todo lo que pasa, es decir, yo ahora mismo divido las imagenes en trozos de 256x256, que cargo en memoria de sistema, a memoria de video solo subo los cachos que realmente se ven y en cuanto dejan de verse los descargo, etc. Creo que controlar todo esto a mi gusto con ID3DXSprite me llevaría mas tiempo.

gracias!
#58
Programación gráfica / Sprites 2D con DX9
20 de Julio de 2007, 11:21:24 PM
Para almacenar la imagen utilizo el tamaño potencia de 2 más cercano (por encima) al tamaño real de la imagen. Después al crear el quad, las coordenadas U y V las calculo en función al trozo de la textura que compone la imagen. Por ejemplo, si mi imagen mide 50 pixeles de ancho, la meto en una textura de 64, pero le pongo U=0.78125 en los vertices del quad.

¿Qué función utilizas para renderizar los quads? ¿Vertices transformados?
#59
Programación gráfica / Sprites 2D con DX9
20 de Julio de 2007, 08:34:05 PM
Hola, gracias por las respuestas!

Topper, el modo CLAMP es el que tengo por defecto, pero en este caso creo que el problema es más de posicionamiento de vertices.

marmocle, ¿a que te refieres con "client rect"? ¿al tamaño de la ventana de renderización? Si es eso, es lo que tengo ahora, el tamaño del viewport es el mismo que el de la ventana de render. Lo del filtrado bilinear queda un poco "sucio" para este tipo de imagenes, ya que por ejemplo, las lineas de un pixel se difuminan y casi desaparecen, dando una sensación de desenfoque o de falta de nitidez.

Lo que no entiendo es porqué si para una imagen de 50x50 pixels, creo un quad de 50x50 y en algunas tarjetas gráficas se vé de 51x51 pixels. Es cierto que este fallo depende mucho de la posicion del quad dentro de del viewport, y de las dimensiones del viewport, pero con la configuración actual, en mi ATI se ve perfecto en cualquier tamaño de ventana (mi visor tiene una pestaña para cambiar el tamaño rapidamente). Sin embargo en otras tarjetas se ve mal a cualquier tamaño de ventana  :?
#60
Programación gráfica / Sprites 2D con DX9
20 de Julio de 2007, 02:08:14 AM
Hola a todos,

Ya sé que este es un tema ya muy trillado, pero por más que busco aquí y por Internet no consigo encontrar una solución.

He implementado unas funciónes para renderizado de sprites 2D con DirectX9, y mi problema es que con algunas tarjetas gráficas los quads se ven mal. Es decir, los 4 vértices que forman el quad se desalinean o desplazan 1 pixel y hacen que la imagen se estire o se distorsione, lo cual me da a entender que es un problema de perspectiva, pero no sé por que funciona de forma diferente en cada tarjeta.

Utilizo una proyección ortogonal, la matriz de proyección la creo con D3DXMatrixOrthoLH, que exactamente hace esto:

  D3DXMATRIX matriz;
   float zn=0.0, zf=100000.0;
   w=800; //El ancho de la ventana
   h=600; //El alto de la ventana

   ZeroMemory(&matriz,sizeof(D3DXMATRIX));
   matriz._11=2.0/w;
   matriz._22=2.0/h;
   matriz._33=1.0/(zf-zn);
   matriz._34=zn/(zn-zf);
   matriz._44=1.0;


La matriz de objeto y de camara son la matriz identidad, y luego creo un rectangulo formado por dos triangulos delante de la camara, y con Z=1.0. Las coordenadas X e Y del quad tienen las mismas proporciones que las dimensiones de la imagen que quiero colocar en la pantalla 1:1.

Antes usaba para la matriz de proyección los valores zn=1.0 y zf=10000.0 y según donde estuviera el quad tambien con mi tarjeta se estiraba un pixel. Con los valores actuales (los del código anterior) no tengo problemas.
He probado la opcion D3DRS_LASTPIXEL del device, pero no es eso.

El problema es que con mi Radeon X1600 lo veo todo perfecto y no puedo debugear, pero este es el resultado que se obtiene en algunas tarjetas:

(Aquí la barra de arriba son 9 botones como se deberian ver)


(En medio de esta imagen se puede ver como se estira el quad, por lo que el texto se ve mal)


Si quereis ver la imagen anterior en vivo y en directo, podeis instalar la version BETA de mi visor aquí http://www.devalvr.com/install/beta (Es un plugin para el navegador, esto es una instalador de 280K) y luego acceder a esta pagina http://www.lesarcs.com/visite_360/anglais/visites_HIGH/index.html?visite=visite11 (Ojo, es una beta, cerrad todos los programas antes de probar)

¿Alguien se ha encontrado con este problema? ¿Como puedo solucionarlo?

Gracias!





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.