Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Schwarzefee

Treue Seele

  • »Schwarzefee« ist der Autor dieses Themas

Beiträge: 155

Wohnort: Ost-Sachsen

Beruf: Programmierer

  • Private Nachricht senden

1

01.04.2015, 20:55

glDrawElements - Zugriffsverletzung

Hi,

ich beschäftige mich nach einiger Zeit mal wieder etwas mit OpenGL.
Für den Anfang wollte ich eigentlich einfach nur ein Dreieck rendern.

Allerdings bekomme ich beim glDrawElements() eine Zugriffsverletzung.

Zitat

Ausnahmefehler bei 0x009FFEF0 in TestApp.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x00000000


Woran könnte das liegen? Zur Sicherheit poste ich mal die gDEBugger-Functions-Call-History.

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
wglChoosePixelFormat(0x5F011BA9, 0x0072ED64)
wglSetPixelFormat(0x5F011BA9, 9, 0x0072ED64)
wglCreateContext(0x5F011BA9)
wglMakeCurrent(0x5F011BA9, 0x00010000)

[...]

glGetIntegerv(GL_MAJOR_VERSION, 0x0101F1E0)
glGetIntegerv(GL_MINOR_VERSION, 0x0101F1E4)
glShadeModel(GL_SMOOTH)
glDisable(GL_DEPTH_TEST)
glDisable(GL_CULL_FACE)
glEnable(GL_BLEND)
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
wglSwapIntervalEXT(0)
wglMakeCurrent(0x82011259, 0x00010000)
glViewport(0, 0, 20, 20)
glClearColor(0, 0, 0, 1)
glCreateProgram()
glCreateShader(GL_VERTEX_SHADER)
glCreateShader(GL_FRAGMENT_SHADER)
glShaderSource(2, 1, 0x0101EA98, 0x00000000)
glCompileShader(2)
glGetShaderiv(2, GL_COMPILE_STATUS, 0x0101EA8C)
glShaderSource(3, 1, 0x0101EA98, 0x00000000)
glCompileShader(3)
glGetShaderiv(3, GL_COMPILE_STATUS, 0x0101EA8C)
glAttachShader(1, 2)
glAttachShader(1, 3)
glLinkProgram(1)
glGetProgramiv(1, GL_LINK_STATUS, 0x0101EA8C)
glBindAttribLocation(1, 0, inputPosition)
glBindAttribLocation(1, 1, inputColor)
glGenBuffers(1, 0x01BD13FC)
glBindBuffer(GL_ARRAY_BUFFER, 1)
glBufferData(GL_ARRAY_BUFFER, 36, 0x01BD4220, GL_STATIC_DRAW)
glBindBuffer(GL_ARRAY_BUFFER, 0)
glGenBuffers(1, 0x01BD4184)
glBindBuffer(GL_ARRAY_BUFFER, 2)
glBufferData(GL_ARRAY_BUFFER, 48, 0x05F0CAD0, GL_STATIC_DRAW)
glBindBuffer(GL_ARRAY_BUFFER, 0)
glGenBuffers(1, 0x05F0CA24)
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 3)
glBufferData(GL_ELEMENT_ARRAY_BUFFER, 12, 0x05F0CBD0, GL_STATIC_DRAW)
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)
glGenVertexArrays(1, 0x05E69808)
glBindVertexArray(1)
glEnableVertexAttribArray(0)
glEnableVertexAttribArray(1)
glBindBuffer(GL_ARRAY_BUFFER, 1)
glVertexAttribPointer(0, 3, GL_FLOAT, FALSE, 12, 0x00000000)
glBindBuffer(GL_ARRAY_BUFFER, 2)
glVertexAttribPointer(0, 4, GL_FLOAT, FALSE, 16, 0x00000000)
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 3)
wglMakeCurrent(0x82011259, 0x00010000)
glViewport(0, 0, 949, 1001)
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT)
glEnable(GL_BLEND)
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
glUseProgram(1)
glBindVertexArray(1)
glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, 0x00000000)



Könnt ihr mit diesen Informationen etwas anfangen? Hab ich irgendwas vergessen, oder falsch gemacht?


Gruß

2

01.04.2015, 20:59

Schau dir mal die letzte Zeile an Schau dir alle Zeilen nochmal genau an und guck was du den Funktionen übergibst. Z.B. rufst du glDrawElements mit einem Nullzeiger auf.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Roflo« (01.04.2015, 21:12)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

3

01.04.2015, 21:04

Nicht nur dort übrigens. glVertexAttribPointer z.B. auch.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Schwarzefee

Treue Seele

  • »Schwarzefee« ist der Autor dieses Themas

Beiträge: 155

Wohnort: Ost-Sachsen

Beruf: Programmierer

  • Private Nachricht senden

4

02.04.2015, 08:36

Hi,

danke für die Antworten.

Ich hab als Grundlage das http://rastertek.com Tutorial (Tutorial 4) genommen.

Zitat

Z.B. rufst du glDrawElements mit einem Nullzeiger auf.

Dafür hab ich doch einen Index-Buffer gebunden, ich dachte da muss indices 0 sein...

Zitat

Nicht nur dort übrigens. glVertexAttribPointer z.B. auch.

Hier hab ich es etwas anders gemacht, als auf Rastertek. Ich habe 2 Buffer, einmal mit der Position (3x float) und einmal mit der Farbe (4x float).
Diese binde ich jeweils vor den beiden glVertexAttribPointer()-Aufrufen. Deshalb ist der letze Parameter (offset of first element) 0.


Gruß

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

5

02.04.2015, 09:41

Der letzte Parameter ist aber kein Index, sondern ein Pointer auf die Daten. Und dieser Pointer ist bei Dir offensichtlich null und kein Pointer auf valide Array-Daten:
https://www.opengl.org/sdk/docs/man/html…ibPointer.xhtml
https://www.opengl.org/sdk/docs/man/html…wElements.xhtml
K.A. was Du da für ein Tutorial hast oder was da drin steht, aber entweder ist bei Dir was falsch oder im Tutorial.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Schwarzefee

Treue Seele

  • »Schwarzefee« ist der Autor dieses Themas

Beiträge: 155

Wohnort: Ost-Sachsen

Beruf: Programmierer

  • Private Nachricht senden

6

02.04.2015, 09:54

Hi,

also ich hab mir mehrere Tutorials angeguckt, und wenn man einen ELEMENT_ARRAY_BUFFER verwendet, war überall der letzte Parameter von glDrawElements() 0.

Allerdings hab ich eine Frage: Wenn man ein VertexArrayObject benutzt, muss man den IndexBuffer trotzdem vor dem Rendern binden, oder erledigt das auch das VAO?



Gruß

Tobiking

1x Rätselkönig

  • Private Nachricht senden

7

02.04.2015, 11:03

Meine OpenGL Kenntnisse sind ein wenig eingerostet (und diese Debug ausgabe find ich etwas schwer zu lesen), aber dass du bei glVertexAttribPointer 2 mal index 0 nutzt kommt mir etwas komisch vor.

Der letzte Parameter ist aber kein Index, sondern ein Pointer auf die Daten. Und dieser Pointer ist bei Dir offensichtlich null und kein Pointer auf valide Array-Daten:
https://www.opengl.org/sdk/docs/man/html…ibPointer.xhtml
https://www.opengl.org/sdk/docs/man/html…wElements.xhtml
K.A. was Du da für ein Tutorial hast oder was da drin steht, aber entweder ist bei Dir was falsch oder im Tutorial.

Das mit dem Offset ist schon richtig. Es wird nur an einer anderen Stelle zentral dokumentiert, was wirklich alles andere als ideal ist.

https://www.opengl.org/sdk/docs/man/html/glBindBuffer.xhtml

Zitat


While a non-zero buffer object is bound to the GL_ELEMENT_ARRAY_BUFFER target, the indices parameter of glDrawElements, glDrawElementsInstanced, glDrawElementsBaseVertex, glDrawRangeElements, glDrawRangeElementsBaseVertex, glMultiDrawElements, or glMultiDrawElementsBaseVertex is interpreted as an offset within the buffer object measured in basic machine units.

Werbeanzeige