Q3 BSP - Transparente Flächen



  • Na also! 😉



  • Ich habe gerade gemerkt, dass in den Shadern nur tga's angegeben werden als map.

    Und zum Beispiel auf q3dm1 verlangt er "textures/gothic_block/blocks18c_3", gibts jedoch nicht als Shader, liegt aber als jpg vor.

    Muss ich das jetzt so interpretieren, dass man zuerst überprüft, ob ein Shader vorliegt und wenn nicht, versucht man das jpg mit dem Namen zu laden?

    Danke



  • Hi!

    Genau. Zuerst suchst du obs einen Shader gibt und dann suchst du die jeweilige Textur. Das in Shadern nur Tgas verwendet werden und sonst jpegs kann ich nicht bestätigen. Da würd ich einfach alle Möglichkeiten abchecken.

    grüße



  • Hey, sag mal, woher hast du eigentlich deine ganzen Informationen über das Rendering und so?

    Nur aus den Shader Manuals wie http://www.heppler.com/shader/ ?

    Ich hänge gerade ein wenig beim Multitexturing. Momentan sieht es bei mir so aus:
    http://bloody-blades.de/images/uhm_naja.jpg
    Hab das Zeichnen von MeshFaces und Patches mal rausgeworfen, sind im Moment also nur die Polygonfaces. Die rötlichen Texturen sind Shader.
    Ich hab mir die Stellen im Spiel angesehen und festgestellt, dass z.B. über der Tür der Türrahmen über die Flamme gezeichnet wird, aber bei mir werden die Texturen halt schön zusammengemischt.
    Woher wusstest du wie das zum Beispiel genau funktioniert?

    Ich möcht ja echt nicht fragen, aber würdest du mir eventuell vielleicht mal deinen Loader zeigen/geben? 🙂
    Ich plag mich schon länger damit rum, als ich ursprünglich vorhatte. Es ist fürn Spiel und es gibt noch genug andere Dinge, um die ich mich kümmern muss. Aber ich bin schon so weit, da will ich nicht aufgeben.
    Wäre cool; ich will auch nicht (alles :P) abschreiben, hauptsächlich Anregungen bekommen.

    Vielen Dank

    :edit:
    Kannst mich ja vielleicht mal kontaktieren unter
    ICQ: 343987149
    email: xindon (at) gmail (dot) com



  • Hi!

    Grundsätzlich renderst du die Layer in der Reihenfolge wie sie geladen wurden. Also:

    Layer *l;
    
    for ( int pass = 0; pass < currShader->numLayers; ++pass )
    {
      // ...
    
      glActiveTextureARB( GL_TEXTURE0_ARB );
      glClientActiveTextureARB( GL_TEXTURE0_ARB );
      glEnable( GL_TEXTURE_2D );
    
      l = currShader->layer[ pass ];
    
      SetTextureCoordinates( l );
      BindTexture( l )
      SetState( l )
      // usw usw...
    
      if ( l->m_nFlags & LF_MULTITEX )
      {
        glActiveTextureARB( GL_TEXTURE1_ARB );
        glClientActiveTextureARB( GL_TEXTURE1_ARB );
        glEnable( GL_TEXTURE_2D );
    
        // Texture Koordinaten, Bind Texture, Set State
        glDrawElements( ... )
      }
      else
      {
        glDrawElements( ... )
      }
    
      // ...
    }
    

    Mehr steckt nicht dahinter. Was du aber bedenken musst ist zuvor die Vertices und Texturkoodinaten zu transformieren! Sonst siehst du die ganzen schönen Effekte nicht! 🙂

    grüße



  • Okay das Prinzip hab ich (grob) ja auch verstanden, aber naja, siehst ja wie's auf dem Screen ausschaut 🙂

    Also noch eine Verständnisfrage zu deinem Code:

    Du gehst jedes Face auf der Karte durch, testest, ob es sichtbar ist.
    Wenn sichtbar, geht man jede Shaderstage des Faceshaders durch.

    Und jetzt: Du aktivierst für jede Stage am Anfang Texture 0 aus und zeichnest damit.
    Wenn Multitexturing an ist, bindest du Texture 1 (für die selbe Stage) und zeichnest was anderes damit.
    Aber was denn?

    Ich hab das jetzt so gedacht, dass wenn der Shader z.B. 2 Stages hat, aktiviert man für die erste Stage Texture 0 und für die zweite Stage Texture 1. Bei drei Stages nimmt man für die dritte eben Texture 2. Stimmt das so also nicht?

    Dein Code ist en bisschen unvollständig 🙂

    Trotzdem danke



  • Hi!

    Das is ja mehr oder weniger Pseudocode. Nunja, das Prinzip hast du genau richtig verstanden.
    Multitexturing kannst du auch ganz weg lassen, dann renderst du aber ggf doppelt so oft.

    Natürlich Binde ich nicht zweimal den gleichen Texturlayer, sondern den jeweils nächsten.

    grüße



  • Okay gut, also hab ich ja eigentlich verstanden was ich machen muss, vielen Dank 🙂

    Hab jetzt nur noch anscheinend ein rein OpenGL-technisches Problem:
    Erstmal zwei Bilder:
    q3dm1 - Quake 3
    http://bloody-blades.de/images/quake3_door.jpg

    q3dm1 - mein Loader
    http://bloody-blades.de/images/loader_door.jpg

    Man sieht den Türbogen (Patch) und die Fackeln (MeshFaces) nicht, weil ich momentan nur die Polygonfaces rendere wie schon erwähnt, wegen der Shaderumstellung.

    Der Shader zu der Tür sieht so aus:

    textures/gothic_door/skullarch_b
    {
    
       {
          map textures/sfx/firegorre.tga
          tcmod scroll 0 1
          tcMod turb 0 .25 0 5.6
          tcmod scale 1.5 1.5
          blendFunc GL_ONE GL_ZERO
          rgbGen identity
       }
    
       {
          map textures/gothic_door/skullarch_b.tga
          blendFunc blend
          rgbGen identity
       }
    
       {
          map $lightmap
          blendFunc filter
          gbGen identity
       }
    }
    

    Muss jetzt noch etwas anderes Opengl-technisches machen als die genannten Renderstates entsprechend zu setzen?
    Der Code für die Tür würde doch dann so aussehen:

    // Stage 1
    1) Texturkoordinaten verändern / berechnen
    2) MultitextUnit 0 aktivieren/wählen
    3) glEnable(GL_TEXTURE_2D);
    4) glBlendFunc(GL_ONE, GL_ZERO)
    5) glEnable(GL_BLEND);
    6) glColor3f(1.0f, 1.0f, 1.0f);
    7) Textur ("textures/sfx/firegorre.tga") binden
    
    // Stage 2
    8) MultitextUnit 1 aktivieren/wählen
    9) glEnable(GL_TEXTURE_2D);
    10) glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);   // ( = blend)
    11) glEnable(GL_BLEND);
    12) glColor3f(1.0f, 1.0f, 1.0f);
    13) Textur ("textures/gothic_door/skullarch_b.tga") binden
    
    // Stage 3
    14) MultitextUnit 2 aktivieren/wählen
    15) glEnable(GL_TEXTURE_2D);
    16) glBlendFunc(GL_DST_COLOR, GL_ZERO);  // ( = filter)
    17) glEnable(GL_BLEND);
    18) glColor3f(1.0f, 1.0f, 1.0f);
    19) Lightmap binden
    
    20) glDrawElements() oder so
    

    Stimmt das so?

    Dankeschön
    Tim



  • Fast, du musst noch die Texturtransformation und "rgbGen identity" berücksichtigen.

    grüße



  • David_pb schrieb:

    Fast, du musst noch die Texturtransformation und "rgbGen identity" berücksichtigen.

    xindon schrieb:

    1. Texturkoordinaten verändern / berechnen
    2. glColor3f(1.0f, 1.0f, 1.0f);

    Ist es das nicht?

    6.3.2 rgbGen identity
    Colors are assumed to be all white (1.0,1.0,1.0). All filters stages (lightmaps, etc) will get this by default.

    :edit:
    Ich hab jetzt schon mehrfach die Methode glTexEnvf() gesehen. Kann ich damit erreichen, dass die Türtextur ÜBER die Flammentexture gemalt wird und nicht wie bei mir gemischt wird?

    Tim


Anmelden zum Antworten