Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 18, 2025 19:59

Foren-Übersicht » Programmierung » Shader
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 25 Beiträge ]  Gehe zu Seite Vorherige  1, 2
Autor Nachricht
BeitragVerfasst: Do Jan 13, 2011 13:28 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 11, 2009 08:02
Beiträge: 532
Programmiersprache: pascal (Delphi 7)
Treiber wars nicht. Mein PC ist wieder da, der benutzt nen anderen Treiber, aber das Problem bleibt.
Jedenfalls hab ich mir überlegt, dass texture bei der Interpolation vielleicht auf 8 bit rundet, und die Treppen dadurch entstehen. Demnach müsste es wenn ich eine 16 bit Textur (gl_unsigned_short) benutze auf 16 bit runden, wodurch man keine Treppen mehr sehen dürfte. Und texelFetch könnte ich mir dann auch sparen. Nur: einmal abgesehen davon, dass ich es nicht schaffe, die Textur richtig zu laden, entstehen nachwievor Treppen (wobei kleiner sind die Treppen schon geworden, aber eben nur ein bisschen). Und nein, die Treppen sind nicht in der Textur drinnen, weil die sind wesentlich kleiner, als der Abstend zweier benachbarter Pixel.

edit: der code zum Laden der Textur:
Code:
//Data ist ein Pointer, bei dem die Texturdaten als single gespeichert werden, und würde benutzt, damit man sich auf der Landschaft bewegen kann, ist also hier recht unwesentlich
    type Arr = array of array of single;
    var
      j1, j2, j3, j4: integer;
      x, scale: single;
      Arr2: array of array of single;
      binData: array of array of word;
    begin
      hmap:= IMG_Load(PChar(ExtractFilePath(Application.ExeName) + filename));
      if hmap = nil then begin
        showMessage('No Texture Loaded');
        exit;
      end;
      glGenTextures(1, @result);
      glBindTexture(gl_texture_2d, result);
      glTexParameteri(gl_Texture_2d, gl_texture_mag_filter, gl_linear);
      glTexParameteri(gl_texture_2d, gl_texture_min_filter, gl_linear);     
      SetLength(Arr(Data), hmap^.w, hmap^.h);
      for j1:= 0 to high(Arr(Data)) do
        for j2:= 0 to high(Arr(Data)) do begin
          Arr(Data)[j1, j2]:= byte(ptr(integer(hmap^.pixels) + j1 * 3 * length(Arr(Data)[0]) + j2 * 3)^);
        end;     

      SetLength(binData, length(Arr(Data)), length(Arr(Data)[0]));
      for j1:= 0 to high(Arr(Data)) do
        for j2:= 0 to high(Arr(Data)) do begin
          binData[j1, j2]:= trunc(Arr(Data)[j1, j2] * 256);
        end;

      glTexImage2d(gl_texture_2d, 0, 3, hmap^.w, hmap^.h, 0, gl_red, gl_unsigned_short, @binData[0, 0]);

      sdl_FreeSurface(hmap);
    end;


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Sa Jan 15, 2011 21:21 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Gibts eigentlich irgendwo einen Screenshot von dem Problem?

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Jan 16, 2011 09:57 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 11, 2009 08:02
Beiträge: 532
Programmiersprache: pascal (Delphi 7)
Flash hat geschrieben:
Gibts eigentlich irgendwo einen Screenshot von dem Problem?
Aktuell nicht. Gibts irgendwo einen einfachen weg, den Bildinhalt in eine Datei zu bekommen? Also, ich hab irgendwann mal den Artikel im Wiki dazu gelesen (und nicht ganz verstanden), aber wenns irgendwo ein Programm gibt, das mir zB den Bildschirm abknipst, wäre mir das doch lieber.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Jan 16, 2011 10:57 
Offline
DGL Member

Registriert: Do Mär 05, 2009 20:17
Beiträge: 284
Wohnort: Kaiserslautern
sharkman hat geschrieben:
Flash hat geschrieben:
Gibts eigentlich irgendwo einen Screenshot von dem Problem?
Aktuell nicht. Gibts irgendwo einen einfachen weg, den Bildinhalt in eine Datei zu bekommen? ...


Wenn deine Anwendung im Fenstermodus läuft, kannst du die Drucken Taste drücken und es beispielsweise in Gimp einfügen, beschneiden, speichern, fertig.
Sollte das nicht gehen (Bei nicht Fensteranwendungen geht das bei mir manchmal nicht), dann kannst du dir auch recht einfach einen screenshot des OpenGL bereichs im Programm erzeugen. Ich mache das derzeit so:

Code:
function Tform1.screenshotperpixelmethodemachen(Sender:TObject):Tbitmap;
  var
    pixels: array of Byte;
    x,y: integer;
    n: Integer;
    VP: array[0..3] of Integer;
    bmp: TBitmap;
begin
Screen.Cursor := crHourGlass;                              // Eieruhr einschalten
button6.SetFocus;                                          // Focus auf button 6
  bmp := TBitmap.Create;                                   // Bitmap erzeugen
  glGetIntegerv(GL_VIEWPORT, @VP);                         // Viewport in VP ablegen
  glPixelStoref(GL_PACK_ALIGNMENT,1);                      // [*2] keine Ahnung
  setLength(pixels,VP[2]*VP[3]*3);                         // Die Anzahl der notwendingen Bytes im array of
                                                           // Pixels beträgt Breite mal Höhe mal 3
  glReadPixels(0,0,VP[2],VP[3],                            // Die Bytes auslesen und in Pixel schreiben
               GL_RGB,GL_UNSIGNED_BYTE,@pixels[0]);
  bmp.Width := VP[2];                                      // Dem BMP die Viewport Breite beibringen
  bmp.Height := VP[3];                                     // Dem BMP die Viewport Höhe beibringen
  n := 0;                                                  // Zähler für die Pixel auf 0 setzen
  for y := VP[3]-1 downto 0 do                             // [*2] für die Anzahl der Zeilen
    for x := 0 to VP[2]-1 do                               //      für die Anzahl der Pixel in der Breite
      begin
        bmp.Canvas.Pixels[x,y] :=                          // Die Pixel ins Canvas des BMP malen
          RGB(pixels[n],pixels[n+1],pixels[n+2]);          // und zwar immer Rot, Grün und Blauwert aus dem array Pixel
        inc(n,3);                                          // den zähle um 3 erhöhen
      end;
result:=bmp;                                               // Das bmp als result zurückliefern
Screen.Cursor := crDefault;                                // den normalen Mauszeiger wieder einschalten
end;


das .bmp kannst du dann speichern oder vorher noch in ein anderes Format wandeln.
Solltest du auch das nicht machen können, gibt es sicher freeware hardcopy programme im netz zu finden.

Gruß

W.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Jan 16, 2011 13:41 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 11, 2009 08:02
Beiträge: 532
Programmiersprache: pascal (Delphi 7)
Wenn ich auf die Drucken Taste gedrückt habe, wo finde ich dann das Bild?


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Jan 16, 2011 14:10 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
In der Zwischenablage…

greetings

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Jan 16, 2011 14:55 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 11, 2009 08:02
Beiträge: 532
Programmiersprache: pascal (Delphi 7)
ok. hier mal meine Screenshots:
1. Das richtigste, was ich bisher geschafft habe. Die Höhe stimmt hier, die Normale nicht. Die teilweise seltsamen Farben (gelb, blau, rot) kommen daher, dass ich zu Testzwecken die Display Lists unterschiedlicheingefärbt habe, und die Landschaft am Rand einer LOD stufe dunkler mache. Die Muster kommen von der falschen Normale
Dateianhang:
correct_height.jpg [199.27 KiB]
Noch nie heruntergeladen


2. Mein Versuch, die Normale richtig zu berechnen (mit texelFetch), es wird keine Höhe berechnet:
Dateianhang:
no_height.jpg [62.25 KiB]
Noch nie heruntergeladen


3. Die Höhe wird über texture berechnet. Es sind Stufen zu sehen:
Dateianhang:
steppy_height.jpg [152.3 KiB]
Noch nie heruntergeladen


4. Wie bei erstens, nur dass ich eine 16 bit Textur verwende. Ich muss zugeben, dass es so sogar schöner aussieht, aber es ist nicht die Landschaft, die ich erstellt habe:
Dateianhang:
16bit.jpg [192.05 KiB]
Noch nie heruntergeladen


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Jan 17, 2011 10:40 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Ok, deine Frage ist nun welche?

Wie du die Normalen deiner Landschaft berechnest?
Falls ja: Spann die beiden Vektoren auf, die ein Dreieck definieren, berechne das Kreuzprodukt und normalisiere dieses. Das ist deine Normale.
Damit sieht deine Welt dann sehr "eckig" aus.
In einem Zweiten schritt kannst du dann an jedem Eckpunkt die Normalen der Dreiecke die diesen Eckpunkt umgeben nehmen und den durchschnitt berechnen. Dann siehts runder aus.

Falls das nicht dein Problem ist, dann einfach nochmal genau erklären.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Jan 17, 2011 17:27 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 11, 2009 08:02
Beiträge: 532
Programmiersprache: pascal (Delphi 7)
Flash hat geschrieben:
Ok, deine Frage ist nun welche?

Wie du die Normalen deiner Landschaft berechnest?
Mehr oder weniger ja. Genau genommen ist meine Frage, wie ich die Normalen berechne ohne dabei die Höhe zu verlieren. (Kreuzprodukt kenn ich, und ändert das Problem nicht. Und übrigens hab ich keine Dreiecke, sondern nur Vertices - weil nur Vertexshader ist schneller als mit geometryshader, warum auch immer (ich benutze keinen Indexpuffer))
Wies aussieht, muss ich sämtliche Pixel, die ich mit texelFetch auslese, auch mit texture auslesen, ob vorher oder nachher spielt dabei keine Rolle. Nur brauch ich aber texelFetch.
Was sich da anbieten würde, wäre, die Werte zuerst mit texture zu lesen, dann (nachher) nochmal mit texelFetch. Sollte wegen Cache und so nicht mal soo viel performance fressen - Nur sind dann trotzdem die (falschen) Werte von texture in meinen Variablen :?: Wenn er texture wegoptimieren würde, na gut, aber texelFetch (das nachher aufgerfuen wird)?!?


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Jan 17, 2011 17:31 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
weil nur Vertexshader ist schneller als mit geometryshader, warum auch immer (ich benutze keinen Indexpuffer))

Lese den Geometryshader-Artikel im Wiki. Wahrscheinlich kann die Grafikkarte aus Speichermangel nicht alle ShaderUnits nutzen. Der Output eines Geometryshaders sollte eine ähnliche Größe wie der Input haben. Der Geometryshader eignet sich nicht für Heavy-Output Anwendungen, dafür ist wahrscheinlich der Tesselierungs-Shader von Shader Modell 5.0. Damit habe ich mich aber noch nicht auseinander gesetzt.

@Problem: Ich würde den Shader nochmal schrittweise von neuem aufbauen. Vielleicht findest du so das Problem.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 25 Beiträge ]  Gehe zu Seite Vorherige  1, 2
Foren-Übersicht » Programmierung » Shader


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 5 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.014s | 16 Queries | GZIP : On ]