OpenGL: Shadow Map + Multi Texturing auf NVidia
-
Hallo,
da meine NVidia Karte die OpenGL Ambient Shadow Extension nicht unterstützt, muss ich beim Shadow mapping vorerst einen eigenen Durchlauf für ambientes Licht zeichnen (die Textur des Models in der ersten texture unit).
Im nächsten Schritt verwende ich multi texturing, um shadow map und Textur des Objekts in einem Durchlauf zu zeichnen.
Leider sind die schattierten Stellen immernoch vollkommen schwarz anstatt nur ein wenig dunkler.
Wahrscheinlich setze ich den Alpha test bzw. das Multi texturing falsch ein, aber ich komme hier gerade nicht weiter (ist auch schon so spät). Kann mir da vielleicht jemand helfen?
Vielen lieben Dank!
/* * Ambient pass */ glActiveTexture(GL_TEXTURE0); glLightfv(GL_LIGHT0, GL_AMBIENT, ambientLightLow); glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuseLightLow); // .. Objekte zeichnen // Enable alpha test so that shadowed fragments are discarded glAlphaFunc(GL_GREATER, 0.9f); glEnable(GL_ALPHA_TEST); /* * Texure + shadow pass */ glLightfv(GL_LIGHT0, GL_AMBIENT, ambientLight); glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuseLight); // Set up shadow comparison glActiveTexture(GL_TEXTURE1); glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, shadowTextureID); glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_R_TO_TEXTURE); // Set up the eye plane for projecting the shadow map on the scene glEnable(GL_TEXTURE_GEN_S); glEnable(GL_TEXTURE_GEN_T); glEnable(GL_TEXTURE_GEN_R); glEnable(GL_TEXTURE_GEN_Q); glTexGenfv(GL_S, GL_EYE_PLANE, &textureMatrix[0]); glTexGenfv(GL_T, GL_EYE_PLANE, &textureMatrix[4]); glTexGenfv(GL_R, GL_EYE_PLANE, &textureMatrix[8]); glTexGenfv(GL_Q, GL_EYE_PLANE, &textureMatrix[12]); // .. Objekte zeichnen glDisable(GL_ALPHA_TEST); glDisable(GL_TEXTURE_GEN_S); glDisable(GL_TEXTURE_GEN_T); glDisable(GL_TEXTURE_GEN_R); glDisable(GL_TEXTURE_GEN_Q);
-
zum einen denk ich mir dass es auch in einem pass geht, wenn man die richtigen register combiner setzt.
zum anderen musst du mit der aktuellen methode addivie zeichnen, also blend enable und GL_ONE, GL_ONE.:xmas1:
-
Hallo, danke für die Antwort.
Update: Das Problem hat sich glaub ich vorerst erledigt. Hab gerade den Einstieg in Shader gewagt (man ist das geil, warum hab ich das nicht früher gemacht :P) und denke, dass ich das Problem bald über diese eleganter lösen kann.