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

1

03.02.2008, 11:42

3D-Grafikprogrammierung; Marius Apetri-2.Auflage

Hallo Leute,

ich hab mir vor kurzem das oben angegebene Buch gekauft, und hab gleuich am Anfang Schwierigkeiten.
Der Code ist direkt aus dem ersten Beispiel, welches einfach nur einmal direkt von der CD kopiert und geöffnet wurde.

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
37
38
39
40
41
42
#include <windows.h>

#include "screen_interface.h"
#include "palette.h"

MSG msg;
uchar key_pressed( void );

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int iCmdShow )
{
  // Beim Einstellen einer höheren Auflösung müssen auch die Konstanten inneralb der beiden

  // for()-Schleifen entsprechend angepasst werden


  screen_interface.open_window( hInstance, 640, 480, 32 );
  pixel_32 *screen = (pixel_32 *) screen_interface.get_screen_pointer();

  while( 1 )
  {
    if( key_pressed() ) break;

    for( long x=0 ; x<256 ; x++ )
       for( long y=0 ; y<480 ; y++ )
          screen[ y * 640 + x ] = palette[ x ];
  }
  
  screen_interface.release_screen_pointer();

  return msg.wParam;
}

uchar key_pressed( void )
{
  if( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) )
  {
    if( msg.message == WM_QUIT || msg.message == WM_KEYDOWN ) return 1;

    TranslateMessage( &msg );
    DispatchMessage( &msg );
  }

  return 0;
}


das ganze soll nur eine Art Farbpalette darstellen, ist jedoch anscheinend fehlerhaft, denn ich sehe die Farbpalette öfters hintereinander un ineinander hängend - und selbst das nur teilweise, könnt ihr mir weiterhelfen?

-auch ein hochstellen der Auflösung ändert daran nichts.

mft Triac

3dcoder

Frischling

Beiträge: 40

Wohnort: Krefeld

  • Private Nachricht senden

2

03.02.2008, 11:51

Hast du auch 32 Bit Farbtiefe eingestellt? Aber auch wenn das dann laufen sollte - der Programmcode sieht mir, milde gesagt, "seltsam" aus. Ich vermisse da eine vernünftige OO Herangehensweise.

Grüße
3dcoder

3

03.02.2008, 11:55

ja, mit der Anweisung

C-/C++-Quelltext

1
screen_interface.open_window( hInstance, 640, 480, 32 ); 

erstelle ich ein Fenster mit 640 x 480 und 32Bit.

ich dachte das hier in den for-Schleifen irgendein Fehler steckt, komm aber nicht drauf.

3dcoder

Frischling

Beiträge: 40

Wohnort: Krefeld

  • Private Nachricht senden

4

03.02.2008, 12:50

Soweit ich das weiß, ist die Farbtiefe global - d.h. wenn du 24 Bit in der Systemsteuerung eingestellt hast, aber ein Fenster mit 32 Bit "bestellst" kriegst du trotzdem eins mit 24 Bit.

Da das Programm direkt auf das Fenster schreibt würde natürlich durcheinanderkommen wenn es 32 Bit haben möchte aber 24 kriegt...

Aber das ist nur so eine Idee - wenn du deine Grafikeinstellungen schon auf 32 Bit stehen hast liegt der Fehler woanders.

Grüße
3dcoder

5

03.02.2008, 13:42

nein das mit der Farbtiefe stimmt schon, der Autor meint das eine Änderung der Auflösung Abhilfe schaffen könnte, es ändert jedoch leider nichts.

Ich hab inzwischen etwas herumexperimentiert und wenn ich bei den Schleifen folgende Werte einsetze, so bekomme ich dieses mal eine schöne Farbpalette, jedoch viel zu schmal um den gesamten Bildschirm auszufüllen - und das mehrmals nebeneinander und in insgesamt 2 Zeilen.

Die ersten Beispiele sind anscheinend mit Software-Rendering - und DirectDraw realisiert, denn ab den Hardware Beispielen tritt dieser Fehler nicht mehr auf.
Vielleicht fällt euch hierbei etwas auf.

mfg Triac

6

03.02.2008, 18:42

wenn ich 1024 x 768 einstelle, dann passt es mit der Farbpalette, und auch mit den anderen Beispielen, nur wieso?...

7

04.02.2008, 08:06

ich hab das ganze soeben mit einem Röhrenmonitor versucht, und da klappt es bei allen Auflösungen, nur wieso? das TFT kann doch genauso die angesprochenen Auflösungen (640x480; 800x600; 1024x768; 1280x1024)
wieso funktioneirt es bei TFT`s nur mit 1024x768?

hab es inzwischen auch schon am neuen Notebook getestet - wie gesagt bei TFT`s funktionierts nur mit 1024x768 - bei Röhrenmonitoren gehts bei allen Auflösungen.

hat wer von euch eine Lösung? bzw einen Ansatz

mfg Triac

...alles geschieht mittels Software-Rendering - weiß denn niemand eine Antwort??? :(

8

05.02.2008, 15:20

nochmal zusammenfassend:
##Software Rendering
#nur bei 1024x768 "normal", bei anderen Auflösungen
versertztes-verzerrtes Bild
#mit Röhrenmonitor funktioniert es jedoch mit jeder Auflösung
#mit Hardware-Rendering funktioniert es sowohl mit Röhrenmonitor, als
auch mit TFT - und das bei jeder Auflösung
##Hardware-Rendering
#funktioniert mit jeder Auflösung bei TFT`s und Röhrenmonitoren

wo kann hier der "Hund" begraben sein?

mfg Triac

9

12.08.2009, 22:18

Hi,

ich bin neu hier, und es tut mir gleich mal leid, dass ich so'nen alten Thread ausgrabe ;)

Ich seh das nur ungern, wenn Probleme nicht gelöst sind^^

Zur Frage, warum der Röhrenmonitor alle Auflösungen hinkriegt, der TFT aber nicht: TFTs sind für eine bestimmte Auflösung optimiert ("native Auflösung"), Röhrenmonitore nicht.

-> http://www.tomshardware.com/de/samsung-r…,news-5799.html

Ansonsten sitze ich gerade an eben diesem Beispiel aus dem Buch, und habe die while-Schleife so abgeändert:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
  while( 1 )
  {
    if( key_pressed() ) break;
    
     for( long x = 0 ; x < 1024 ; x++ )   // 1024 -> Breite der Auflösung

       for( long y = 0 ; y < 768 ; y++ )  // 768 -> Höhe

          screen[ y * 1024 + x ] = palette[ 3 ];
   
  }


So hat das dann den ganzen Bildschirm ausgefüllt. Die Hardwarebeschleunigung sorgt dann dafür, dass die Grafikkarte das auf die jeweiligen Auflösungen umrechnet, schätz ich mal.

10

19.09.2009, 17:51

Du musst eben auf den Stride aufpassen.
Da Bitmaps oder Textures oder Surfaces immer als binäre zweierpotenzen Platz im Speicher reservieren und somit eine Textur
immer von einer Größe zwei hoch n vorliegt, brauchst du den Stride davon.

Werbeanzeige