VBO und VertexProgram Test

Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Neue Antwort erstellen

Vertex

Betreff: VBO und VertexProgram Test

BeitragMo, März 21, 2005 1:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi!
Da ich ich mich in letzter Zeit mit OpenGL beschäftige, habe ich hier mal 2 Beispiele für euch:

VertexBufferObject(ca. 3 mal schneller als glVertex3f usw.)
Code: [AUSKLAPPEN]
Strict

Local iBuffer:Int     ' VertexObjectBuffer Handle
Local iIndices:Int[3] ' Vertex-Indeces für ein Triangles
Local fVBO:Float Ptr  ' Vertex-Positionen

bglCreateContext 640, 480, 0, 0, BGL_BACKBUFFER

' Projektionsmode = Perspektifisch
glMatrixMode GL_PROJECTION
glLoadIdentity()
gluPerspective 45.0, 640.0/480.0, 1.0, 1000.0


glewInit()
glGenBuffersARB 1, Varptr(iBuffer)
glBindBufferARB GL_ARRAY_BUFFER_ARB, iBuffer
glBufferDataARB GL_ARRAY_BUFFER_ARB, SizeOf(fVBO), Null, GL_STATIC_DRAW_ARB

' Vertex0, Vertex1, Vertex2
iIndices[0] = 0 ; iIndices[0] = 1 ; iIndices[1] = 2

fVBO = Float Ptr(glMapBufferARB(GL_ARRAY_BUFFER_ARB, GL_WRITE_ONLY_ARB))
fVBO[0] =  0.0 ; fVBO[1] =  1.0 ; fVBO[2] = 0.0 ' Vertex0
fVBO[3] = -1.0 ; fVBO[4] = -1.0 ; fVBO[5] = 0.0 ' Vertex1
fVBO[6] =  1.0 ; fVBO[7] = -1.0 ; fVBO[8] = 0.0 ' Vertex2
glUnMapBuffer GL_ARRAY_BUFFER_ARB
glBufferDataARB GL_ARRAY_BUFFER_ARB, 9*4, fVBO, GL_STATIC_DRAW_ARB

While Not KeyDown(KEY_ESCAPE)
   ' Cls
    glClear GL_COLOR_BUFFER_BIT

   ' Um 3 Einheiten nach vorne verschieben
    glMatrixMode GL_MODELVIEW
    glLoadIdentity()
    glTranslatef 0.0, 0.0, -3.0

    glEnableClientState GL_VERTEX_ARRAY
    glBindBuffer GL_ARRAY_BUFFER_ARB, iBuffer
    glVertexPointer 3, GL_FLOAT, 0, Null ' 3 Vertices
    glDrawElements GL_TRIANGLES, 3, GL_UNSIGNED_INT, iIndices ' 3 Indices
    glDisableClientState GL_VERTEX_ARRAY

   ' Flip
    bglSwapBuffers()
    FlushMem
Wend

' VBO löschen
glDeleteBuffersARB 1, Varptr(iBuffer)

bglDeleteContext
End


Und VertexProgram:
Code: [AUSKLAPPEN]
Strict

Local iVertexProgram:Int ' VertexProgram Handle
Local oProgram:TBank     ' SourceCode des VertexProgram in Assembler
Local fAngle:Float       ' Rotationswinkel

bglCreateContext 640, 480, 0, 0, BGL_BACKBUFFER

glewInit()
' Sourcecode in eine Bank laden
oProgram = LoadBank("VertexProgram.asm")
' VertexPrograms aktivieren
glEnable(GL_VERTEX_PROGRAM_ARB)
' VertexProgram erstellen
glGenProgramsARB(1, VarPtr(iVertexProgram))
' und ihn einbinden
glBindProgramARB(GL_VERTEX_PROGRAM_ARB, iVertexProgram)
' Assembler Code kompilieren
glProgramStringARB(GL_VERTEX_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, ..
                   BankSize(oProgram), BankBuf(oProgram))
' Auf Fehler prüfen
If glGetError() = GL_INVALID_OPERATION Then
   Notify("".FromCString(Byte Ptr(glGetString(GL_PROGRAM_ERROR_STRING_ARB))))
   End
EndIf

' ClsColor
glClearColor 0.3, 0.3, 0.6, 1.0

' Projektionsmode = Perspektifisch
glMatrixMode GL_PROJECTION
glLoadIdentity()
gluPerspective 45.0, 640.0/480.0, 1.0, 1000.0

glMatrixMode GL_MODELVIEW

While Not KeyDown(KEY_ESCAPE)
   fAngle# = fAngle#+0.1

   ' Cls
   glClear GL_COLOR_BUFFER_BIT

   glLoadIdentity()
   glTranslatef 0.0, 0.0, -3.0
   glRotatef fAngle#, 0.0, 1.0, 0.0
   glBegin GL_QUADS
      glVertex3f -0.5,  0.5, 0.0
      glVertex3f  0.5,  0.5, 0.0
      glVertex3f  0.5, -0.5, 0.0
      glVertex3f -0.5, -0.5, 0.0
   glEnd

   ' Flip
   bglSwapBuffers()
   FlushMem()
Wend

' VertexProgram löschen
glDeleteProgramsARB(1, VarPtr(iVertexProgram))

bglDeleteContext()
End


Dazu VertexProgram.asm:
Code: [AUSKLAPPEN]
!!ARBvp1.0

# Erhalte Model-Projektions-Matrix
PARAM ModelViewProj[4] = { state.matrix.mvp };

# Temporärer vektor
TEMP temp;

# Matrix mit Vertex multiplizieren und in Vektor Temp speichern
DP4 temp.x, ModelViewProj[0], vertex.position;
DP4 temp.y, ModelViewProj[1], vertex.position;
DP4 temp.z, ModelViewProj[2], vertex.position;
DP4 temp.w, ModelViewProj[3], vertex.position;

# Ausgeben
MOV result.position, temp;
MOV result.color, temp;
MOV result.texcoord, vertex.texcoord;

END


Naja das VertexProgram mach nicht viel. Es weißt halt jeden Vertex als Farbe seine Position zu. So das halt X = Rot, Y = Grün und Z = Blau ist.
Mehr dazu: http://delphigl.com/script/do_...p;action=2

Dachte immer, ich kann garnicht soetwas wie VertexShader auf meiner Graka nutzen. Finde ich unheimlich nützlich.

mfg olli
vertex.dreamfall.at | GitHub

Suco-X

Betreff: .........

BeitragMo, März 21, 2005 13:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Geht ja doch recht einfach. Habe mich vor diesem zeug immer gedrückt weil ich den Einstieg nie gefunden habe. Aber das Tutorial ist ja ziemlich einleuchtend. Wobei mir das zusammenspiel von Fragment und Vertex Programs doch ein wenig zu hoch ist um mir da momentan noch selber Beispiele machen zu können. Würde mal gerne wissen wie man jetzt z.b. zu so einer "PlastikRelief" Wand kommt die man so häufig in zusammenhang mit diesen Sachen sieht.
Vielleicht kennst du ja nochwas.
Mfg Suco
Intel Core 2 Quad Q8300, 4× 2500 MHz, 4096 MB DDR2-Ram, GeForce 9600GT 512 MB

Vertex

BeitragMo, März 21, 2005 14:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Naja also mal grob erleutert:
Man übergibt z. B. über glVertex4f X, Y, Z, W der Grafikkarte die Position des Vertex.
Im VertexProgram kannst du diese Position über vertex.position abfragen und damit auch rechnen.

Wenn du fertig mit berechnen bist, dann übergibst du die neu berechnete Position an result.position .

Neben der Position gibt es dann noch halt Texturkoordinaten, Vertexfarbe, Vertexnormale, Nebelfarbe usw. Zusätzlich werden dir aber noch zum Arbeiten Sachen wie Lichtposition der 8 Hardwarelichter usw. zur Verfügung gestellt.

Um das ganze ein wenig zu steuern kannst du dann auch noch Attribute von BlitzMax an das VertexProgram übergeben.

Ich muss nochmal schauen, aber ich habe gestern noch auf der NVidia Developer Seite ein Tool gefunden, das DirectX Vertexshader in OpenGL VertexPrograms konvertiert.


Ein FragmentProgram(in DirectX = Pixelshader) kann dann halt den Fragmentbuffer(auch Colorbuffer genannt), also praktisch den Buffer, den du auf dem Bildschirm dann siehst, verändern.


Ich will mal versuchen einen Toonshader noch zu basteln, jedoch würde ich das lieber in glSlang machen, was aber meine Graka nicht mehr unterstützt.

mfg olli
vertex.dreamfall.at | GitHub

Suco-X

Betreff: ......

BeitragMo, März 21, 2005 14:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Das gleiche steht ja auch schon im Tut. Geht ja um die etwas tolleren Effekt. Da kann ich mir irgendwie noch keinen reim drauss machen.
Mfg Suco
Intel Core 2 Quad Q8300, 4× 2500 MHz, 4096 MB DDR2-Ram, GeForce 9600GT 512 MB

Vertex

BeitragMo, März 21, 2005 14:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Naja ich erklähre dir mal, wie Toonshading funktioniert...

Wir brauchen die Vertexnormale, die Modelview-Matrix sowie die Licht-Richtung. Aus diesen 3 Komponenten können wir dann die U Texturkoordinate für eine 1D Textur berechnen und diese dann den Vertex zuweisen. Die 1D Textur stellt dabei die Toonshading-Palette dar.

TempNormal = vertex.normal
TempMatrix = state.matrix.modelview
TempDirection = state.light[0].spot.direction

Jetzt multiplizieren wir den Mormal-Vektor mit der Modelview-Matrix. Ist das selbe wie in Blitz3D mit TFormNormal. Anschließend wird er wieder auf Länge 1.0 gebracht.

TempVector = TempMatrix x TempNormal
TempVector = Normalisize(TempVector)

Um die Texturkoordinate zu bestimmen, wird einfach der Winkel zwischen TempVector und TempDirection errechnet. Das geht über das Punktprodukt.

TempU = DotProduct(TempVector, TempDirection)

Ist TempU kleiner als 0.0 dann muss TempU = 0.0 sein.

If TempU < 0.0 Then TempU = 0.0

Jetzt kann man die berechnete Texturkoordinate an reslt übergeben:

result.texcoord.s = TempU


In BlitzMax wäre dann noch folgendes zu tun. In die Tetxur-Unit 0 die 1D Textur(sprich unsere Shading-Palette) zu laden, sowie die Lichtrichtung von Licht 0 über glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, XYZW) zu setzen.

Das könnte man hier alles in einem VertexProgram unterbringen. Wobei ich nicht weiß, ob es soetwas wie bedingte Sprünge gibt in SIMD. (Für das If - Then)

mfg olli
vertex.dreamfall.at | GitHub

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group