2017-03-14 6 views
1

VB.Net에서 OpenTK 사용.OpenGL : glDrawElements가 처리되지 않은 예외를 제공합니다. System.AccessViolationException

렌더링 내 방법 :

' clear the screen 
    GL.ClearColor(Color4.Purple) 
    GL.Clear(ClearBufferMask.ColorBufferBit Or ClearBufferMask.DepthBufferBit) 

    ' activate shader program and set uniforms 
    shaderProgram.Use() 
    projectionMatrix.Set(shaderProgram) 

    ' bind vertex buffer and array objects 
    vertexBuffer.Bind() 
    vertexArray.Bind() 

    ' upload vertices to GPU and draw them 
    vertexBuffer.BufferData() 
    vertexArray.enableAll() 
    vertexBuffer.Draw() 

    ' reset state for potential further draw calls (optional, but good practice) 
    vertexArray.DisableAll() 
    GL.BindVertexArray(0) 
    GL.BindBuffer(BufferTarget.ElementArrayBuffer, 0) 
    GL.BindBuffer(BufferTarget.ArrayBuffer, 0) 
    GL.UseProgram(0) 

    ' swap backbuffer 
    SwapBuffers() 

이러한 모든 기능을 추상화하고 그들에게 명령 {어떤} 원래 GL이 (예, 뻔뻔 here에서 코드를 복사됩니다.)

내 VertexBuffer에의의.

,536,913,632이 나에게 오류를 제공

Public Sub Bind() 
    ' make this the active array buffer 
    GL.BindBuffer(BufferTarget.ArrayBuffer, Me.handle) 
End Sub 

Public Sub BufferData() 
    ' copy contained vertices to GPU memory 
    GL.BufferData(BufferTarget.ArrayBuffer, New IntPtr(Me.vertexSize * Me.count), Me.vertices, BufferUsageHint.StreamDraw) 
End Sub 

Public Sub Draw() 
    ' draw buffered vertices as triangles 
    'GL.DrawArrays(PrimitiveType.Triangles, 0, Me.count)  <--commented 
    GL.DrawElements(PrimitiveType.Triangles, 6, DrawElementsType.UnsignedInt, 0) '<--line 44 
End Sub 

: 코드를 그릴 10

나는 각 그리기 후에 vertexarrays를 비활성화해야한다고 읽었으므로 그 역시 아무런 도움이되지 않았습니다. this question을 보았지만 나에게도 도움이되지 않았습니다 (초보자).

대신에, 정점 버퍼의 draw 메소드에서 glDrawArrays를 사용하면 완벽하게 렌더링됩니다.하지만 glDrawArrays를 사용하고 싶지는 않습니다.

Public Sub Draw() 
    ' draw buffered vertices as triangles 
    GL.DrawArrays(PrimitiveType.Triangles, 0, count) 
    ' commented line --> GL.DrawElements(PrimitiveType.Triangles, 5, DrawElementsType.UnsignedInt, 0) 
End Sub 

답변

0

제작! 이 신사에

감사 : DeathByAlgorithm

glDrawElements 당신이 내 코드가 결여 된 인덱스 버퍼를 지정해야합니다. ,

Class IndexBuffer 
    Private handle% 
    Private data As UInteger() 
    Sub New(ParamArray Indices As UInteger()) 
     handle = GL.GenBuffer() 
     data = Indices 
    End Sub 
    Public Sub Bind() 
     GL.BindBuffer(BufferTarget.ElementArrayBuffer, handle) 
    End Sub 
    Public Sub BufferData() 
     GL.BufferData(Of UInteger)(BufferTarget.ElementArrayBuffer, CType(Marshal.SizeOf(New UInteger) * data.Length, System.IntPtr), data, BufferUsageHint.StaticDraw) 
    End Sub 
End Class 

gamewindow 클래스의 필드 "indexbuffer"을 만들어, 그것을 inititalised : 그래서 간단한 IBO 래퍼를 만든 후 바인더 제본

indexbuffer = New IndexBuffer({0, 1, 2, 3, 4, 5}) 

을하고 indexbuffer의 데이터를 버퍼링. 내 최종 렌더링 코드 :

 ' clear the screen 
    GL.ClearColor(Color4.Purple) 
    GL.Clear(ClearBufferMask.ColorBufferBit Or ClearBufferMask.DepthBufferBit) 

    ' activate shader program and set uniforms 
    shaderProgram.Use() 
    projectionMatrix.Set(shaderProgram) 

    ' bind vertex buffer and array objects 
    vbo.Bind() 
    vertexArray.Bind() 
    indexbuffer.Bind() 

    ' upload vertices to GPU and draw them 
    vbo.BufferData() 
    indexbuffer.BufferData() 

    GL.EnableClientState(ArrayCap.VertexArray) 'works without this line 

    vbo.Draw() 

    ' reset state for potential further draw calls (optional, but good practice) 
    GL.BindVertexArray(0) 
    GL.BindBuffer(BufferTarget.ElementArrayBuffer, 0) 
    GL.BindBuffer(BufferTarget.ArrayBuffer, 0) 
    GL.DisableClientState(ArrayCap.VertexArray) 'works without this line 
    GL.UseProgram(0) 

    ' swap backbuffer 
    SwapBuffers() 

모든 것이 작동합니다!

관련 문제