Cubemap problem mit MiniB3D

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

 

klepto2

Betreff: Cubemap problem mit MiniB3D

BeitragMo, Sep 11, 2006 20:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie ja vielleicht einige Wissen, arbeite ich gerade an ein paar erweiterungen für MiniB3D.(Vorallem Shader unterstützung). Um die Shadermöglichkeiten jedoch voll auszuschöpen (vorallem die meisten schönen Effekte) wird leider CubeMapping gebraucht, welches MiniB3D noch nicht unterstützt.
Also hab ich mich mal dran versucht, bin aber auf ein Problem gestoßen, welches sich mir komplett entschließt. Vielleicht weis jemand von euch Rat.

Hier ist mal der Code, wie ich Cubemapping jetzt eingebaut habe.

LoadTexture Funktion

Code: [AUSKLAPPEN]

If tex.flags & 128 Then cubemap = True
         
         If Cubemap = True Then
            
            Local texSize:Int = PixmapWidth(tex.pixmap) / 6
            If texSize <> PixmapHeight(tex.pixmap) Then Throw "Not correct Texture Format for cubemapping" + texsize
               Local pixmaps:TPixmap[6]
               
               For Local i:Int = 0 To 5
                  pixmaps[i] = CreatePixmap(texsize , texsize , PF_RGBA8888)
                  For Local x:Int = 0 To texsize - 1
                     For Local y:Int = 0 To texsize - 1
                        Local rgb:Int = ReadPixel(tex.pixmap , x + (texsize*i) , y)
                        WritePixel(pixmaps[i] , x , y , rgb)
                        
                        
                     Next
                  Next
                                 
                  
                  tex.glcubetex[i] = GLTexFromPixmap2(pixmaps[i],False,GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT+i)
               Next
               
            Return tex
            EndIf   

...  rest der Lade Routine von Simon

2 modifizierte Versionen der GLTexfromPixmap und GLADjustTexSize

Function GLTexFromPixmap2( pixmap:TPixmap,mipmap=False ,target:Int = GL_TEXTURE_2D)
   If pixmap.format<>PF_RGBA8888 pixmap=pixmap.Convert( PF_RGBA8888 )
   Local width=pixmap.width,height=pixmap.height
   'GLAdjustTexSize2 width,height
   If width<>pixmap.width Or height<>pixmap.height pixmap=ResizePixmap( pixmap,width,height )
   
   Local old_name,old_row_len
   glGetIntegerv GL_TEXTURE_BINDING_2D,Varptr old_name
   glGetIntegerv GL_UNPACK_ROW_LENGTH,Varptr old_row_len

   Local name
   glGenTextures 1,Varptr name
   glBindtexture target,name
   
   Local mip_level
   Repeat
      glPixelStorei GL_UNPACK_ROW_LENGTH,pixmap.pitch/BytesPerPixel[pixmap.format]
      glTexImage2D target,mip_level,GL_RGBA8,width,height,0,GL_RGBA,GL_UNSIGNED_BYTE,pixmap.pixels
      If Not mipmap Exit
      If width=1 And height=1 Exit
      If width>1 width:/2
      If height>1 height:/2
      pixmap=ResizePixmap( pixmap,width,height )
      mip_level:+1
   Forever
   
   glBindTexture target,old_name
   glPixelStorei GL_UNPACK_ROW_LENGTH,old_row_len

   Return name
End Function

'GL_PROXY_TEXTURE_CUBE_MAP_EXT

Function GLAdjustTexSize2( width Var,height Var )
   Function Pow2Size( n )
      Local t=1
      While t<n
         t:*2
      Wend
      Return t
   End Function
   width=Pow2Size( width )
   height=Pow2Size( height )
   Repeat
      Local t
      glTexImage2D GL_PROXY_TEXTURE_CUBE_MAP_EXT,0,4,width,height,0,GL_RGBA,GL_UNSIGNED_BYTE,Null
      glGetTexLevelParameteriv GL_PROXY_TEXTURE_CUBE_MAP_EXT,0,GL_TEXTURE_WIDTH,Varptr t
      If t Return
      If width=1 And height=1 RuntimeError "Unable to calculate tex size"
      If width>1 width:/2
      If height>1 height:/2
   Forever
End Function



und hier der Code, wie die Cubemap dann wieder im Mesh.Update initialiesiert wird.

Code: [AUSKLAPPEN]

If tex_flags & 128 <> 0 Then
                    glBindTexture(GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT,glCubetex[0])
                    glBindTexture(GL_TEXTURE_CUBE_MAP_NEGATIVE_X_EXT,glCubetex[1])
                    glBindTexture(GL_TEXTURE_CUBE_MAP_POSITIVE_Y_EXT,glCubetex[2])
                    glBindTexture(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_EXT,glCubetex[3])
                    glBindTexture(GL_TEXTURE_CUBE_MAP_POSITIVE_Z_EXT,glCubetex[4])
                   glBindTexture(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_EXT ,glCubetex[5])
                  
                  glTexParameteri(GL_TEXTURE_CUBE_MAP_EXT , GL_TEXTURE_MIN_FILTER , GL_NEAREST)
                  glTexParameteri(GL_TEXTURE_CUBE_MAP_EXT , GL_TEXTURE_MAG_FILTER , GL_NEAREST)
                  glTexParameteri(GL_TEXTURE_CUBE_MAP_EXT, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE)
                glTexParameteri(GL_TEXTURE_CUBE_MAP_EXT , GL_TEXTURE_WRAP_T , GL_CLAMP_TO_EDGE)

         glEnable(GL_TEXTURE_CUBE_MAP_EXT)
               EndIf


das problem ist nun, das zwar etwas als Textur angezeigt wird, es 1. aber auf jeder Seite gleich aussieht und total verzerrt ist. Kennt jemand den Fehler oder eine andere Möglichkeit CM einzubauen?

Danke.
Matrix Screensaver
Console Modul für BlitzMax
KLPacker Modul für BlitzMax

HomePage : http://www.brsoftware.de.vu
 

Dreamora

BeitragMo, Sep 11, 2006 22:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich kenne mich zwar mit OpenGL nicht gut genug aus, aber ich vermute der Teil für SphereMap Init aus diesem Nehe tutorial http://nehe.gamedev.net/data/l...?lesson=23 dürfte in irgend einer Form auch benötigt werden um Cube Maps korrekt zu initialisieren. Dummerweise hats kein Tut und ich bin im Moment zu müde um noch rasch danach zu googlen.

Hab allerdings noch rasch in der alten DreiDe version nachgesehen und die fährt mit
Zitat:

glEnable(GL_TEXTURE_GEN_S)
glEnable(GL_TEXTURE_GEN_T)
glEnable(GL_TEXTURE_GEN_R)


nach dem binden der CubeMap
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

klepto2

BeitragMo, Sep 11, 2006 23:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke, Dreamora. habs aber kurz vorher selbst rausbekommen.

Das problem war, das man noch automatische TexCoords generierung aufrufen muss, bevor die von dir genanten Befehle kommen.

Code: [AUSKLAPPEN]


If tex_flags & 128 <> 0 Then
               
                  glBindTexture(GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT,glCubetex[0])
                   glBindTexture(GL_TEXTURE_CUBE_MAP_NEGATIVE_X_EXT,glCubetex[1])
                   glBindTexture(GL_TEXTURE_CUBE_MAP_POSITIVE_Y_EXT,glCubetex[2])
                    glBindTexture(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_EXT,glCubetex[3])
                    glBindTexture(GL_TEXTURE_CUBE_MAP_POSITIVE_Z_EXT,glCubetex[4])
                   glBindTexture(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_EXT ,glCubetex[5])
                  
                  glTexParameteri(GL_TEXTURE_CUBE_MAP_EXT , GL_TEXTURE_MIN_FILTER , GL_NEAREST)
                  glTexParameteri(GL_TEXTURE_CUBE_MAP_EXT , GL_TEXTURE_MAG_FILTER , GL_NEAREST)
                  glTexParameteri(GL_TEXTURE_CUBE_MAP_EXT, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE)
                   glTexParameteri(GL_TEXTURE_CUBE_MAP_EXT , GL_TEXTURE_WRAP_T , GL_CLAMP_TO_EDGE)
                   glTexGenf(GL_S, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP_EXT)
                   glTexGenf(GL_T, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP_EXT)
                   glTexGenf(GL_R, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP_EXT)
                   glEnable(GL_TEXTURE_GEN_S)
                   glEnable(GL_TEXTURE_GEN_T)
                   glEnable(GL_TEXTURE_GEN_R)
                'glEnable(GL_TEXTURE_GEN_S);         
                 ' glEnable(GL_TEXTURE_GEN_T);
                'glEnable(GL_TEXTURE_GEN_R);


                  glEnable(GL_TEXTURE_CUBE_MAP_EXT)
               EndIf

so ist die Initialiesierung richtig.
Matrix Screensaver
Console Modul für BlitzMax
KLPacker Modul für BlitzMax

HomePage : http://www.brsoftware.de.vu

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group