OpenGL und Skybox-Problem mittels Cubemap

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Antworten
3quin0x
User
Beiträge: 15
Registriert: Dienstag 3. August 2010, 16:50

Hi,

anbei der Quellcode...komme einfach nicht weiter, was so ziemlich demotivierend ist. Die Anzeige der View sind 2 Dreiecke eins schwarz das andere bunt, weiss jemand von euch wo der Fehler liegt? Ach so, bitte keine Tipps zu pygame oder pyglet usw., das Projekt soll rein in Opengl sein. Ich wäre sehr dankbar wenn mir hier jemand weiterhelfen könnte.

Code: Alles auswählen

from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *
import sys,os
from math import sqrt,sin,cos
import Image

cube_faces = ["desert_back.jpg","desert_front.jpg","desert_left.jpg","desert_right.jpg","desert_top.jpg","desert_top.jpg"]
cube = (GLenum * 6)(GL_TEXTURE_CUBE_MAP_POSITIVE_X,
                    GL_TEXTURE_CUBE_MAP_NEGATIVE_X,
                    GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,
                    GL_TEXTURE_CUBE_MAP_POSITIVE_Y,
                    GL_TEXTURE_CUBE_MAP_POSITIVE_Z,
                    GL_TEXTURE_CUBE_MAP_NEGATIVE_Z)

PATH = "/Users/xxx/Documents/Skybox/"


def draw_skybox():
    t = 1.0
    fext = 15.0
    
    glBegin(GL_QUADS)
    # Negative X
    glTexCoord3f(-t,-t,t)
    glVertex3f(-fext,-fext,fext)

    glTexCoord3f(-t,-t,-t)
    glVertex3f(-fext,-fext,-fext)

    glTexCoord3f(-t,t,-t)
    glVertex3f(-fext,fext,-fext)

    glTexCoord3f(-t,t,t)
    glVertex3f(-fext,fext,fext)

    # Positive X
    glTexCoord3f(t,-t,-t)
    glVertex3f(fext,-fext,-fext)
    
    glTexCoord3f(t,t,t)
    glVertex3f(fext,fext,fext)
    
    glTexCoord3f(-t,t,-t)
    glVertex3f(-fext,fext,-fext)
    
    glTexCoord3f(t,t,-t)
    glVertex3f(fext,fext,-fext)

    # Positive Z
    glTexCoord3f(t,-t,t)
    glVertex3f(fext,-fext,fext)
    
    glTexCoord3f(-t,-t,t)
    glVertex3f(-fext,-fext,fext)
    
    glTexCoord3f(-t,t,t)
    glVertex3f(-fext,fext,fext)
    
    glTexCoord3f(t,t,t)
    glVertex3f(fext,fext,fext)

    # Positive Y
    glTexCoord3f(-t,t,t)
    glVertex3f(-fext,fext,fext)
    
    glTexCoord3f(-t,t,-t)
    glVertex3f(-fext,fext,-fext)
    
    glTexCoord3f(t,t,-t)
    glVertex3f(fext,fext,-fext)
    
    glTexCoord3f(t,t,t)
    glVertex3f(fext,fext,-fext)

    # Negative Y
    glTexCoord3f(-t,-t,-t)
    glVertex3f(-fext,-fext,-fext)
    
    glTexCoord3f(-t,-t,t)
    glVertex3f(-fext,-fext,fext)
    
    glTexCoord3f(t,-t,t)
    glVertex3f(fext,-fext,fext)
    
    glTexCoord3f(t,-t,-t)
    glVertex3f(fext,-fext,-fext)
    glEnd()

def draw():
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
    glLoadIdentity()
    glPushMatrix()
    glDisable(GL_TEXTURE_GEN_S)
    glDisable(GL_TEXTURE_GEN_T)
    glDisable(GL_TEXTURE_GEN_R)
    draw_skybox()
    glEnable(GL_TEXTURE_GEN_S)
    glEnable(GL_TEXTURE_GEN_T)
    glEnable(GL_TEXTURE_GEN_R)
    glPushMatrix()
    glTranslate(0.,0.,-3.)
    glMatrixMode(GL_TEXTURE)
    glMatrixMode(GL_MODELVIEW)
    glPopMatrix()
    glPopMatrix()
    glutSwapBuffers()

def load_image(image):
    img = Image.open(PATH+image)
    w = img.size[0]
    h = img.size[1]
    d = img.tostring("raw","RGBX",0,-1)
    return d,w,h

def initGL(w,h):
    glCullFace(GL_BACK)
    glFrontFace(GL_CCW)
    glEnable(GL_CULL_FACE)
    glEnable(GL_DEPTH_TEST)

    glTexParameteri(GL_TEXTURE_CUBE_MAP,GL_TEXTURE_MAG_FILTER,GL_LINEAR)
    glTexParameteri(GL_TEXTURE_CUBE_MAP,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR)
    glTexParameteri(GL_TEXTURE_CUBE_MAP,GL_TEXTURE_WRAP_S,GL_CLAMP_TO_EDGE)
    glTexParameteri(GL_TEXTURE_CUBE_MAP,GL_TEXTURE_WRAP_T,GL_CLAMP_TO_EDGE)
    glTexParameteri(GL_TEXTURE_CUBE_MAP,GL_TEXTURE_WRAP_R,GL_CLAMP_TO_EDGE)

    for i in range(6):
        glTexParameteri(GL_TEXTURE_CUBE_MAP,GL_GENERATE_MIPMAP,GL_TRUE)
        data,width,height = load_image(cube_faces[i])
        glTexImage2D(cube[i],0,GL_RGB,width,height,0,GL_RGB,GL_UNSIGNED_BYTE,data)
    glTexGeni(GL_S,GL_TEXTURE_GEN_MODE,GL_REFLECTION_MAP)
    glTexGeni(GL_T,GL_TEXTURE_GEN_MODE,GL_REFLECTION_MAP)
    glTexGeni(GL_R,GL_TEXTURE_GEN_MODE,GL_REFLECTION_MAP)
    
    glEnable(GL_TEXTURE_CUBE_MAP)
    glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_DECAL)

def reshape(w,h):
    if h == 0:
        h = 1
    glViewport(0,0,w,h)
    aspect = float(w) / float(h)
    glMatrixMode(GL_PROJECTION)
    glLoadIdentity()
    gluPerspective(35.0,aspect,1.0,2000.0)
    glMatrixMode(GL_MODELVIEW)
    glLoadIdentity()

def main():
    glutInit(sys.argv)
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH)
    glutInitWindowSize(800,600)
    glutCreateWindow("Skybox")
    glutDisplayFunc(draw)
    glutReshapeFunc(reshape)
    initGL(800,600)
    glutMainLoop()

if __name__=='__main__':
    main()
Gruß,
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Ich nehme an, dass du in der falschen "Reihenfolge" zeichnest und durch das FaceCulling wird der Teil nicht gerendert, da OpenGL annimmt, dass das die Rückseite ist.
Versuche mal mit glClearColor die Hintergrundfarbe auf ein Pink zu setzen, dann siehst du ob dein Dreieck schwarz ist oder ob es nicht gezeichnet wird.

PS: Du solltest echt von der "fixed Pipeline" (Opengl < 3) wegkommen, OpenGL > 3 ist schneller, dynamischer und hat viel mehr Möglichkeiten.
the more they change the more they stay the same
3quin0x
User
Beiträge: 15
Registriert: Dienstag 3. August 2010, 16:50

Ich hab glClearColor auf rot gesetzt, nun wird auch die eine Hälfte der View (Dreieck) rot gezeichnet.

Mit der fixed Pipeline, hatte ich nur zu Testzwecken gemacht, um zusätzliche Fehlerquellen auszuschliessen, wenn die Skybox mal korrekt angezeigt werden würde, dann werde ich es auch in vbo umschreiben (ist auch Pflicht des Projekts OpenGL > 3).
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Dann mach mal FaceCulling aus und schau was passiert.
the more they change the more they stay the same
3quin0x
User
Beiträge: 15
Registriert: Dienstag 3. August 2010, 16:50

Ich hatte noch 2-3 Fehler drin die ich jetzt korrigiert habe (Fehlen der Negative-Z in draw_skybox)....ein ausstellen von CullFace brachte keinen Unterschied. (Nach der Fehlerbeseitigung wird jetzt nur noch eine Fläche angezeigt.

hier das Bild meiner Skybox Bild
Antworten