首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PyOpenGl验证失败

PyOpenGl验证失败
EN

Stack Overflow用户
提问于 2018-11-13 10:32:13
回答 1查看 1.3K关注 0票数 3

我正在尝试用pyopengl创建一个简单的场景,但是我一直在获取运行时错误。我使用glfw来显示opengl场景。

我使用python是因为我希望在其他python项目中包含opengl。

我在macOS Mojave上(10.14),Python3.7

错误:

代码语言:javascript
复制
Traceback (most recent call last):
File "main.py", line 109, in <module>
main()
File "main.py", line 64, in main
shader = OpenGL.GL.shaders.compileProgram(s.vertex(), s.fragment())
File "slib/python3.7/site-packages/OpenGL/GL/shaders.py", line 196, in         
compileProgram
program.check_validate()
File "lib/python3.7/site-packages/OpenGL/GL/shaders.py", line 108, in 
check_validate
glGetProgramInfoLog( self ),
RuntimeError: Validation failure (0): b'Validation Failed: No vertex 
array object bound.\n'

代码:

代码语言:javascript
复制
import glfw
from OpenGL.GL import *
import OpenGL.GL.shaders
import numpy as np


def trikotnik():
    trikotnik = np.array([
        -0.5, -0.5, 0.0,
        0.5, -0.5, 0.0,
        0.0, 0.5, 0.0
    ], dtype=np.float32)
    return trikotnik


class Shaders:
    def __init__(self):
        pass

    def vertex(self):
        v = """
        #version 330
        in vec4 position; 
        void main() { 
            gl_Position = position; 
        } 
        """
        return OpenGL.GL.shaders.compileShader(v, GL_VERTEX_SHADER)

    def fragment(self):
        f = """
        #version 330
        out vec4 fragColor;
        void main() { 
            fragColor = vec4( 0, 1, 0, 1 );
        } 
        """
        return OpenGL.GL.shaders.compileShader(f, GL_FRAGMENT_SHADER)


def main():
    # Initialize the library
    if not glfw.init():
        return
    glfw.window_hint(glfw.CONTEXT_VERSION_MAJOR, 3)
    glfw.window_hint(glfw.CONTEXT_VERSION_MINOR, 2)
    glfw.window_hint(glfw.OPENGL_PROFILE, glfw.OPENGL_CORE_PROFILE)
    glfw.window_hint(glfw.OPENGL_FORWARD_COMPAT, GL_TRUE)

    # Create a windowed mode window and its OpenGL context
    window = glfw.create_window(640, 480, "Hello World", None, None)
    if not window:
        glfw.terminate()
        return

    # Make the window's context current
    glfw.make_context_current(window)

    # Creating shaders
    s = Shaders()
    shader = OpenGL.GL.shaders.compileProgram(s.vertex(), s.fragment())

    # Creating vertex buffer object on gpu
    VBO = glGenBuffers(1)
    glBindBuffer(GL_ARRAY_BUFFER, VBO)
    # Load data on array buffer...32 = size in bytes 9x4
    # GL_STATIC_DRAW: The vertex data will be uploaded once and drawn many times.
    glBufferData(GL_ARRAY_BUFFER, 32, trikotnik(), GL_STATIC_DRAW)
    glBindBuffer(GL_ARRAY_BUFFER, VBO)

    position = glGetAttribLocation(shader, "position")
    glVertexAttribPointer(
        position,  # attribute 0. No particular reason for 0, but must match the layout in the shader.
        3,  # size
        GL_FLOAT,  # type
        GL_FALSE,  # normalized
        0,  # stride
        None  # array buffer offset
    )
    glEnableVertexAttribArray(position)

    glUseProgram(shader)

    glClearColor(0, 107, 179, 1.0)

    # Loop until the user closes the window
    while not glfw.window_should_close(window):
        # Render here, e.g. using pyOpenGL

        # Clear color buffer
        glClear(GL_COLOR_BUFFER_BIT)

        # Draw
        glDrawArrays(GL_TRIANGLES, 0, 3)

        # Swap front and back buffers
        glfw.swap_buffers(window)
        # Poll for and process events
        glfw.poll_events()

    glfw.terminate()


if __name__ == "__main__":
    main()

我在源代码中找到了这个:

验证(仅关键字) --如果为False,则抑制针对当前GL状态的自动验证。在高级使用中,验证会产生虚假错误。注意:这个函数实际上并不适合高级使用,如果您发现自己指定了这个标志,那么您应该使用自己的着色器管理代码。

我试着把它设置为假,但我仍然得到一个错误。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-13 10:40:25

要么使用顶点阵列对象,要么切换到兼容性配置文件上下文glfw.window_hint(glfw.OPENGL_PROFILE, glfw.OPENGL_COMPAT_PROFILE)。在核心配置文件中,必须有一个名为VAO的名称,它不是可选的。

在指定顶点数组数据数组之前,创建并绑定VAO:

代码语言:javascript
复制
VAO = glGenVertexArrays(1)
glBindVertexArray(VAO)

glVertexAttribPointer(
    position,  # attribute 0. No particular reason for 0, but must match the layout in the shader.
    3,  # size
    GL_FLOAT,  # type
    GL_FALSE,  # normalized
    0,  # stride
    None  # array buffer offset
)
glEnableVertexAttribArray(position)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53279015

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档