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

Renegade123

Alter Hase

  • »Renegade123« ist der Autor dieses Themas

Beiträge: 494

Wohnort: Berlin

Beruf: Certified Unity Developer

  • Private Nachricht senden

1

31.10.2012, 16:21

[C++ / DirectX] Sprites rendern per Shader

Heyho liebe Community,

ich habe zur Zeit ein Problem, dass ich nicht verstehe wie ich in DirectX9 mit C++ richtig Sprites rendere per Shader.

Meine Actor Klasse besitzt folgende Render Funktion:
http://codepad.org/onPPm1CX


Das funktioniert soweit erstmal super. Im Internet habe ich gefunden, wie ich Sprites rendere:

http://codepad.org/rCQ3QI33

Wie kann ich das nun "vereinigen", sprich das Sprite über den Shader rendern?

MfG René

PS: Irgendwie formatiert der den Code hier so eklig, deshalb mal lieber der Codepad Link!
Liebe Grüße,
René

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

2

31.10.2012, 16:47

Das Problem mit der Formatierung hatte ich auch schon. Wäre gut wenn du dazu schreibst, wie du den Code in den Browser gebracht hast. Hast du den Code hier direkt getippt? Hast du ihn in einem Programm geschrieben und wolltest ihn hier hin kopieren? Wenn ja, welches Programm war das und welche Version. Ich glaube ich hatte das Problem bei Code von Nodepad. Bin mir grad aber auch nicht sicher. Wie gesagt wäre gut wenn du da kurz was zu schreiben könntest. Gegebenenfalls machen wir für das Problem mal einen weiteren Thread auf.
Zu deinem eigentlichen Problem. Mir ist nicht klar wo nun das Problem genau liegt? Du hast doch ein Code Snippet, wie du deine Grafik rendern kannst. Ist dir nicht klar was da passiert? Und was genau meinst du mit "über den Shader rendern"? Möchtest du einen nachträglichen Effekt darauf anwenden, oder geht es dir nur um das einfache rendern?
Ist dir nicht klar wie du deinem Code sagst, dass diese Grafik mit deinem festgelegten Shader arbeitet?

edit:
Noch mal kurz dazu geschrieben. Du renderst ja eine Trianglelist in deinem Code. Genau an der Stelle würdest du dann halt deine Sprite rendern.

C-/C++-Quelltext

1
2
3
4
5
6
//Beginne Pass
        m_pFx->BeginPass(i);
        
        m_pSprite->Draw(m_pTexture,&rct,NULL, &m_position,0xFFFFFFFF);

        m_pFx->EndPass();

Wenn es das ist was du wissen wolltest.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Renegade123

Alter Hase

  • »Renegade123« ist der Autor dieses Themas

Beiträge: 494

Wohnort: Berlin

Beruf: Certified Unity Developer

  • Private Nachricht senden

3

31.10.2012, 16:59

Nun zur ersten Frage:
Ich habe den Code aus Visual Studio 2010 Version 10.0.30319.1 in den C++ Quellcode Tag kopiert. Er berücksichtigt dabei aber keine Tabs, Zeilenumbrüche oder Leerzeichen, so das der Code einfach unleserlich wird.

zur zweiten Frage:
Mir geht es nur im das eigentlich Rendern.
Im ersten Codesnippet füttere ich den Shader mit allen nötigen Informationen, setze die Textur etc. und iteriere über die Passes bis alles gerendert ist. Wie kann ich dem Shader aber jetzt die richtige Grafik aus dem Sprite geben, welches er rendern soll? Ich verstehe dabei nicht ganz recht, wie da die Sprite->Draw Funktion abläuft, denn ich benutzte ja bereits eine DrawIndixedPrimitive Funktion.

MfG René

edit:

Das habe ich bereits so versucht, aber er will dabei nichts anzeigen:

http://codepad.org/7g49uvs8
Liebe Grüße,
René

Flutschi

Treue Seele

Beiträge: 90

Wohnort: Schweiz

  • Private Nachricht senden

4

01.11.2012, 04:35

Der Code ist unleserlich weil du ihn im Editor-Tab vom Forum schreibst, und nicht im Quellcode-Tab... einfach nach der Überschrift das Tab wechseln, direkt hier oberhalb der Schriftart Editions dingens.. ;)

Offtopic, ich weis.
♥ SFML 2.0 Visual Express 2010 ♥

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

5

01.11.2012, 16:14

Wo und wie setzt du denn m_position oder m_iFrameWidth, etc? Wie das bei C++ läuft hab ich keine Ahnung. Wird die Textur auch richtig geladen? Hast du mal mit dem Debugger geguckt was genau passiert?
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Renegade123

Alter Hase

  • »Renegade123« ist der Autor dieses Themas

Beiträge: 494

Wohnort: Berlin

Beruf: Certified Unity Developer

  • Private Nachricht senden

6

01.11.2012, 18:32

Die Position des Actors wird über eine SetPosition Funktion festgelegt (die z Position über eine seperate SetLayer Funktion):

C-/C++-Quelltext

1
void SetPosition(float x, float y){ m_position  = D3DXVECTOR3(x, y, m_position.z); }



Die frameWidth des einzelnen Bildes über:

C-/C++-Quelltext

1
2
3
4
5
6
void CAnimationActor::SetSprite( IDirect3DDevice9* device, int frameNumber )
{
    m_iSpriteFrameNumber = frameNumber--; 
    D3DXCreateSprite(device, &m_pSprite);
    m_iFrameWidth = m_iWidth / frameNumber;
}


Der Actor wird in der Gameklasse dann so erstellt:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
    animTest = new CAnimationActor();
    animTest->Initialize(device);
    animTest->SetPosition(1.0f,1.0f);
    animTest->SetTexture(device, "animTest.png", 256, 64);
    animTest->SetSize(1.0f,1.0f);
    animTest->SetSprite(device,4);
    animTest->SetAnimationTime(5.0f);
    animTest->SetLayer(1.0f);
    theWorld->AddObject(animTest);


Das Animieren funktioniert jetzt auch einwandfrei, allerdings wundere ich mich, dass weder die Größe noch die Position stimmt. Bei meinen anderen Actors die "normal" gerendert werden, ist die Position der Mittelpunkt und die Größe gleich der Texturgröße. So wird eine Textur eingeladen( sowohl bei einem Animierten als auch bei einem Normalen):

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
void CActor::SetTexture( IDirect3DDevice9* device,std::string filename, int width, int height )
{
    LPCSTR temp = filename.c_str();

    D3DXCreateTextureFromFileEx(device, 
                                temp,
                                width,
                                height,
                                1,
                                0,
                                D3DFMT_UNKNOWN,
                                D3DPOOL_DEFAULT,
                                D3DX_DEFAULT,
                                D3DX_DEFAULT,
                                0,
                                NULL,
                                NULL,
                                &m_pTexture);

    m_iHeight = height;
    m_iWidth = width;
}


Was konkret ist der Unterschied bei der Sprite->Draw Funktion zwischen Center und Position? Es ändert nämlich nichts, wenn ich beide Werte auf NULL setze oder dort eine Position übergebe.


edit:

hier mal ein Bild zu meinem Problem:

(Link)


Uploaded with ImageShack.us
Liebe Grüße,
René

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Renegade123« (01.11.2012, 18:50)


Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

7

02.11.2012, 09:39

„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Renegade123

Alter Hase

  • »Renegade123« ist der Autor dieses Themas

Beiträge: 494

Wohnort: Berlin

Beruf: Certified Unity Developer

  • Private Nachricht senden

8

02.11.2012, 18:08

Da war ich natürlich als erstes, der Link bringt mir überhaupt nichts, wenn du mir nicht sagen kannst wo da der Unterschied steckt! Ich habe schon alles ausprobiert, beides geNULLt, beide auf D3DXVECTOR3(0.0f,0.0f,0.0f) gesetzte, oder auf D3DXVECTOR3(1.0f,1.0f,0.0f) was nach meinem Verständnis dann die rechte untere Ecke wäre. Oder eben nur die Hälfte für die Mitte. Das ändert alles rein gar nichts. Insbesondere brennt in mir immernoch die Frage der Skalierung, weil die hat ja zudem nichts damit zu tun ?!
Liebe Grüße,
René

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

9

02.11.2012, 18:17

Setz sie doch mal auf 50/50.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Renegade123

Alter Hase

  • »Renegade123« ist der Autor dieses Themas

Beiträge: 494

Wohnort: Berlin

Beruf: Certified Unity Developer

  • Private Nachricht senden

10

02.11.2012, 18:33

Das sagte ich ja bereits, auch ausprobiert, keine Änderung.

Gibt es noch eine andere Möglichkeit ein Sprite zu rendern? Kann man nicht eine Textur im Gesamten und dann die jeweils benötigte Textur in eine weitere Variable laden und diese mit Trianglelist rendern?
Liebe Grüße,
René

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Renegade123« (02.11.2012, 18:50)


Werbeanzeige