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;
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.
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.
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 network • my 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
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
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:
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
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)?!?
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.
Mitglieder in diesem Forum: 0 Mitglieder und 2 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.