JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.phpMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Textur erstellen

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 19.04.2005, 17:16    Titel: Textur erstellen Antworten mit Zitat

Sind die Berechnungen beim kopieren richtig?

CPP:
   Log << LOGI("Die Textur erzeugen");
   LPDIRECT3DTEXTURE9 NewTexture=NULL;

   //die daten in ne neue Textur schreiben:
   Device->CreateTexture(Header2.biWidth, Header2.biHeight, 1,//kein mipmapping
                  0, D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, &NewTexture, NULL);
   if(NULL==NewTexture)
   {
      Log << LOGE("Textur konnte nciht erzeugt werden!");
      return NULL;
   }

   D3DLOCKED_RECT LocketRect;
   if(FAILED(NewTexture->LockRect(0, &LocketRect, NULL, D3DLOCK_DISCARD)))
   {
      Log << LOGI("Textur konnte net gesperrt werden");
      return NewTexture;//ok, der inhalt ist scheiße, aber imemrhin etwas...
   }
   else
   {
      Log << LOGI("Textur gesperrt");
   }

   //die textur mit einer farbe füllen:
   {

      for(int y=0; y<Header2.biHeight; ++y)
      {
         //die reihen durchgehen:
         for(int x=0; x<Header2.biWidth; ++x)
         {   
            //rot:
            *(static_cast<char*>(LocketRect.pBits)+y*(Header2.biWidth*4+LocketRect.Pitch)+0)=128;
            //grün
            *(static_cast<char*>(LocketRect.pBits)+y*(Header2.biWidth*4+LocketRect.Pitch)+1)=255;
            //blau
            *(static_cast<char*>(LocketRect.pBits)+y*(Header2.biWidth*4+LocketRect.Pitch)+2)=255;
            //alpha
            *(static_cast<char*>(LocketRect.pBits)+y*(Header2.biWidth*4+LocketRect.Pitch)+3)=255;
         }
      }

   }

   NewTexture->UnlockRect(0);
   Log << LOGI("Textur wurde erzeugt");

Tja, stürtzt immer ab. Im Prinzip steht aj alles im Code. Wollte halt erstmal die Textur einfarbig machen. Später kann ich dann ja jedne einzelnen Pixel die Farbe ausm Bild laden.
Achja, es gibt ne AcdcesViolation, ziemliehc weit am Ende, also wenn das kopieren schon fast fertig wäre...
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
OLiver
Super JLI'ler


Alter: 33
Anmeldedatum: 29.06.2003
Beiträge: 306
Wohnort: Jena
Medaillen: Keine

BeitragVerfasst am: 19.04.2005, 17:29    Titel: Antworten mit Zitat

Addiere nicht die Breite mit dem Pitch, der Pitch ist schon mit drinnen (wird wahrscheinlich der Fehler sein)

Und wo ist x in der Berechnung? Question
_________________
http://www.sieder25.org/ (Siedler 2 - Remake)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
HomeLess_PunkDrummer
JLI Master Trainee


Alter: 36
Anmeldedatum: 28.11.2004
Beiträge: 583
Wohnort: Alter Joghurtbecher an der A4
Medaillen: Keine

BeitragVerfasst am: 19.04.2005, 17:33    Titel: Antworten mit Zitat

Ich dachte es müsste y* Width + x + 0||1||2||3 (Farbtiefe) sein.
_________________
"Was die Götter angeht, so ist es mir unmöglich, zu wissen, ob sie existieren oder nicht, noch, was ihre Gestalt sei. Die Kräfte, die mich hindern, es zu wissen, sind zahlreich, und auch ist die Frage verworren und das menschliche Leben kurz."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 19.04.2005, 17:41    Titel: Antworten mit Zitat

tja, mal die weite, das bedeutet, dei breite der Textur + den Pitch.
Die breite bezieht sich auf die genaue Breite des Bildes, also muzss ich den Pitch noch hinzuaddieren. LDas mitd em x stimmt, ich addiere jetzt noch immer ien x*4. Aber es strtzt immer noch ab.
[Edit]Ich denke mal die Werte müssen zu groß sein, weil inenrhalb des Speichers kann ja passieren was will, gibt da ja keine AccessVioltion. Also ist irgendwo zu viel...
Achja, der Pitch hat einen wert von 360, ist das nicht ein bisschen viel?
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
HomeLess_PunkDrummer
JLI Master Trainee


Alter: 36
Anmeldedatum: 28.11.2004
Beiträge: 583
Wohnort: Alter Joghurtbecher an der A4
Medaillen: Keine

BeitragVerfasst am: 19.04.2005, 17:44    Titel: Antworten mit Zitat

Immer noch am Schluss oder in der Mitte? Oder bei 75%? Dann könnte es sein dass du die Farbtiefe falsch gelesen hast.
_________________
"Was die Götter angeht, so ist es mir unmöglich, zu wissen, ob sie existieren oder nicht, noch, was ihre Gestalt sei. Die Kräfte, die mich hindern, es zu wissen, sind zahlreich, und auch ist die Frage verworren und das menschliche Leben kurz."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 19.04.2005, 17:46    Titel: Antworten mit Zitat

CPP:
      for(int y=0; y<Header2.biHeight; ++y)
      {
         //die reihen durchgehen:
         for(int x=0; x<Header2.biWidth; ++x)
         {   
            //blau:
            *(static_cast<char*>(LocketRect.pBits)+y*4*(Header2.biWidth)+x*4+0)=255;
            //grün
            *(static_cast<char*>(LocketRect.pBits)+y*4*(Header2.biWidth)+x*4+1)=0;
            //rot
            *(static_cast<char*>(LocketRect.pBits)+y*4*(Header2.biWidth)+x*4+2)=0;
            //alpha
            *(static_cast<char*>(LocketRect.pBits)+y*4*(Header2.biWidth)+x*4+3)=255;
         }
      }

Hm, so geht es irgendwie... Ich frage mich nur wie das jetzt mit dem Pitch funktioniert. Es wird wohl genau richtig viel geschrieben, weil die Textur komplett gefüllt ist, und auch kein Zugriffsfehelr drinne ist.
Kapier ich net ganz. Muss ich gleich mal weiter testen...
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
OLiver
Super JLI'ler


Alter: 33
Anmeldedatum: 29.06.2003
Beiträge: 306
Wohnort: Jena
Medaillen: Keine

BeitragVerfasst am: 19.04.2005, 17:47    Titel: Antworten mit Zitat

Nochmal: der Pitch ist die Breite PLUS die zsätzlichen Informationen!

Steht übrigens sogar im Buch. Wink
_________________
http://www.sieder25.org/ (Siedler 2 - Remake)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Patrick
Dark JLI Master



Anmeldedatum: 25.10.2004
Beiträge: 1895
Wohnort: Düren
Medaillen: Keine

BeitragVerfasst am: 19.04.2005, 18:01    Titel: Antworten mit Zitat

Ich hab in einem Tutorial gezeigt wie man sowas macht Very Happy

OLiver
Im Buch stand auch das ein DWORD ein unsigned int ist Wink Also naja...
_________________
'Wer der Beste sein will muss nach Perfektion streben und jede Gelegenheit nutzen sich zu verbessern.' - KIA
[ German Game Dev | Boardsuche hilft sehr oft | Google rockt | Wie man Fragen richtig stellt | ICQ#: 143040199 ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
OLiver
Super JLI'ler


Alter: 33
Anmeldedatum: 29.06.2003
Beiträge: 306
Wohnort: Jena
Medaillen: Keine

BeitragVerfasst am: 19.04.2005, 18:05    Titel: Antworten mit Zitat

Zitat:

Im Buch stand auch das ein DWORD ein unsigned int ist Wink Also naja...


Was gaubst du, warum ich "sogar" gesagt habe. Smile Trotzdem stimmt es. Razz
_________________
http://www.sieder25.org/ (Siedler 2 - Remake)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
DirectXer
Dark JLI'ler



Anmeldedatum: 05.02.2005
Beiträge: 1201
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 19.04.2005, 18:08    Titel: Antworten mit Zitat

Patrick hat Folgendes geschrieben:
Ich hab in einem Tutorial gezeigt wie man sowas macht Very Happy

OLiver
Im Buch stand auch das ein DWORD ein unsigned int ist Wink Also naja...


das heißt ja net, dass alles im Buch falsch is, manche Sachen sin ganz nützlich(und sogar richtig Wink )

Aber @OLiver
stimmt, die Bits sin das Grundsätzliche und der Pitch sin das + manche Informations dadrüber
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 19.04.2005, 20:12    Titel: Antworten mit Zitat

@Patrick In deinem Tut sind 16bit ich benutez 32 bit, das ist was ganz anderes (laden geht ja aber das konvertieren in die textur...)

Im Buch steht aber auch folgendes:

D3DCOLOR * PixelXY=Pixels[y*Pitch+x];

Das heißt, es kommt erst eine Riehe Bildinformationen, dann ein bisschen Kram, dann die zweitte Reihe usw. Und genau so wie da habe ich auch versucht, den Schreibvorgang zu realisieren. Die Größe einer Zeile ist die Breite des Bildes + den Pitch, oder etwa nicht???
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Patrick
Dark JLI Master



Anmeldedatum: 25.10.2004
Beiträge: 1895
Wohnort: Düren
Medaillen: Keine

BeitragVerfasst am: 19.04.2005, 20:15    Titel: Antworten mit Zitat

CPP:
    for (int cy=0; cy<InfoHeader.biHeight; ++cy)
    {
        for (int cx=0; cx<InfoHeader.biWidth; ++cx)
        {
            if (bpp == 16)
            {
                    // Umrechnung der einzelnen Farbwerte von 24 in 16 Bit
                unsigned char   blue  = (data[(cy*InfoHeader.biWidth + cx)*3 + 0]) >> 3,
                                green = (data[(cy*InfoHeader.biWidth + cx)*3 + 1]) >> 3,
                                red   = (data[(cy*InfoHeader.biWidth + cx)*3 + 2]) >> 3;

                    // Pixel in 16 Bit Farbe schreiben
                ((unsigned short*)dest)[cx + (cy*pitch)] = (blue%32) + ((green%64) << 6) + ((red%32) << 11);
            }
            else
            {
                    // Farbe mit Alpha = 100 % initialisieren
                unsigned long color = 0xff000000;

                    // Kopiere 24 Bit Farbe in den 32 Bit Wert
                memcpy (&color, &data[(cy*InfoHeader.biWidth + cx)*3], sizeof(unsigned char)*3);

                    // Pixel in 32 Bit Farbe schreiben
                ((unsigned long*)dest)[cx + (cy*pitch)] = color;
            }
        }
    }

_________________
'Wer der Beste sein will muss nach Perfektion streben und jede Gelegenheit nutzen sich zu verbessern.' - KIA
[ German Game Dev | Boardsuche hilft sehr oft | Google rockt | Wie man Fragen richtig stellt | ICQ#: 143040199 ]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
OLiver
Super JLI'ler


Alter: 33
Anmeldedatum: 29.06.2003
Beiträge: 306
Wohnort: Jena
Medaillen: Keine

BeitragVerfasst am: 20.04.2005, 12:56    Titel: Antworten mit Zitat

Zitat:

D3DCOLOR * PixelXY=Pixels[y*Pitch+x];


Steht da irgendwas von einer Breite? Rolling Eyes
Wenn x die Bildinformationen sind und 0 die zusätzlichen, sieht das dann so aus:

xxxxxxxxxxxxxxxxxxxx0000000000
xxxxxxxxxxxxxxxxxxxx0000000000
xxxxxxxxxxxxxxxxxxxx0000000000
xxxxxxxxxxxxxxxxxxxx0000000000

Der Pitch ist hier 30, also die gesamte Zeile. Mach einfach das Header2.biWidth*4 weg, dann gehts:

CPP:
//rot:
            *(static_cast<char*>(LocketRect.pBits)+y*(LocketRect.Pitch)+0)=128;
            //grün
            *(static_cast<char*>(LocketRect.pBits)+y*(LocketRect.Pitch)+1)=255;
            //blau
            *(static_cast<char*>(LocketRect.pBits)+y*(LocketRect.Pitch)+2)=255;
            //alpha
            *(static_cast<char*>(LocketRect.pBits)+y*(LocketRect.Pitch)+3)=255;

_________________
http://www.sieder25.org/ (Siedler 2 - Remake)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum