Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





opengl- Acabo de implementar reflejos y todo se volvio lento

Iniciado por xeex, 23 de Mayo de 2007, 08:05:56 PM

« anterior - próximo »

xeex

hola
ayudenme por favor
Implemente reflejos tal como lo dice en la pagina de NEHE
pero todo corren ultra lento.( 2 fps)

Ejecuto el exe que viene en el lesson 26 de los turoriales de nehe
y cuando lo hago correr en windowed corre ultra lento, igual que lo que yo implemente.

En cambio cuando hago correr el ejemplo en fullscreen todo funciona Ok,
en cambio en lo que yo programe sigue igual de lento.

Estoy programando en c++, con Dev-cpp(c++) , con allegroGL.

Tengo un ahtlon xp 1100,256 ram, geforce 2 MX/MX 400 64MB
(lo pongo como dato no mas por que, como dije, el ejemplo corre bien aunque sea en windowed, o sea no pasa por hardware)

el codigo de la funcion display, osea la que dibuja es el siguiente:

void display (void)
{
allegro_gl_begin();

// Clear Screen, Depth Buffer & Stencil Buffer
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT |
GL_STENCIL_BUFFER_BIT);

// Plane Equation To Use For The Reflected Objects
double eqr[] = {0.0f,-1.0f, 0.0f, 0.0f};

glLoadIdentity();
camera();//con esto me muevo a travez de la escena
glColorMask(0,0,0,0);
// Set Color Mask

glEnable(GL_STENCIL_TEST);
// Enable Stencil Buffer For "marking" The Floor

glStencilFunc(GL_ALWAYS, 1, 1);
// Always Passes, 1 Bit Plane, 1 As Mask

glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
// We Set The Stencil Buffer To 1 Where We Draw Any Polygon
// Keep If Test Fails, Keep If Test Passes But Buffer Test Fails
// Replace If Test Passes

glDisable(GL_DEPTH_TEST);
// Disable Depth Testing

glEnable (GL_TEXTURE_2D);
pasto(); // con esto dibujo el suelo, habilito y desabilito la textura por que sino luego al
//modelo 3d que cargo le cambia el color
glDisable (GL_TEXTURE_2D);

// We Only Want To Mark It In The Stencil Buffer
glEnable(GL_DEPTH_TEST);
// Enable Depth Testing

glColorMask(1,1,1,1);
// Set Color Mask to TRUE, TRUE, TRUE, TRUE

glStencilFunc(GL_EQUAL, 1, 1);
// We Draw Only Where The Stencil Is 1
// (I.E. Where The Floor Was Drawn)

glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
// Don't Change The Stencil Buffer

glEnable(GL_CLIP_PLANE0);
// Enable Clip Plane For Removing Artifacts

// (When The Object Crosses The Floor)
glClipPlane(GL_CLIP_PLANE0, eqr);
// Equation For Reflected Objects( eqr=plano(0,-1,0 )

glPushMatrix();
// Push The Matrix Onto The Stack

glScalef(1.0f, -1.0f, 1.0f);
// Mirror Y Axis

luz(GL_LIGHT0,LightPos);
// Set Up Light0

glTranslatef(0.0, aa, 0.0);
glCallList(object->model_list);

glPopMatrix();
// Pop The Matrix Off The Stack

glDisable(GL_CLIP_PLANE0);
// Disable Clip Plane For Drawing The Floor

glDisable(GL_STENCIL_TEST);
// We Don't Need The Stencil Buffer Any More (Disable)

luz(GL_LIGHT0,LightPos);
// Set Up Light0

glEnable(GL_BLEND);
// Enable Blending (Otherwise The Reflected Object Wont Show)

glDisable(GL_LIGHTING);
// Since We Use Blending, We Disable Lighting

glColor4f(1.0f, 1.0f, 1.0f, 0.8f);
// Set Color To White With 80% Alpha

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
// Blending Based On Source Alpha And 1 Minus Dest Alpha

glEnable (GL_TEXTURE_2D);
pasto();
glDisable (GL_TEXTURE_2D);

glEnable(GL_LIGHTING);
// Enable Lighting

glDisable(GL_BLEND);
// Disable Blending

glPushMatrix();

luz(GL_LIGHT0,LightPos);
//esta es la luz puntual ubicada en y=30 con direccion y=-1

glTranslatef(0.0, aa, 0.0);
//esto es para mover el objeto hacia arriba o hacia abajo

glCallList(object->model_list);
//esto dibuja un objeto 3d desde un archivo obj

glPopMatrix();

glFlush(); // ejecutamos todos los comandos.
allegro_gl_flip(); // mueve el backbuffer a la pantalla.
allegro_gl_end();
}


Por favor diganme si les ha pasado algo similar.
O DIGANME COMO SE ARREGLA POR FAVOR
Ahora me toca sombras y de igual modo se necesita stencil
por favor ayuda.

Pogacha

El codigo parece estar bien.

Me iria de cabeza a un problema del modo en que estas inicializando OpenGL, si el stencil no es soportado por hardware (en modo ventana hasta tiene sentido de que no) seguramente lo estará implementando por software (seguramente todo implementado por software) y de ahí el bajo frame-rate.

Revisa que estes pidiendo un formato de pixel que exista.

Saludos!

Prompt

Tiene una pinta tremenda de ser un fallo en el driver de tu tarjeta de video.

Actualizalo... y si ya lo has hecho, bajalo de versión ! :D

Y cuentanos.

xeex

Pogacha y Prompt
Demasiadas gracias por contestar, no saben la cantidad de horas que he perdido tratando de expresar mi problema en foros gringos sin obtener ninguna solucion.

Al principio creia que se trataba de un problema de inicializacion, es decir que no estaba haciendo correr bien el modo fullscreen en allegroGL (ya tengo acecptado de que solo se podra en fullscreen, no importa que corra en ventana), pero luego de unas modificaciones todo se mantuvo igual de lento:

asi lo estaba haciendo:

allegro_gl_clear_settings();
allegro_gl_set (AGL_COLOR_DEPTH, 32);
allegro_gl_set (AGL_Z_DEPTH, 8);
allegro_gl_set(AGL_FULLSCREEN, TRUE);
allegro_gl_set (AGL_DOUBLEBUFFER, 1);
allegro_gl_set (AGL_SUGGEST, AGL_COLOR_DEPTH | AGL_Z_DEPTH | AGL_DOUBLEBUFFER );

despues lo deje asi:

allegro_gl_set( AGL_COLOR_DEPTH, 32 );
allegro_gl_set( AGL_Z_DEPTH, 8 );
allegro_gl_set( AGL_SUGGEST, AGL_COLOR_DEPTH | AGL_Z_DEPTH );

Pero para mi sorpresa no pasaba por eso, todo seguia lento.
Depues pense "quizas todo se pone lento por que cargo un modelo 3d"
ya que esto implica mas calculos, asi que lo saque y lo sustitui por un simple cubo y todo siguio igual de lento. Depues cambie todo el codigo a glut (es decir, sin allegrogl) y todo siguio exactamete igual.

En este momento me he quedado con un reflejo simple, es decir, no ocupo en stencil buffer, osea el objeto se ve detras de la superficie que refleja(bueno en relidad no es un reflejo :D ).


Respecto a los driver dejame contarte Prompt que tenia una  version relativamente antigua de los Detonator de Nvidia y en un foro me dijieron que podia ser eso, asi que los actualize a la ultima version pero todo sigue igual.

Pogacha me  puedes explicar esto :
"Revisa que estes pidiendo un formato de pixel que exista."

creo que lo que dices, aunque no lo entiendo :D , tiene mucho que ver con mi problema.

pongo mi funcion Init:

void init()
{
allegro_gl_begin();  
glClearColor(0.0, 0.0, 0.0, 0.0);
glShadeModel(GL_SMOOTH);
glCullFace(GL_BACK);
glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);  
glClearDepth(1.0f);   
glClearStencil(0);   
glDepthFunc(GL_LEQUAL);
//glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
allegro_gl_end();
}

gracias, si requieren mas informacionpor favor diganme, estoy muy muy necesitado de resolver esto.
GRACIAS

xeex

oh, por fin di con el problema.

Primero, el ejemplo de de  nehe de reflejos no lo podia correr en windowed por que se volvia todo lento.
bueno se trataba de que habia que poner el escritorio en 32 bits
por que si lo deja en 16bit el estincil lo emula por software(gracias Pogacha tu acotacion me hiso volver a averiguar y ai di con la respuesta)

Segundo en AllegroGL en la inicializacion habia que agregar esto:

allegro_gl_set(AGL_STENCIL_DEPTH,1);
allegro_gl_set( AGL_SUGGEST, AGL_COLOR_DEPTH | AGL_Z_DEPTH | AGL_DOUBLEBUFFER | AGL_RENDERMETHOD | AGL_FULLSCREEN | AGL_STENCIL_DEPTH);

bueno en relidad basta con:
allegro_gl_set(AGL_STENCIL_DEPTH,1);
allegro_gl_set( AGL_SUGGEST, AGL_COLOR_DEPTH | AGL_Z_DEPTH | AGL_DOUBLEBUFFER | AGL_STENCIL_DEPTH);

bueno era ovio no?no estaba "encendiendo"  el STENCIL, que torpe.

muchas gracias Pogacha y Prompt ya todos los que leyeron.
gracias.

Pogacha

En realidad es algo muy comun de OpenGL que cuando le pidas algo que no es capaz por hardware lo hace por software.
Tenlo en cuenta para futuros debugs.
Saludos!






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.