Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Gotbread

Alter Hase

  • »Gotbread« ist der Autor dieses Themas

Beiträge: 421

Beruf: Student (Etechnik) + Hiwi

  • Private Nachricht senden

1

14.01.2009, 15:40

vertices aus vertextextur werden nicht angezeigt

hallo

ich möchte eine textur im vertexshader sampeln. die texturkoordinaten
werden in einem vertexbuffer übergeben. im vertexshader werden die
koordinaten auf der textur gesampelt. das ergebniss wird als position für
den vertex genommen.

shader:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
float4x4 WorldMatrix;
float4x4 ViewMatrix;
float4x4 ProjMatrix;

struct vs_output
{
    float4 pos : POSITION;
    float4 color : TEXCOORD1;
};
vs_output vs_main(float4 pos : POSITION)
{
    vs_output outp;
    pos.w = 0.f; // erste mipmap ebene
    outp.pos = tex2Dlod(samp, pos);
    outp.pos = mul(outp.pos, WorldMatrix);
    outp.pos = mul(outp.pos, ViewMatrix);
    outp.pos = mul(outp.pos, ProjMatrix);
    outp.color = float4(1.f, 1.f, 1.f, 0.f);
    return outp;
}
float4 ps_main1(float4 col : TEXCOORD1) : COLOR
{
    return col;
}
TECHNIQUE T2
{
    PASS P1
    {
        VertexShader = compile vs_3_0 vs_main();
        PixelShader = compile ps_2_0 ps_main();
    }
}


im hautprogramm erzeuge ich einfach eine D3DFMT_A32B32G32R32F
textur (32 * 32 pixel), kopiere die vertexdaten rein.

danach erzeuge ich noch einen vertexbuffer der die texturkoordinaten
beinhaltet. da ich nur die ersten 3 pixel zu einem dreieck verbinden
will. sind die koordinaten

1/32, 0, 0
2/32, 0, 0
3/32, 0, 0

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
// positionsdaten

float vertices[][4] = 
{
    {-1.f, 0.f, 0.f, 1.f},
    { 1.f, 0.f, 0.f, 1.f},
    { 0.f, 1.f, 0.f, 1.f},
};

// texturkoordinaten als XYZ getarnt

float pos[][4] =
{
    {1.f / 32.f, 0.f, 0.f, 0.f},
    {2.f / 32.f, 0.f, 0.f, 0.f},
    {3.f / 32.f, 0.f, 0.f, 0.f}
};

HRESULT hr;

// effekt erzeugen


hr = dev->CreateTexture(32, 32, 1, 0, D3DFMT_A32B32G32R32F, D3DPOOL_MANAGED, &postex, 0);

hr = dev->CreateVertexBuffer(sizeof(pos), 0, D3DFVF_XYZ | D3DFVF_DIFFUSE, D3DPOOL_MANAGED, &vertexbuffer, 0);


void *vptr;
hr = vertexbuffer->Lock(0, 0, &vptr, 0);
memcpy(vptr, pos, sizeof(pos));
vertexbuffer->Unlock();

D3DLOCKED_RECT lockedrect;
hr = postex->LockRect(0, &lockedrect, 0, 0);
memcpy(lockedrect.pBits, vertices, sizeof(vertices));
postex->UnlockRect(0);

// fehlerkontrolle gekürzt


beim rendern setze ich einfach den effekt ein und rendere den buffer

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
dev->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0, 0, 0), 1.f, 0);
dev->BeginScene();

dev->SetStreamSource(0, vertexbuffer, 0, sizeof(float) * 4);
dev->SetRenderState(D3DRS_LIGHTING, 0);
dev->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
dev->SetFVF(D3DFVF_XYZ | D3DFVF_DIFFUSE);

dev->SetTexture(0, postex);

UINT passes;
effect->SetTechnique("T2");

effect->Begin(&passes, 0);

// matrizen wurden richtig gesetzt


effect->SetMatrix("WorldMatrix", &world);
effect->SetMatrix("ViewMatrix", &view);
effect->SetMatrix("ProjMatrix", &proj);

for (unsigned i = 0; i < passes; ++i)
{
    effect->BeginPass(i);
    dev->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1);
    effect->EndPass();
}

effect->End();

dev->EndScene();
dev->Present(0, 0, 0, 0);


ich habe leider keine ahnung wo der fehler liegt, das bild ist wunderschön
schwarz, nur das dreieck sehe ich nicht.
Mfg Goti
www.gotbread.bplaced.net
viele tolle spiele kostenlos, viele hardware-basteleien :)

"Es ist nicht undicht, es läuft über" - Homer Simpson

Dofter

Treue Seele

Beiträge: 159

Wohnort: im wunderbaren EBERMANNSTADT

Beruf: Schüler^^

  • Private Nachricht senden

2

14.01.2009, 15:58

musst du den alphawert der outputcoler vllt auch auf 1 setzen:

Quellcode

1
   outp.color = float4(1.f, 1.f, 1.f, 1.f); 
"Wo kämen wir hin, wenn alle sagten, wo kämen wir hin, und keiner ginge,
um zu sehen, wohin wir kämen, wenn wir gingen"

Gotbread

Alter Hase

  • »Gotbread« ist der Autor dieses Themas

Beiträge: 421

Beruf: Student (Etechnik) + Hiwi

  • Private Nachricht senden

3

14.01.2009, 16:04

ganz übersehen :D
am gesamtergebnis schwarz ändert isch jedoch nichts.

ist das herangehen überhaupt möglich?

also die daten in der textur zu speichern?
Mfg Goti
www.gotbread.bplaced.net
viele tolle spiele kostenlos, viele hardware-basteleien :)

"Es ist nicht undicht, es läuft über" - Homer Simpson

ChrisJ

Alter Hase

Beiträge: 487

Wohnort: Schweich

Beruf: Schüler

  • Private Nachricht senden

4

15.01.2009, 11:26

vielleicht liegts an deiner grafikkarte. tex2Dlod, sprich sampeln im vertexshader, wird nicht von allen karten unterstüzt.
"Don't trust your eyes: They are a hell of a lot smarter than you are"

Gotbread

Alter Hase

  • »Gotbread« ist der Autor dieses Themas

Beiträge: 421

Beruf: Student (Etechnik) + Hiwi

  • Private Nachricht senden

5

15.01.2009, 14:35

meine karte unterstützt aber vs 3.0 und fehler beim erstellen des effektes
erhalte ich auch nicht...
Mfg Goti
www.gotbread.bplaced.net
viele tolle spiele kostenlos, viele hardware-basteleien :)

"Es ist nicht undicht, es läuft über" - Homer Simpson

Werbeanzeige