当前位置: 首页 > 知识库问答 >
问题:

glDrawArray返回无效操作1282-pyOpenGL

金和雅
2023-03-14

我一辈子都搞不懂这件事。我需要第二双眼睛。。。或者更好的大脑。我正在尝试让这个“Hello Triangle”python示例正常工作。我一直在翻译c教程中的内容。然而,无论我做什么,我总是会遇到这个错误。

Traceback (most recent call last):
File ".../demo/tester.py", line 107, in <module>
  if __name__ == '__main__': main()
File ".../demo/tester.py", line 87, in main
  glDrawArrays(GL_TRIANGLES, 0, 3)
File ".../venv/lib/python3.6/site packages/OpenGL/platform/baseplatform.py", line 402, in __call__
  return self( *args, **named )
File ".../venv/lib/python3.6/site-packages/OpenGL/error.py", line 232, in glCheckError
  baseOperation = baseOperation,
OpenGL.error.GLError: GLError(
  err = 1282,
  description = b'invalid operation',
  baseOperation = glDrawArrays,
  cArguments = (GL_TRIANGLES, 0, 3)

我的代码如下。我在Mac上运行,所以你会注意到其中有些东西可能不是PC所需要的。在glDrawArrays出现之前,一切都正常。我知道C版openGL与使用pyOpenGL的python之间的一些函数有些不同。我一直在交叉引用文档,以确保我不会像Python中的C程序员那样编写。

try:
    from AppKit import NSApp, NSApplication
except:
    pass

import sys
import cyglfw3 as glfw
import numpy as np
from OpenGL.GL import *
from OpenGL.GLUT import *
from OpenGL.arrays import vbo as glvbo



def main():
    glfw.Init()
    glfw.WindowHint(glfw.CONTEXT_VERSION_MAJOR, 3)
    glfw.WindowHint(glfw.CONTEXT_VERSION_MINOR, 3)
    glfw.WindowHint(glfw.OPENGL_PROFILE, glfw.OPENGL_CORE_PROFILE)
    glfw.WindowHint(glfw.OPENGL_FORWARD_COMPAT, GL_TRUE)

    window = glfw.CreateWindow(800, 600, 'LearnOpenGL', None)
    if window is None:
        glfw.Terminate()
        exit()

    glfw.MakeContextCurrent(window)
    glfw.SetFramebufferSizeCallback(window, framebuffer_size_callback())

    # Setting up a vertex buffer
    verts = glvbo.VBO(
    np.array([[0.0, 0.5, 0.0], [0.5, -0.5, 0.0], [-0.5, -0.5, 0.0]], 'f')
)

    vbo = glGenBuffers(1)
    glBindBuffer(GL_ARRAY_BUFFER, vbo)
    glBufferData(GL_ARRAY_BUFFER, verts.size, verts, GL_STATIC_DRAW)

    vao = glGenVertexArrays(1)
    glBindVertexArray(vao)
    glEnableVertexAttribArray(vao)
    glBindBuffer(GL_ARRAY_BUFFER, vbo)
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, None)

    vertex_shader = """
        #version 330 core
        in vec3 vp;
        void main() {
            gl_Position = vec4(vp, 1.0);
        }"""

    fragment_shader = """
        #version 330 core
        out vec4 frag_color;
        void main() {
            frag_color = vec4(0.5, 0.0, 0.5, 1.0);
        }"""

    vs = glCreateShader(GL_VERTEX_SHADER)
    glShaderSource(vs, vertex_shader)
    glCompileShader(vs)

    if glGetShaderiv(vs, GL_COMPILE_STATUS) != GL_TRUE:
        raise Exception("vertex shader did not compile")

    fs = glCreateShader(GL_FRAGMENT_SHADER)
    glShaderSource(fs, fragment_shader)
    glCompileShader(fs)

    if glGetShaderiv(fs, GL_COMPILE_STATUS) != GL_TRUE:
        raise Exception("fragment shader did not compile")

    sp = glCreateProgram()
    glAttachShader(sp, fs)
    glAttachShader(sp, vs)
    glLinkProgram(sp)

    if glGetProgramiv(sp, GL_LINK_STATUS) != GL_TRUE:
        raise Exception("program did not link")

    while not glfw.WindowShouldClose(window):

        processInput(window)

        glClearColor(0.0, 0.0, 0.0, 1.0)
        glClear(GL_COLOR_BUFFER_BIT)

        glUseProgram(sp)
        glBindVertexArray(vao)
        glDrawArrays(GL_TRIANGLES, 0, 3)    # This is where things happen

        glfw.PollEvents()
        glfw.SwapBuffers(window)

    glfw.Terminate()
    exit()

def framebuffer_size_callback():
    glViewport(0, 0, 800, 600)

def processInput(window):
    if glfw.GetKey(window, glfw.KEY_ESCAPE) == glfw.PRESS:
        glfw.SetWindowShouldClose(window, True)

if __name__ == '__main__': main()

一天结束时,我想做的就是画一个三角形:(

共有1个答案

汪泓
2023-03-14

我确定有两个问题。

  1. 正如BDL提到的glEnableVertexAttribArray设置不正确。它需要一个索引而不是顶点数组对象
  2. glBufferData大小不正确,因为需要以字节为单位提供大小。在线快速搜索显示(numpy.size*numpy.itemsize)返回数组的大小。

完成这两件事...我有一个三角形。

 类似资料:
  • 我刚刚开始学习现代OpenGL,我在渲染三角形时遇到了麻烦。当我启动程序时,当我尝试调用时,它会给出一个无效操作异常。从控制台日志的外观来看,着色器的设置没有错误,程序也经过了验证。很多代码都是从本教程中复制的。我已经搜索了几个小时,无法找出导致问题的原因。如果我错过了一些基本的东西,我真的很抱歉。 java程序: 顶点着色器: 和片段着色器:

  • 在“普通的”MongoDB中,对DB执行写入操作的方法(如.insertone()或.deleteOne())将分别返回或。这些对象将返回的布尔值和(如果适用)。这允许我们确保写操作成功。 但是,通俗地说,返回的是void: MongoOperations.Class 那么问题是,我们如何检索得到的和对象? 正在使用pom依赖项

  • 我有以下片段着色器: 如果我运行我的程序,我得到opengl错误1282,这是无效操作。如果我不使用texture(),那么我就写texCoord=vec4(...)它工作得很完美。我总是把tid(纹理ID)作为0(没有纹理)传入,所以这个部分甚至不应该运行。我已经将纹理统一设置为某个占位符,但据我所知,这应该无关紧要。那么什么会导致无效操作呢?

  • 在改造2中,表示超文本传输协议方法的服务方法必须返回。 是一个泛型,它必须采用表示超文本传输协议方法的返回对象的类型。 例如 对于删除等http方法,不会返回任何内容。在这种情况下,应该为提供什么参数?

  • 我正面临一个前所未有的奇怪问题。我有一个以毫秒为单位的日期,希望将其显示为可读的日期。这是我的代码: 如你所见,我只想创建一个显示时间跨度的字符串。当我调试代码时,日期对象包含正确的值,而

  • 问题内容: 我正在在线关注CS106A的讲座。我正在阅读第12讲中的代码,但这给了我Eclipse错误。 这是我的代码。似乎错误是由于我的方法中的单词void 。我尝试删除main方法,但是没有它,Java当然无法运行。 我是一名新手,没有人解释这东西的真正含义,但有人告诉我,请不要理会它并使用它。如果有人也可以向我解释,我将不胜感激。 这个错误也出现在“ toLower”方法上。不知道这意味着什