OpenGL绘制的四边形颜色与指定值不符问题求助
问题原因
你遇到的混色问题核心是顶点颜色属性的步长(stride)参数设置错误,外加渲染调用和资源初始化的顺序颠倒,导致颜色读取位置错乱:
- 每个顶点共7个float属性(4个位置+3个颜色),步长应为
7*4=28字节,你给color属性设置的步长是24,导致读取后续顶点颜色时偏移错误,拿到了其他顶点的非颜色数据,最终出现混色。 - 你的
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
相关产品推荐
相关产品推荐

