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.
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!
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.
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
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.
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!