VBO und VertexProgram Test
Übersicht

![]() |
VertexBetreff: VBO und VertexProgram Test |
![]() Antworten mit Zitat ![]() |
---|---|---|
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-XBetreff: ......... |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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-XBetreff: ...... |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group