Seite 1 von 1

OpenGL und Skybox-Problem mittels Cubemap

Verfasst: Dienstag 5. Juni 2012, 13:09
von 3quin0x
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ß,

Re: OpenGL und Skybox-Problem mittels Cubemap

Verfasst: Dienstag 5. Juni 2012, 13:39
von Dav1d
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.

Re: OpenGL und Skybox-Problem mittels Cubemap

Verfasst: Dienstag 5. Juni 2012, 13:53
von 3quin0x
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).

Re: OpenGL und Skybox-Problem mittels Cubemap

Verfasst: Dienstag 5. Juni 2012, 14:28
von Dav1d
Dann mach mal FaceCulling aus und schau was passiert.

Re: OpenGL und Skybox-Problem mittels Cubemap

Verfasst: Dienstag 5. Juni 2012, 14:47
von 3quin0x
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