You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OpenGL中glDrawElements无法工作但glDrawArrays正常的问题求助

问题:OpenGL中使用EBO配合glDrawElements无法绘制矩形,glDrawArrays可正常工作

我尝试用OpenGL绘制一个简单矩形,以下是实现的VBA代码:

Public VAO As Long
Public VBO As Long
Public EBO As Long
Public Shader As std_Shader
Public Indices(5) As Long
Public Positions(11) As Long

Public Function RunMain() As Long
    Call glutInit(0&, "")

    Call glutInitContextVersion(4, 6)
    Call glutInitContextProfile(GLUT_CORE_PROFILE Or GLUT_DEBUG)

    Call glutSetOption(GLUT_ACTION_ON_WINDOW_CLOSE, GLUT_ACTION_GLUTMAINLOOP_RETURNS)
    
    Call glutInitWindowSize(1600, 900)
    Call glutInitDisplayMode(GLUT_RGBA)
    
    Call glutCreateWindow("OpenGL Cube")

    Call GLStartDebug()

    Call glEnable(GL_BLEND)
    Call glEnable(GL_DEPTH_TEST)
    Call glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
    

    Call glutDisplayFunc(AddressOf DrawLoopFirstTemp)
    Call glutIdleFunc(AddressOf DrawLoopTemp)

    Call glutMainLoop
End Function

Public Sub DrawLoopFirstTemp()
    Static Initialized As Boolean
    If Initialized = True Then Exit Sub
    Initialized = True
    Set Shader = New std_Shader
    Call Shader.CreateFromFile(ThisWorkbook.Path & "\Vertex.Shader", ThisWorkbook.Path & "\Fragment.Shader")
    Call Shader.Bind()
    Indices(00) = 0: Indices(01) =  1: Indices(02) =  3
    Indices(03) = 1: Indices(04) =  2: Indices(05) =  3

    Positions(00) = +0.5: Positions(01) = +0.5: Positions(02) = +0.0 ' 0| x, y, z
    Positions(03) = +0.5: Positions(04) = -0.5: Positions(05) = +0.0 ' 1| x, y, z
    Positions(06) = -0.5: Positions(07) = -0.5: Positions(08) = +0.0 ' 3| x, y, z
    Positions(09) = -0.5: Positions(10) = +0.5: Positions(11) = +0.0 ' 4| x, y, z

    Call glFrontFace(GL_CW)
    Call glGenVertexArrays(1, VAO)
    Call glBindVertexArray(VAO)

    Call glGenBuffers(1, VBO)
    Call glBindBuffer(GL_ARRAY_BUFFER, VBO)
    Call glBufferData(GL_ARRAY_BUFFER, 4 * (Ubound(Positions) + 1), VarPtr(Positions(0)), GL_STATIC_DRAW)
    
    Call glGenBuffers(1, EBO)
    Call glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO)
    Call glBufferData(GL_ELEMENT_ARRAY_BUFFER, 4 * (Ubound(Indices) + 1), VarPtr(Indices(0)), GL_STATIC_DRAW)

    Call glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3*4, 0)
    Call glEnableVertexAttribArray(0)
End Sub

Public Sub DrawLoopTemp()
    Call glClearColor(0.2!, 0.3!, 0.3!, 1.0!)
    Call glClear(GL_COLOR_BUFFER_BIT)
    Call glClear(GL_DEPTH_BUFFER_BIT)

    Call glUseProgram(Shader.LinkedShader)
    Call glBindVertexArray(VAO)
    Call glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO)

    Call glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0)   ' 无法正常工作
    Call glDrawArrays(GL_TRIANGLES, 0, 4)                      ' 可正常工作(除最后一个顶点外)

    Call glutSwapBuffers()
End Sub

着色器代码

顶点着色器:

#version 460 core
layout(location = 0) in vec3 aPosition;

void main()
{
    gl_Position =  vec4(aPosition.x, aPosition.y, aPosition.z, 1.0);
}

片段着色器:

#version 460 core
out vec4 color;
void main()
{
   color = vec4(0.2f, 0.3f, 0.8f, 1.0f);
}

着色器已成功编译并链接,调试回调未检测到其他错误。仅使用VBO时一切正常,但使用EBO配合glDrawElements时无法正常绘制,而glDrawArrays可以正常工作(除最后一个顶点外)。我已尝试调整顶点顺序、开启面剔除、检查缓冲区数据、修改数据类型、切换线框模式等多种方案,均无效果。

内容的提问来源于stack exchange,提问作者Almesi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 00:39:51