MultiTexturing (DirectX9)



  • Angenommen ich habe eine sehr große Mauer, bestehend aus 4 Vertices und 2 Dreiecken. Auf die 0. Texturschicht kommt die Mauertextur. Auf Texturschicht 1 soll eine Lightmap. Wenn ich ich für Texturschicht 1 die selben Texturkoordinaten von Stufe 0 benutze, dann wird ja die Lightmap über die ganze Mauer gespannt. Ich möchte jedoch den kleinen Lichtfleck (die Lightmap) genau in die Mitte der Mauer setzen, ohne dass die Lightmap gestreckt wird. Im Moment fällt mir dazu jedoch selbst bei Verwendung von eigenen Texturkoordinaten bei Schicht1 keine Lösung ein. Gibt es einen Trick um die kleine Lightmap in die Mitte der Mauer zu kleben, OHNE den VertexCount der Mauer zu erhöhen?



  • Was spricht nochmal gegen eigene Texturkoordinaten für die Lightmaps? Habe ich nicht ganz mitbekommen.
    Wenn dir die Lightmap bei einer zu großen Wand zu gestreckt aussieht kannst du entweder die Mauerstücke verkleinern oder eine größere Lightmap verwenden.



  • Headhunter schrieb:

    Was spricht nochmal gegen eigene Texturkoordinaten für die Lightmaps? Habe ich nicht ganz mitbekommen.

    Nichts. WENN es eine elegante Lösung dafür gibt, dann NUR mittels eines zweiten Texturkoordinatenpaares.

    Wenn dir die Lightmap bei einer zu großen Wand zu gestreckt aussieht kannst du entweder die Mauerstücke verkleinern oder eine größere Lightmap verwenden.

    Ja. Aber gerade das Verändern der Lightmap wollte ich eben verhindern.

    Nochmal zur Verdeutlichung was ich gerne hätte:

    ----------------
    |              |
    |    |----|    |
    |    |    |    |
    |    |----|    |
    |              |
    |--------------|
    

    Das große Rechteck ist die Mauer mit Mauertextur und das innere Rechteck soll die Lightmap sein. Nur an den vier Eckpunkten der Mauer befinden sich Vertices.
    So wie ich das sehe gibt es dafür keine Möglichkeit.



  • Kann zwar kaum programmieren, aber ich kenne mich recht gut im 3d-models erstellen, skinnen usw. aus. Von meinem Wissen aus gibts da kaum Möglichkeiten. Wenn du die Koordinaten "verkleinerst" wird trotzdem die ganze Mauer mit der Lightmap ausgefüllt, sie wird halt dann "gekachelt". Die einzige Methode die ich wüsste ohne die Polyzahl zu erhöhen, wäre eine Alphamap zu machen, wo nur der kleine Bereich den du sehen willst weiß ist und der rest der Mauer schwarz. Vielleicht kann man in die Richtung auch was programmieren so shadermäßig. Falls das der einzige Weg sein sollte würde ich doch die paar mehr polys in kauf nehmen.



  • Du hast ein Viereck ABCD. Die Textur wird komplett auf das Viereck gestreckt. Du kannst nur die Koordinaten auf der Textur auswählen, die in die Ecken gestreckt werden sollen.

    ::edit::
    Nimm die 4 mehr Eckpunkte in Kauf. Wenn es so viele Mauern enthält, dass dies gravierned wäre, macht dein Spiel kein Spaß 😛



  • interpreter schrieb:

    Im Moment fällt mir dazu jedoch selbst bei Verwendung von eigenen Texturkoordinaten bei Schicht1 keine Lösung ein. Gibt es einen Trick um die kleine Lightmap in die Mitte der Mauer zu kleben, OHNE den VertexCount der Mauer zu erhöhen?

    Du könntest andere Texturkoordinaten bei Schicht1 benutzen.

    Bye, TGGC (Das Jahr des Helden)



  • Hi,

    Für dein Problem gibt es durchaus eine Lösung!
    Dazu mußt du folgende Aufrufe ausführen (falls du mit DirectX9 arbeitest).

    pD3DDevice->SetSamplerState(1, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP);
    pD3DDevice->SetSamplerState(1, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP);

    (nicht getestet, sollte aber funktionieren)

    Die Texturkoordinaten kannst du z.B. jeweils von -1 bis 2 gehen lassen.
    Das Ergebnis ist eine auf deiner Wand zentrierte Textur. In den Bereichen außerhalb von 0 - 1 wird die jeweilige Randfarbe der Textur benutzt.

    Für OpenGL gibt es mit Sicherheit ähnliche Methoden. Stichwort: texture - clamp

    Hier noch einige Infos (aus dem SDK kopiert)

    IDirect3DDevice9::SetSamplerState Method
    --------------------------------------------------------------------------------
    Sets the sampler state value.

    Syntax

    HRESULT SetSamplerState( DWORD Sampler,
    D3DSAMPLERSTATETYPE Type,
    DWORD Value
    );

    typedef enum _D3DSAMPLERSTATETYPE {
    D3DSAMP_ADDRESSU = 1,
    D3DSAMP_ADDRESSV = 2,
    D3DSAMP_ADDRESSW = 3,
    D3DSAMP_BORDERCOLOR = 4,
    D3DSAMP_MAGFILTER = 5,
    D3DSAMP_MINFILTER = 6,
    D3DSAMP_MIPFILTER = 7,
    D3DSAMP_MIPMAPLODBIAS = 8,
    D3DSAMP_MAXMIPLEVEL = 9,
    D3DSAMP_MAXANISOTROPY = 10,
    D3DSAMP_SRGBTEXTURE = 11,
    D3DSAMP_ELEMENTINDEX = 12,
    D3DSAMP_DMAPOFFSET = 13,
    D3DSAMP_FORCE_DWORD = 0x7fffffff
    } D3DSAMPLERSTATETYPE;

    typedef enum _D3DTEXTUREADDRESS {
    D3DTADDRESS_WRAP = 1,
    D3DTADDRESS_MIRROR = 2,
    D3DTADDRESS_CLAMP = 3,
    D3DTADDRESS_BORDER = 4,
    D3DTADDRESS_MIRRORONCE = 5,
    D3DTADDRESS_FORCE_DWORD = 0x7fffffff
    } D3DTEXTUREADDRESS;

    D3DTADDRESS_WRAP
    Tile the texture at every integer junction. For example, for u values between 0 and 3, the texture is repeated three times; no mirroring is performed.

    D3DTADDRESS_MIRROR
    Similar to D3DTADDRESS_WRAP, except that the texture is flipped at every integer junction. For u values between 0 and 1, for example, the texture is addressed normally; between 1 and 2, the texture is flipped (mirrored); between 2 and 3, the texture is normal again; and so on.

    D3DTADDRESS_CLAMP
    Texture coordinates outside the range [0.0, 1.0] are set to the texture color at 0.0 or 1.0, respectively.

    D3DTADDRESS_BORDER
    Texture coordinates outside the range [0.0, 1.0] are set to the border color.

    D3DTADDRESS_MIRRORONCE
    Similar to D3DTADDRESS_MIRROR and D3DTADDRESS_CLAMP. Takes the absolute value of the texture coordinate (thus, mirroring around 0), and then clamps to the maximum value. The most common usage is for volume textures, where support for the full D3DTADDRESS_MIRRORONCE texture-addressing mode is not necessary, but the data is symmetric around the one axis.

    D3DTADDRESS_FORCE_DWORD
    Forces this enumeration to compile to 32 bits in size. Without this value, some compilers would allow this enumeration to compile to a size other than 32 bits. This value is not used.



  • Hiho,

    eure Tipps haben mir sehr geholfen (außer dem von TGGC, der aufgrund mangelnden Textverständnisses nicht zur Lösung beitragen konnte^^).
    Je nach gewünschten Effekt benutze ich jetzt ein paar zusätzliche Vertices oder den Texture Adressierungs-Modus Clamp. (danke@mac_bu , Clamp war GENAU das, was ich gesucht habe:)



  • interpreter schrieb:

    außer dem von TGGC, der aufgrund mangelnden Textverständnisses nicht zur Lösung beitragen konnte^^.

    Ich erklär dir meinen Text gern noch einmal, wenn du ihn noch nicht verstanden hast. Was ist denn unklar?

    Bye, TGGC (Das Jahr des Helden)



  • TGGC schrieb:

    interpreter schrieb:

    außer dem von TGGC, der aufgrund mangelnden Textverständnisses nicht zur Lösung beitragen konnte^^.

    Ich erklär dir meinen Text gern noch einmal, wenn du ihn noch nicht verstanden hast. Was ist denn unklar?

    Bye, TGGC (Das Jahr des Helden)

    Kannst es wohl nicht verkraften, dass dein Posting total sinnlos war 🙄



  • Vielleicht verkraftest du nicht, den Sinn nicht zu verstehen?

    Bye, TGGC (Das Jahr des Helden)



  • Extra für dich nochmal (auch wenn man aufgrund deiner vergangenen Postings leicht abschätzen kann, dass du zu stur bist um es einzusehen):

    1. Posting:

    Im Moment fällt mir dazu jedoch selbst bei Verwendung von eigenen Texturkoordinaten bei Schicht1 keine Lösung ein

    6. Posting:

    Du könntest andere Texturkoordinaten bei Schicht1 benutzen.


Anmelden zum Antworten