OpenGL Skybox



  • Hi,
    ich versuche zur Zeit in meinem OpenGl-Programm eine Skybox zu implementieren und zwar mit einer Cube map. Leider ist das Ergebnis nur ein schwazer Hintergrund.

    Die Cubemapselbst erstelle ich wie folgt:

    bool CubemapTexture::Load()
    {
    	// Create one OpenGL texture
    	glGenTextures(1, &m_textureObj);
    
    	// "Bind" the newly created texture : all future texture functions will modify this texture
    	glBindTexture(GL_TEXTURE_CUBE_MAP, m_textureObj);
    
    	for (int i = 0; i < 6; i++)
    	{
    		m_textures[i] = new TextureImage();
    
    		if(!m_textures[i]->loadBMP(m_fileNames[i].c_str()))
    		{
    			std::cout << "loading BMP in Cubemap failed" << std::endl;
    			if (std::cin.get() == '\n')		
    				return false;
    		}
    
    		glTexImage2D(types[i], 0, GL_BGR, m_textures[i]->getWidth(), m_textures[i]->getHeight(), 0, GL_BGR, GL_UNSIGNED_BYTE, m_textures[i]->getData());
    
    	}
    	glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
        glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_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);           
    
    	return true;
    }
    

    Ich habe die Vermutung, dass es an dem Shader liegt:
    VertexShader:

    layout (location = 0) in vec3 Position;                                             
    
    uniform mat4 gWVP;                                                                  
    
    out vec3 TexCoord0;                                                                 
    
    void main()                                                                         
    {                                                                                   
        vec4 WVP_Pos = gWVP * vec4(Position, 1.0);                                      
        gl_Position = WVP_Pos.xyww;                                                     
        TexCoord0   = Position;                                                         
    }
    

    Und der FragmentShader:

    in vec3 TexCoord0;                                                                  
    
    out vec4 FragColor;                                                                 
    
    uniform samplerCube gCubemapTexture;                                                
    
    void main()                                                                         
    {                                                                                   
        FragColor = texture(gCubemapTexture, TexCoord0);                                
    }
    

    Und gerendert wird es so:

    m_pSkyboxTechnique->Enable();
    
    	GLint OldCullFaceMode;
        glGetIntegerv(GL_CULL_FACE_MODE, &OldCullFaceMode);
        GLint OldDepthFuncMode;
        glGetIntegerv(GL_DEPTH_FUNC, &OldDepthFuncMode);
    
        glCullFace(GL_FRONT);
        glDepthFunc(GL_LEQUAL);
    
    	m_pCubemapTex->Bind(GL_TEXTURE0);
    	m_Mesh.Render();
    

    Ich habe schon getestet ob es an den Texturen bzw. dem Textur laden liegt aber das scheint nicht der Fall zu sein da die Texturen(nicht als Cube map) auf anderen objecten gehen.

    Vielen Dank für jeden Tip oder Idee 🙂



  • Ich kenn mich OpenGL nur ein bisschen aus aber versuche trotzdem mal, dir zu helfen..
    Setzt du die Uniform-Variablen richtig? Und warum WVP_pos.xyww (statt WVP_pos)?



  • Werden die Texturdaten richtig geladen? Ich nehme an, types[i] entspricht GL_TEXTURE_CUBE_MAP_POSITIVE_X etc.!? Was passiert, wenn du einfach mal die Texcoords als Farbe ausgibst anstatt der Textur? Siehst du dann zumindest was?



  • Ja die Types sind folgende:

    static const GLenum types[6] = {  GL_TEXTURE_CUBE_MAP_POSITIVE_X,
                                      GL_TEXTURE_CUBE_MAP_NEGATIVE_X,
                                      GL_TEXTURE_CUBE_MAP_POSITIVE_Y,
                                      GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,
                                      GL_TEXTURE_CUBE_MAP_POSITIVE_Z,
                                      GL_TEXTURE_CUBE_MAP_NEGATIVE_Z };
    

    Wenn ich FragColor = vec4(1.0, 0.0, 0.0, 1.0) sehe ich eine rote Box(falls du das meintest)

    🙂



  • Hast du geguckt, ob es Kompilierfehler gibt? Welche OpenGL-Version unterstützt deine Plattform maximal?



  • Also Kompilierfehler bekomme ich keine und meine Grafikkarte unterstützt bis zu OpenGl 4.1



  • dot schrieb:

    Werden die Texturdaten richtig geladen? [...] Was passiert, wenn du einfach mal die Texcoords als Farbe ausgibst anstatt der Textur? Siehst du dann zumindest was?



  • Ist position.xyz in [0,1]? Wenn du nen Wuerfel um den Ursprung zeichnest sind die Koordinaten in [-1,1] und du musts vorher in texcoord-gebrauchliche Koordinaten transformieren

    TexCoord0   = (Position+1.0)/2.0;
    


  • TravisG schrieb:

    Ist position.xyz in [0,1]? Wenn du nen Wuerfel um den Ursprung zeichnest sind die Koordinaten in [-1,1] und du musts vorher in texcoord-gebrauchliche Koordinaten transformieren

    Er verwendet eine Cube Map... 😉



  • Also die Textgurdaten werden richtig geladen. Zumindest funktionieren die Texturen bei "normalen" Objekten und nciht als Cubemap.

    Was genau meinst du mit die TextCords als Farbe ausgeben? Wäre das nicht einfach zum Beispiel

    FragColor = vec4(1.0, 0.0, 0.0, 1.0)
    

    ?



  • Ich seh gerade, du machst folgendes: m_pCubemapTex->Bind(GL_TEXTURE0);

    Das schaut mir irgendwie nicht ganz richtig aus, was genau macht diese Bind() Methode!? Du musst deine Cube Map natürlich an das GL_TEXTURE_CUBE_MAP target binden...

    Was sagt glGetError()?



  • Das ist folgendes:

    void CubemapTexture::Bind(GLenum TextureUnit)
    {
        glActiveTexture(TextureUnit);
        glBindTexture(GL_TEXTURE_CUBE_MAP, m_textureObj);
    }
    

    glGetError() gibt mir 1280. Ich bin mir aber nicht sicher an welcher Stelle man das testen sollte. Ich habe es jetzt nach dem binden gemacht



  • Also einen GL_INVALID_ENUM. Teste eben mal nach jedem gl* Aufruf, um zu sehen, welcher Aufruf genau den Fehler erzeugt...



  • Okay ich habs ausprobiert und der Fehler scheint hier nach zu kommen:

    glTexImage2D(types[i], 0, GL_BGR, m_textures[i]->getWidth(), m_textures[i]->getHeight(), 0, GL_BGR, GL_UNSIGNED_BYTE, m_textures[i]->getData());
    


  • Okay es lag wohl an

    GL_BGR
    

    . Habe es durch

    GL_RGB
    

    ersetzt und es funktioniert...zumindest habe ich jetzt Texturen. Aber leider habe ich das mit der Matrix versaut. Ich bin davon ausgegangen dass ich die Model*View*Projection Matrix brauche aber dann sieht das ganze doch ein wenig komisch aus 😃



  • Nee, projection*modelview..



  • Oh okay, danke 🙂


Anmelden zum Antworten