Avatar billede lemon Nybegynder
29. februar 2004 - 18:43 Der er 6 kommentarer og
1 løsning

Direct3D og textures

Jeg har et problem med at få textures til at lægge sig rigtigt på en PrimitiveType.TriangleStrip. Jeg koder i .NET/C# og DirectX 9, men har oprettet spørgsmålet her, under C/C++ da jeg går ud fra at der er flere 3D eksperter her.

Problemet er som følger:

Jeg opretter en række vertices med denne kode.. (det burde være stort set det samme i C# som i C++)

_vertices = (CustomVertex.PositionTextured[])_vertexBuffer.Lock(0,0);
_vertices[0].SetPosition(new Vector3(-width, 1.0f, -height));
_vertices[1].SetPosition(new Vector3(-width, 1.0f, height));
_vertices[2].SetPosition(new Vector3(width, 1.0f, -height));
_vertices[3].SetPosition(new Vector3(width, 1.0f, height));
_vertices[4].SetPosition(new Vector3(-width, 1.0f, -height));
_vertices[5].SetPosition(new Vector3(-width, 1.0f, height));
for(idx = 0; idx < 4; idx++)
{
    _vertices[idx].Tv = 1.0f;
    _vertices[idx].Tu = idx;
}
for(idx = 4; idx < 6; idx++)
{
    _vertices[idx].Tv = 0.0f;
    _vertices[idx].Tu = idx - 4;
}

Disse 6 vertices danner en flad firkant, men når jeg smider en texture på ser det helt forkert ud (texturen bliver nemlig vredet ud af form).

Så mit spørgsmål er; hvordan får jeg en kvadratisk texture (100x100 px) til at ligge på en kvadrat, bestående af fire trekanter (2x top og 2x bund).

For god ordens skyld vil jeg lige tilføje følgende skitse af trekanternes pladsering:

Top:
1 3
|\|
0 2

Bund:
4_
|
5
Avatar billede jpk Nybegynder
01. marts 2004 - 10:54 #1
Der er en del ting jeg er i tvivl om mht. dit problem/kode:

1) Med en triangle strip er det kun nødvendigt med 4 vertices for at lave en firkant, hvorfor vil du bruge 6?
2) Hvis du vil fitte en hel texture på et kvadrat, skal dine texture koordinater gå fra 0->1 for både tu og tv, du bruger fra 0->3 for tu..?

Du kunne fx gøre således for at lave et kvadrat dækket af en texture:

CustomVertex.PositionTextured[] _vertices = new CustomVertex.PositionTextured[4];
_vertices[0].SetPosition(new Vector3(-1.0f, 1.0f, 1.0f));
_vertices[1].SetPosition(new Vector3(1.0f, 1.0f, 1.0f));
_vertices[2].SetPosition(new Vector3(-1.0f, -1.0f, 1.0f));
_vertices[3].SetPosition(new Vector3(1.0f, -1.0f, 1.0f));
_vertices[0].Tu = 0.0f;
_vertices[0].Tv = 0.0f;
_vertices[1].Tu = 1.0f;
_vertices[1].Tv = 0.0f;
_vertices[2].Tu = 0.0f;
_vertices[2].Tv = 1.0f;
_vertices[3].Tu = 1.0f;
_vertices[3].Tv = 1.0f;
Avatar billede jpk Nybegynder
01. marts 2004 - 11:15 #2
Husker du iøvrigt unlock?

_vertexBuffer.Unlock();
Avatar billede lemon Nybegynder
01. marts 2004 - 12:29 #3
Jeg havde forstået det sådan, at en trekant kun kunne have en texture på een side og at der derfor skulle være en slags "top og bund" for at den bliver tegnet uanset hvilken retning den bliver set fra. Men jeg kan da se på ovenstående at det ikke er nødvendigt. _vertexBuffer.Unlock(); har jeg husket, fik den bare ikke pastet med i spørgsmålet.

Nå men nu virker det jo :) Du skulle bare vide hvor længe jeg har rodet med det stads - men sådan er det jo når man ikke helt har fattet hvad Tu og Tv gør. :)
Avatar billede jpk Nybegynder
01. marts 2004 - 12:38 #4
Om man kan se en primitive fra begge sider afhænger af hvilken cull mode du bruger, hvis du gør sådan her:

(dev er dit Device)
dev.RenderState.CullMode = Cull.None;

Kan den ses fra begge sider...


Hvis du er begynder mht. DX, kan du sansynligvis få meget ud af de tutorials der følger med SDK'en...
Avatar billede lemon Nybegynder
01. marts 2004 - 12:48 #5
Hehe, der kan man bare se. :) Når SDK-dokumentationen kommer i en C# version bliver det hele nok lettere - ind til da må jeg nøjes med at bruge C# tutorials og C++ dokumentation.
Avatar billede jpk Nybegynder
01. marts 2004 - 13:02 #6
Hmm, SDK'en indeholder da C# dokumentation..?

Du kan evt. downloade denne:
http://www.microsoft.com/downloads/details.aspx?FamilyID=61cdd2d4-c67e-4bdf-8bde-99709b090ed6&DisplayLang=en
Avatar billede lemon Nybegynder
01. marts 2004 - 13:13 #7
OMG Det var en fejl 40! Jeg har for vane at åbne .NET Framework SDK Docs når jeg skal læse om .NET og DX 9.0 SDK Docs når jeg skal læse om DX. Havde slet ikke set at der var blevet tilføjet et Managed DX punkt under VS.NET Doc'en.

Endnu en gang tak.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester