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

glVertexAttribPointer()上的pyopengl错误

齐乐逸
2023-03-14

我在glvertexattributepointer上出错,可能是因为该值或任何(?)有人知道如何解决这个问题吗?

import glfw
from OpenGL.GL import *
import OpenGL.GL.shaders
import numpy as np
from PIL import Image


def main():
    if not glfw.init():
        return

    window = glfw.create_window(720, 720, "08_A_xxx: PyOpengl dan tekstur", None, None)

    if not window:
        glfw.terminate()
        return

    glfw.make_context_current(window)


                   #posisi          warna               koordinat tekstur
    rectangle = [-0.5, -0.5, 0.0,   1.0, 0.0, 0.0,          0.0, 0.0,
            0.5, -0.5, 0.0,         0.0, 1.0, 0.0,          1.0, 0.0,
            0.5, 0.5, 0.0,          0.0, 0.0, 1.0,          1.0, 1.0,
            -0.5, 0.5, 0.0,         1.0, 1.0, 1.0,           0.0, 1.0]


    # ubah ke 32 bit (float)

    rectangle = np.array(rectangle, dtype=np.float32)


    indices = [0,1,2,
              2,3,0]

    indices = np.array(indices, dtype = np.uint32)

    VERTEX_SHADER = """

           #version 330

           in vec3 position;
           in vec3 color;
           in vec2 InTexCoords;

           out vec3 newColor;
           out vec2 OutTexCoords;

           void main() {

            gl_Position = vec4(position, 1.0);
            newColor = color;
            OutTexCoords = InTexCoords;

             }


       """

    FRAGMENT_SHADER = """
        #version 330

         in vec3 newColor;
         in vec2 OutTexCoords;

         out vec4 outColor;
         uniform sampler2D samplerTex;

        void main() {

           outColor = texture(samplerTex, OutTexCoords);

        }

    """

    # Kompilasi program dan shaders

    shader = OpenGL.GL.shaders.compileProgram(OpenGL.GL.shaders.compileShader(VERTEX_SHADER, GL_VERTEX_SHADER),
                                              OpenGL.GL.shaders.compileShader(FRAGMENT_SHADER, GL_FRAGMENT_SHADER))

    # Buat objek buffer dalam gpu
    VBO = glGenBuffers(1)
    # Bind the buffer
    glBindBuffer(GL_ARRAY_BUFFER, VBO)
    glBufferData(GL_ARRAY_BUFFER, 128, rectangle, GL_STATIC_DRAW)


    # Buat EBO
    EBO = glGenBuffers(1)
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO)
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices, GL_STATIC_DRAW)



    # mendapatkan posisi dari shader
    position = glGetAttribLocation(shader, 'position')
    glVertexAttribPointer(position, 3, GL_FLOAT, GL_FALSE, 32, ctypes.c_void_p(0))
    glEnableVertexAttribArray(position)

    # mendapatkan warna dari  shader
    color = glGetAttribLocation(shader, 'color')
    glVertexAttribPointer(color, 3, GL_FLOAT, GL_FALSE, 32, ctypes.c_void_p(12))
    glEnableVertexAttribArray(color)

    texCoords = glGetAttribLocation(shader, "InTexCoords")
    glVertexAttribPointer(texCoords,2, GL_FLOAT, GL_FALSE, 32, ctypes.c_void_p(24))
    glEnableVertexAttribArray(texCoords)

    # Buat Tekstur
    texture = glGenTextures(1)
    glBindTexture(GL_TEXTURE_2D, texture)
    # texture wrapping params
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT)
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT)
    # texture filtering params
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)

    image = Image.open("hello.jpg")
    img_data = np.array(list(image.getdata()), np.uint8)
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 512, 512, 0, GL_RGB, GL_UNSIGNED_BYTE, img_data)


    glUseProgram(shader)

    glClearColor(0.0, 0.0, 0.0, 1.0)

    while not glfw.window_should_close(window):
        glfw.poll_events()

        glClear(GL_COLOR_BUFFER_BIT)

        # Gambar segiempat

        glDrawElements(GL_TRIANGLES,6, GL_UNSIGNED_INT,  None)

        glfw.swap_buffers(window)

    glfw.terminate()


if __name__ == "__main__":
    main()

共有1个答案

杜俊晤
2023-03-14

属性颜色不是活动的程序资源,因为该属性在着色器程序中未“使用”。该属性从顶点传递到片段着色器,但片段着色器忽略输入变量newColor。优化算法对属性进行排序
因此,glGetAttributeLocation返回-1,最后glVertexAttributePointer失败。

无需为属性颜色指定顶点属性数据数组,因为根本不需要该数组。如果glGetAttribLocation返回的值大于或等于0,请进行评估,以解决问题:

color = glGetAttribLocation(shader, 'color')
if color >= 0:
    glVertexAttribPointer(color, 3, GL_FLOAT, GL_FALSE, 32, ctypes.c_void_p(12))
    glEnableVertexAttribArray(color)
 类似资料:
  • 我被告知从其他stackoverflow帖子将遗留配置文件切换到核心配置文件,但我似乎找不到这样做的方法。所以我假设一个更新的错误帖子来帮助我找到一个方法。 代码: 我一直收到这个错误 回溯(最近一次调用): 我似乎找不到任何方法来解决这个问题。我是OpenGL/PyOpenGL新手,找不到任何提出大致相同问题的帖子

  • Python中要访问OpenGL函数必须加上一个PyOpenGL包。

  • 因此,我们有两条glVertexAttribPointer线,因为我们在顶点着色器中定义了两个变量。所以基本上我们定义了这两个变量所指向的。因此,第一个glVertexAttribPointer定义第一个变量“position”是一个顶点,每个顶点有三个浮动坐标。第二个glVertexAttribPointer定义了第二个变量“texcoord”,它是一对纹理坐标,每个坐标都是浮动的。所以,如果到

  • 我正在尝试将一个OpenGLES代码移植到OpenGL,但我对GlvertexatTribPointer有点困惑。下面是OpenGLES代码的一部分: 那么如何使用OpenGL创建缓冲区呢?因为在OpenGLES中,顶点是直接从glVertexAttribArray函数中的当前数组缓冲区中获取的。我尝试使用glBufferData,但它不起作用。

  • 当我通过LWJGL学习OpenGL时,我一直在浏览LWJGL wiki上的教程。具体来说,这个。 我的问题是,尽管我已经复制了该代码、调用调用、函数对函数,但需要切换两个顶点属性指针(所以代码如下所示: 将其切换为位置索引为1而颜色索引为0,可以像预期的那样进行很好的渐变渲染。但是,如果我在切换索引的情况下运行它(我认为它应该工作的方式,我得到了这个: 显然,在研究了一段时间后,位置和颜色数据已经

  • 我想渲染一个由许多立方体组成的大场景。我的第一个想法是创建一个立方体VBO,然后使用统一的模型矩阵多次绘制它来转换它。这很慢,因为我在每帧调用很多次。 所以我决定用一个巨大的VBO来代替每个立方体顶点和一个额外的平移向量。基本上,我使用我的旧通用多维数据集VBO加上转换向量,并将该列表附加到我想要绘制的每个多维数据集的VBO列表中。然后我绑定一个VAO并绘制它。我还更改了顶点着色器,使其接受该平移