Vertex eines Terrains verfärben

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

Goldini

Betreff: Vertex eines Terrains verfärben

BeitragSa, März 08, 2008 11:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,
Ich wollt mal wissen wie ich die einzelnen Vertex eines Terrains verfärben kann.

mfg[/code]
Mit diesen Zeilen danke ich einer Person, die mich für so wichtig hält, dass sie sogar einen Club nach mir benannt hat!
Danke! Very Happy

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSa, März 08, 2008 12:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Erstell eine Textur und ziehe diese über das ganze Terrain einmal über. Dabei muss die Auflösung dieser Textur nicht unbedingt größer sein als die Highmap selber. Um denoch Struckturen auf das Terrain zu bekommen, sollte das ganze über verschiedene Texturlayer (Multitexturing) gemacht werden. Dabei hast du sogar verschiedene Texturfilter die aufeinander angewendet werden können.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

Noobody

BeitragSa, März 08, 2008 12:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich denke, er meint eher, wie man die einzelnen Vertices eines Terrains ohne Textur einfärben kann.
Dafür gibts, oh Wunder, den Befehl VertexColor, dessen Wirkung du jedoch nur sehen kannst, wenn du das zugehörige Mesh mit Flag 2 versiehst.
Willst du auch noch Alpha auf die Vertices anwenden, so musst du zusätzlich noch Flag 32 hinufügen.
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSa, März 08, 2008 12:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, bei einem selbstgebasteltem Meshterrain hat man auch zugriff auf die einzelnen Vertices. Jedoch nicht auf einem Blitzterrain mit LOD-Technik, denn da sind ja nichtmal alle Vertices zur Laufzeit verfügbar (werden ja zum Teil jedes Frame neu erstellt und gelöscht). Es entstehen also Lücken wo garkeine Vertices existent sind.

Bei der Textur könnte man u.a. auch genau auf einzelne Vertices zugreifen (via WritePixelFast), wenn diese die gleiche größe wie die Highmap selbst hat. Alles andere müsste erst umgerechnet werden.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

Noobody

BeitragSa, März 08, 2008 13:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Du hast vollkommen Recht, an das Blitzterrain dachte ich gar nicht, da ich selbst nur noch mit Meshterrains arbeite.
Dort ist die Methode mit der Textur natürlich die beste, aber da Goldini von einem Vertex sprach und nicht einem Punkt auf dem Terrain, lag mir VertexColor näher.
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun

Goldini

BeitragSa, März 08, 2008 18:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Das ist mein Code: [AUSKLAPPEN]

ter = LoadTerrain("gfx/hmap01.bmp")
surf=GetSurface(ter,1)
For i=1 To CountTriangles(surf)
   v0=TriangleVertex(surf,i,0)   
   v1=TriangleVertex(surf,i,1)   
   v2=TriangleVertex(surf,i,2)
   VertexColor surf,v0,Rnd(100,200),Rnd(100,200),Rnd(100,200)
   VertexColor surf,v1,Rnd(100,200),Rnd(100,200),Rnd(100,200)
   VertexColor surf,v2,Rnd(100,200),Rnd(100,200),Rnd(100,200)   
Next


Doch leider sagt er nun immer, dass der Terrain kein Mesh ist. Aber ich brauch unbedingt die Funktion TerrainY(), denn sonst würd ich den Terrain sofort als Mesh nehmen.

Mfg
Mit diesen Zeilen danke ich einer Person, die mich für so wichtig hält, dass sie sogar einen Club nach mir benannt hat!
Danke! Very Happy
 

Dreamora

BeitragSa, März 08, 2008 18:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Nochmal: Terrains haben keine Vertices.
Terrains als auch animierte Meshes haben KEINEN Surface, denn ihre Vertexdaten existieren aus Performancegründen nicht im RAM wo du darauf zugreifen könntest.

Entweder du nimmst das terrain und den Texturtrick der oben erwähnt wird oder du nimmst ein Mesh basierendes Terrain System (gibts verschiedene oder kannst dir ein eigenes schreiben) wo du auf die Surface zugreifen kannst.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Goldini

BeitragSa, März 08, 2008 22:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Das hier ist leider total langsam und mit Read- und WritePixelFast krieg ich's nicht zum laufen...
Code: [AUSKLAPPEN]
Const hmap$="gfx/hmap01.bmp"

Dim red(255)
Dim green(255)
Dim blue(255)
cmap=LoadImage("gfx/landcolors.bmp")

For x=0 To 255
;LockBuffer FrontBuffer()
rgb=ReadPixel(x,5,ImageBuffer(cmap))
red(x)=(rgb And $FF0000)/$10000
green(x)=(rgb And $FF00)/$100
blue(x)=rgb And $FF

;UnlockBuffer FrontBuffer()
Next

img=LoadImage(hmap$)
iwidth=ImageWidth(img)
iheight=ImageHeight(img)


tex=CreateTexture(iwidth,iheight)
SetBuffer TextureBuffer(tex)

For x=0 To 512;iwidth
   For y=0 To 512;iheight
      ;LockBuffer FrontBuffer()
      rgb=ReadPixel(x,y,ImageBuffer(img))

   r=(rgb And $FF0000)/$10000
   ;UnlockBuffer FrontBuffer()
   Color red(r),green(r),blue(r)
   Plot x,y
   Next
Next


mfg
Mit diesen Zeilen danke ich einer Person, die mich für so wichtig hält, dass sie sogar einen Club nach mir benannt hat!
Danke! Very Happy
 

Dreamora

BeitragSa, März 08, 2008 22:50
Antworten mit Zitat
Benutzer-Profile anzeigen
den frontbuffer DARF man auch nicht locken!
Der wird durchgehend gewechselst, wenn du den lockst, steht alles. ähnlich siehts beim backbuffer aus.

lockbuffer is nett für images und texturen, aber nicht für die front / backbuffer
und mit 512x512 kannst du es böse gesagt gleich vergessen

versuchs ma mit copyrect
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Goldini

BeitragSa, März 08, 2008 22:55
Antworten mit Zitat
Benutzer-Profile anzeigen
öhhh.... Question Keine Erfahrung wie soll das gehen?
Mit diesen Zeilen danke ich einer Person, die mich für so wichtig hält, dass sie sogar einen Club nach mir benannt hat!
Danke! Very Happy
 

Dreamora

BeitragSa, März 08, 2008 22:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Ausprobieren.
Aber solange du den Frontbuffer nutzt wird das nichts, unabhängig davon wie du es machst, das gleiche wenn du 512x512 Pixeln jedes frame rumholzen willst.

Schau dir die dokumentation von CopyRect an
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
  • Zuletzt bearbeitet von Dreamora am Sa, März 08, 2008 23:00, insgesamt einmal bearbeitet

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSa, März 08, 2008 22:59
Antworten mit Zitat
Benutzer-Profile anzeigen
- CreateTexture solltest du (nun leider grundsätzlich) vermeiden, da bestimmte nVidia-Treiber diese nicht mehr oder falsch unterstützen. Lade also die Textur per LoadTexture.

- Benutze bei solchen Sachen immer Read/WritePixelFast, da dieses doch emens schneller ist. Ausser du änderst jedes Frame nur 1 bis ~50 Pixel, da (Un)LockBuffer auch Recourcen benötigt.

- Die beiden Schleifen (For X=0 To 512 und For Y=0 To 512) sollten nur bis Breite/Höhe -1 gehen. In diesem Fall also bis 511, sonst gibt es Ärger.

- Genau kann ich es nun nicht sagen, da der Code etwa unvollständig ist, aber ich denke dass eventuell SetBuffer falsch gesetzt wird. Eventuell hilft dir auch ql:CopyPixelFast weiter.


edit1: ...Oder ql:CopyRect wie Dreamora gesagt hat.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D
 

Dreamora

BeitragSa, März 08, 2008 23:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Um hectic zu korrigieren: CreateTexture macht KEINE Probleme!
CreateTexture mit flag Alpha/Masked macht Probleme. Da du aber weder alpha noch masked hast wenn du buffers kopierst, wird das kein Problem.
Wär supi wenn du hören könntest das auch weiterhin immer weiter zu behaupten, hatte es bereits das letzte Mal aufgeklärt. Abrexxes hats im Unterschied zu dir als Problem immerhin präzise formuliert! Denn es kommt ganz klar von den alpha / mask flags und der Art wie B3D die Textur erzeugt mit den beiden Flags.
Deine inkorrekte Panikmache hilft niemandem. Sie sorgt nur für Probleme.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
  • Zuletzt bearbeitet von Dreamora am Sa, März 08, 2008 23:09, insgesamt einmal bearbeitet

Goldini

BeitragSa, März 08, 2008 23:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich verwende CreateTexture damit man jeden belibigen Terrain texturieren lassen kann. Ich hab gerade fesgestellt, dass es auch reicht jeden vierten Pixel auszulesen.

Mfg
Mit diesen Zeilen danke ich einer Person, die mich für so wichtig hält, dass sie sogar einen Club nach mir benannt hat!
Danke! Very Happy

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group