Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Escenarios Grandes

Iniciado por sés, 07 de Abril de 2004, 12:13:16 PM

« anterior - próximo »

Lord Trancos 2

 
Cita de: "sés"¿Alguien sabe por qué no me funciona esto?: SDL_GL_SetAttribute( SDL_GL_DEPTH_SIZE, 32 );

El código es el siguiente:
SDL_Init( SDL_INIT_VIDEO );
SDL_GL_SetAttribute( SDL_GL_DEPTH_SIZE, 32 );
SDL_SetVideoMode( 800, 600, 32, SDL_OPENGL | SDL_HWSURFACE );


Mi tarjeta es una ATI Radeon 9600 Pro.


P.D.: Tampoco me deja cambiarlo a 16, siempre está en 24.
No me hagas mucho caso, pero si no recuerdo mal SDL o OpenGL (no recuerdo de quien era la "culpa") toman ese tipo de valores a modo de "sugerencia". Osea que aunque tu le digas un z-buffer de 16 bits igual te lo ponen de 24....

por cierto, con 24 bits deberias de tener de sobra :P
on los años y mucho esfuerzo he llegado a atesorar una ignorancia total sobre casi todas las cosas.
Gate to Avalon (mi Blog)

sés

 
Cita de: "Lord Trancos 2"por cierto, con 24 bits deberias de tener de sobra :P
Pues parece que no <_<
Soy indeciso... ¿o no?

Lord Trancos 2

 Pues algo debes de estar haciendo mal...  :(

Entiendo que tuvieras problemas con esas distancias y un Z-buffer de 16,... pero con uno de 24.... <_<

Por cierto, yo de ti añadiria los flags SDL_HWACCEL y SDL_DOUBLEBUF al iniciar OpenGL:



SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);

SDL_SetVideoMode(C_VIDEO_WIDTH, C_VIDEO_HEIGHT, 32,
                               SDL_HWACCEL | SDL_HWSURFACE |
                               SDL_OPENGL | SDL_DOUBLEBUF)



Y volviendo al z-buffer....
- que valor le pasas a  glClearDepth ?
- llamas a glEnable(GL_DEPTH_TEST) ?
- y a glDepthFunc(GL_LEQUAL) ?


on los años y mucho esfuerzo he llegado a atesorar una ignorancia total sobre casi todas las cosas.
Gate to Avalon (mi Blog)

sés

 
Cita de: "Lord Trancos 2"Pues algo debes de estar haciendo mal...  :(
Ya... :(

Cita de: "Lord Trancos 2"Por cierto, yo de ti añadiria los flags SDL_HWACCEL y SDL_DOUBLEBUF al iniciar OpenGL:
Añadidos, pero sigue igual.


Cita de: "Lord Trancos 2"- que valor le pasas a  glClearDepth ?
1.0

Cita de: "Lord Trancos 2"- llamas a glEnable(GL_DEPTH_TEST) ?
- y a glDepthFunc(GL_LEQUAL) ?
Soy indeciso... ¿o no?

Loover

 ¿Resolviste el problema al final?
Prueba a colgar el código a ver si alguien ve el error así.

Por cierto Shas, Sés es de la vieja escuela.
IndieLib Libreria 2.5d utilizando aceleración por hardware para la programación de juegos 2d.
Indie Rover The monkeys are reading!

sés

 Aun no, dejé esa parte a un lado para hacer el plugin para exportar y últimamente no he tenido mucho tiempo.

Cuando encuentre algo lo pondré por aquí.
Soy indeciso... ¿o no?

Thenend

 sés, has visto este artículo?

http://www.gamasutra.com/features/20020712...12/oneil_01.htm

igual te sirve o te da alguna idea.

sés

 Por fín.

Resulta que lo que quiero visualizar, además de ser grande (unos 5Km), tiene coordenadas grandes. Vamos, que las coordenadas de la cámara tienen 7 cifras ^_^

He trasladado todo para que la cámara esté inicialmente en 0,0,0 y todo funciona.

No sé... supongo que es una chorrada, pero no se me pasó por la cabeza que afectara. Siempre creí que el Z-Buffer funcionaba con las distancias de los polígonos respecto a la cámara, no sabía que le afectaran las coordenadas absolutas de los polígonos.
Soy indeciso... ¿o no?

Thenend

 En el artículo ese dice:

CitarThe problem with the traditional model and view matrices in the test case outlined above is that both have a very large translation in the X direction. A 32-bit float starts to lose precision around 1000 km, and Earth's orbit is around 149,600,000 km. Even though the camera is close to the planet and the numbers should cancel each other out, too much precision is lost during the calculations to make the resulting matrix accurate.

Es decir que el problema no es del z-buffer, es de la precision de los floats que, cuanto mas pequeños mas precisos pero llegando a números de 7 cifras como los tuyos comienzan a perder precision. Si encima multiplicamos esos números unos por otros (vertices por matrices) ocurren cosas como que todos los vertices entre 5.000.000 y 5.000.002 (por decir algo) acaban siendo calculados como 5.000.001. Si en vez de trabajar con numeros tan grandes, restas de manera que las multiplicaciones a la hora de transformar los vértices se hagan con numeros mas pequeñitos tendrás resultados mas exactos.

Igual era ese tu problema ¿no?

sés

 Sí, eso parece, pero no pensé que perdiera tanta precisión.
Al fin y al cabo, las distancias son las mismas. No veo mucha diferencia a dibujar entre 0 y 1000 que entre 1000000 y 1001000.

Y vamos, que 1000000 tampoco me parece un número tan grande.

Por cierto, también probé a utilizar doubles y no noté ningún cambio. ¿No se supone que eso debería hacer algo?

Bueno, como ya dije, estoy pez en todo lo de 3D, así que...
Soy indeciso... ¿o no?

Thenend

 Pues no se, igual lo que está creando confusión es que tu problema no era uno sino dos. El de los floats y el del z-buffer.

Cuando usas un near plane muy cercano a la cámara, por cosas de la perspectiva, tienes una gran precision en los objetos mas cercanos pero una precisión muy mala en los lejanos. Si alejas un poco el plano (una pequeña variación afecta mucho), la precisión se distribuye mas homogeneamente. Hay un link unos mensajes mas arriba en el que puedes esperimentar con valores y comprobar esto. Así que intenta usar siempre un near plane lo mas alejado posible.

Aunque uses doubles para almacenar las coordenadas, al meterlas en las matrices se convierten en floats y el problema vuelve otra vez, a no ser que uses tus propias matrices y lo hagas por software o te inventes un vertex shader que use doubles  :blink:  . Vamos, que solo te solucionan los problemas que tengas fuera de la pipeline (¿como se dice esto en castellano? ¿tubería?)

Mira, aquí hay un applet que calcula la representación de un float. Prueba valores de 7 cifras y modifica los decimales, verás que algunos números como 1000000.04 y 1000000.09 se representan igual, es decir en valores del orden del millon la resolución es mas o menos de 0.05 y con 3000000 y 3000000.12 pasa lo mismo, la resolucion en esos números es de 0.12 metros. Cuando llegas a los 5 millones tienes medio metro de imprecisión.

sés

 
Cita de: "Thenend"Prueba valores de 7 cifras y modifica los decimales, verás que algunos números como 1000000.04 y 1000000.09 se representan igual, es decir en valores del orden del millon la resolución es mas o menos de 0.05 y con 3000000 y 3000000.12 pasa lo mismo, la resolucion en esos números es de 0.12 metros. Cuando llegas a los 5 millones tienes medio metro de imprecisión.
Ya, pero repito que las diferencias en mis unidades nunca eran menor de 1 metro (1 unidad), la mayoría con separaciones de varias unidades. Digo yo, que por mucha precisión que perdiera... no sé, no se me ocurrió... hasta ayer, claro :P  
Soy indeciso... ¿o no?

Thenend

 Claro, pero es que al multiplicar por la matriz del mundo, de la camara, la de proyección... todo eso con numeros que no son exactos aunque sea por un decimal, terminas teniendo resultados que son inexactos por varios metros. A mi me ocurrió una vez que lo puse todo en centímetros, los polígonos bailaban que parecía aquello una discoteca  :P  






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.