um PureBasic mit modernem OpenGL zu lernen, hatte ich begonnen, mich anhand des von Luis empfohlenen Tutorials für OpenGL 3.3+ Schritt für Schritt entlang zu hangeln und das Beispiel 1 zu 1 in Purebasic nachzubauen. Dank vieler guter Beispiele und Anleitungen im deutschen und englischen Forum konnte ich bereits so manche Hürden nehmen.
Tutorial: https://learnopengl.com/Getting-started/Hello-Triangle
Ich hatte es geschafft, mittels Vertex Array Object und Vertex Buffer Object sowie den benötigten Shadern 2 farbige (an der Längsseite deckungsgleiche) Dreiecke darzustellen.
Um doppeltes Rendern der überlappenden Vertices zu vermeiden, wird daraufhin im Tutorial die Anzahl Vertices um die Doppelten reduziert und ein weiterer Array angelegt, der angibt, aus welchen Vertices die Dreiecke sich jeweils zusammen setzen. Dieser Index-Array wird ans Element Buffer Object gebunden. Hier stoße ich leider an meine Grenzen.
Werden die Dreiecke mit glDrawArrays gezeichnet, ergibt sich folgendes Bild:
Im Tutorial wird nun allerdings glDrawElements verwendet.
Mit glDrawElements(#TRIANGLES...) bekomme ich folgendes Ergebnis:
Mit glDrawElements(#TRIANGLE_STRIP...):
Trotz Orientierung an funktionierenden Beispielen mit VBO und EBO wie diesem hier
https://www.purebasic.fr/english/viewto ... lit=openGL
weiß ich nicht, was ich falsch mache. Über Hilfestellung würde ich mich freuen.
Hier der Code:
Code: Alles auswählen
#GL_ARRAY_BUFFER = $8892
#GL_STATIC_DRAW = $88E4
#GL_VERTEX_SHADER = $8B31
#GL_FRAGMENT_SHADER = $8B30
#GL_ELEMENT_ARRAY_BUFFER = $8893
;#GL_UNSIGNED_INT = 5125
;#GL_FRONT_AND_BACK = 1032
;wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
; Koordinaten für Vertices (Struktur und Array)
;wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
Global points_vbo.i, colors_vbo.i, vao.i, ebo.i
Structure Tvertex
x.f
y.f
z.f
EndStructure
Structure Tindex
a.i
b.i
c.i
EndStructure
Global Dim Vertex.Tvertex(6)
;wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
;Original-Array der Vertices für 2 Dreiecke
;wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
;!!!!!!!!!!! 2 Dreiecke teilen sich 2 Vertizes - schlechte Performance -> deshalb EBO verwenden !!!!!!!!!!!!!!!!
; ;// first triangle
; Vertex(0)\x = 0.5 : Vertex(0)\y = 0.5 : Vertex(0)\z = 0 ; // top right
; Vertex(1)\x = 0.5 : Vertex(1)\y = -0.5 : Vertex(1)\z = 0 ; // bottom right
; Vertex(2)\x = -0.5 : Vertex(2)\y = 0.5 : Vertex(2)\z = 0 ; // top left
;
; ; ;// second triangle
; Vertex(3)\x = 0.5 : Vertex(3)\y = -0.5 : Vertex(3)\z = 0 ; // top right
; Vertex(4)\x = -0.5 : Vertex(4)\y = -0.5 : Vertex(4)\z = 0 ; // bottom left
; Vertex(5)\x = -0.5 : Vertex(5)\y = 0.5 : Vertex(5)\z = 0 ; // top left
;wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
;reduzierter Array der Vertices für 2 Dreiecke und Index-Array für EBO
;wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
Vertex(0)\x = 0.5 : Vertex(0)\y = 0.5 : Vertex(0)\z = 0 ; // top right
Vertex(1)\x = 0.5 : Vertex(1)\y = -0.5 : Vertex(1)\z = 0 ; // bottom right
Vertex(2)\x = -0.5 : Vertex(2)\y = -0.5 : Vertex(2)\z = 0 ; // bottom left
Vertex(3)\x = -0.5 : Vertex(3)\y = 0.5 : Vertex(3)\z = 0 ; // top left
Global Dim Index.Tindex(2)
Index(0)\a = 0 : Index(0)\b = 1 : Index(0)\c = 3 ; // first triangle
Index(1)\a = 1 : Index(1)\b = 2 : Index(1)\c = 3 ; // second triangle
;wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
;!!!!! stehen diese Zeilen hinter der include-Datei gibt es bei glcreateShader einen Invalid Memory access-Fehler
OpenWindow(0, 0, 0, 800, 600, "Tutorial Phase 3 - VertexShader ")
OpenGLGadget(0, 10, 10, WindowWidth(0) , WindowHeight(0) , #PB_OpenGL_Keyboard)
glClearColor_(0.5, 0.5, 0.3, 1.0)
glViewport_(0, 0, WindowWidth(0), WindowHeight(0))
glPolygonMode_(#GL_FRONT_AND_BACK, #GL_LINE)
IncludeFile "d:\OpenGL\OpenGL_INCLUDE\MoreFunctions.pbi"
glGenVertexArrays (1, @vao) ; Vertex Array Object
glBindVertexArray(vao)
;2. copy our vertices Array in a buffer For OpenGL To use
glGenBuffers(1, @points_vbo ) ; Vertex Buffer Object
glBindBuffer(#GL_ARRAY_BUFFER, points_vbo);
;!!!!!!!!!!!!!!!!! mit glBufferData(#GL_ARRAY_BUFFER,12 * SizeOf(float),@Vertex(0), #GL_STATIC_DRAW) wird nur eines von 2 kompletten Dreiecken angezeigt !!!!!!!!!!!!
glBufferData(#GL_ARRAY_BUFFER,12 * ArraySize(Vertex()),@Vertex(0), #GL_STATIC_DRAW)
;3. copy our index Array in a element buffer For OpenGL To use
glGenBuffers(1, @ebo) ;Element Buffer Object
glBindBuffer(#GL_ELEMENT_ARRAY_BUFFER, ebo)
glBufferData(#GL_ELEMENT_ARRAY_BUFFER, 12*ArraySize(Index()), @Index(0), #GL_STATIC_DRAW);
;// 4. then set our vertex attributes pointers
glVertexAttribPointer(0, 3, #GL_FLOAT, #GL_FALSE, 3 * SizeOf(float), 0)
glEnableVertexAttribArray(0);
glEnable_(#GL_DEPTH_TEST); // enable depth-testing
;wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
; Shader anlegen
;wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
Define vertex_shader.s
Define fragment_shader.s
Define *fbuff
Define *vbuff
vertex_shader = "#version 330 core"+#CRLF$
vertex_shader + "layout(location = 0) in vec3 aPos;"+#CRLF$
vertex_shader + "void main() {"+#CRLF$
vertex_shader + "gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);"+#CRLF$
vertex_shader + "}"
fragment_shader = "#version 330 core"+#CRLF$
fragment_shader + "out vec4 FragColor;"+#CRLF$
fragment_shader + "void main()"+#CRLF$
fragment_shader + "{"+#CRLF$
fragment_shader + " FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);"+#CRLF$
fragment_shader + "}"+#CRLF$
*vbuff = Ascii(vertex_shader)
*fbuff = Ascii(fragment_shader)
Global vs = glCreateShader(#GL_VERTEX_SHADER);
glShaderSource(vs, 1, @*vbuff, #Null) ;
glCompileShader(vs)
Global fs = glCreateShader(#GL_FRAGMENT_SHADER);
glShaderSource(fs, 1, @*fbuff, #Null);
glCompileShader(fs)
;wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
; Shader zu Programm zusammenfügen
;wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
Global shader_programme = glCreateProgram();
glAttachShader(shader_programme, vs);
glAttachShader(shader_programme, fs);
glLinkProgram(shader_programme) ;
; nicht mehr benötigte Shader werden gelöscht
glDeleteShader(vs)
glDeleteShader(fs)
;wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
;Drawing (in render loop)
;wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
SetActiveGadget(0)
Repeat
Event = WaitWindowEvent()
If Event = #PB_Event_Gadget And EventGadget() = 0
If EventType() = #PB_EventType_KeyDown
key = GetGadgetAttribute(0,#PB_OpenGL_Key )
If key = #PB_Shortcut_Up
ElseIf key = #PB_Shortcut_Escape ; Esc key to exit
quit = 1
EndIf
EndIf
EndIf
glClear_(#GL_COLOR_BUFFER_BIT | #GL_DEPTH_BUFFER_BIT)
glViewport_(0, 0, 800, 600)
glUseProgram(shader_programme)
; glEnableClientState_(#GL_VERTEX_ARRAY )
glBindVertexArray(vao)
;draw points 0-6 from the currently bound VAO With current in-use shader
;glDrawArrays_(#GL_TRIANGLES, 0, 6)
glDrawElements_(#GL_TRIANGLES, 6, #GL_UNSIGNED_INT, 0 )
;glDrawElements_(#GL_TRIANGLE_STRIP, 6, #GL_UNSIGNED_INT, 0 )
glBindVertexArray(0)
SetGadgetAttribute(0, #PB_OpenGL_FlipBuffers, #True)
Delay(16)
Until Event = #PB_Event_CloseWindow Or quit = 1
pexxll