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

OpenGL绘制的四边形颜色与指定值不符问题求助

问题原因

你遇到的混色问题核心是顶点颜色属性的步长(stride)参数设置错误,外加渲染调用和资源初始化的顺序颠倒,导致颜色读取位置错乱:

  1. 每个顶点共7个float属性(4个位置+3个颜色),步长应为7*4=28字节,你给color属性设置的步长是24,导致读取后续顶点颜色时偏移错误,拿到了其他顶点的非颜色数据,最终出现混色。
  2. 你的Screen函数中先执行glDrawArrays绘制,再调用draw初始化着色器、缓冲区和顶点属性,首次绘制时没有有效数据,且每次渲染循环都重复创建资源属于冗余操作,也会引发异常。

修复步骤

1. 修正颜色属性的顶点指针配置

找到draw函数中颜色属性配置行,将步长从24改为28:

# 修改前
glVertexAttribPointer(color, 3, GL_FLOAT, GL_FALSE, 24, ctypes.c_void_p(16))
# 修改后
glVertexAttribPointer(color, 3, GL_FLOAT, GL_FALSE, 28, ctypes.c_void_p(16))

2. 调整执行顺序,避免重复初始化资源

把draw()调用移到主循环之前,仅执行一次即可,同时调整Screen函数的逻辑顺序:

def Screen():
    glClearColor(0, 0, 0, 1)
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
    glViewport(0, 0, width, height)
    glDrawArrays(GL_POLYGON, 0, 4)

def main():
    global width, height
    if not glfw.init():
        return
    window = glfw.create_window(500, 500, "Opengl GLFW Window", None, None)
    if not window:
        glfw.terminate()
        return

    glfw.make_context_current(window)
    # 仅初始化一次资源
    draw()

    while not glfw.window_should_close(window):
        glfw.poll_events()
        Screen()
        width, height = glfw.get_window_size(window)
        glfw.swap_buffers(window)

    glfw.terminate()

修改后即可得到纯红色的四边形,也解决了重复创建资源的性能问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 18:15:11