- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我遇到一个奇怪的问题,我试图使用两个不同的 VBO 并使用 glDrawArrays()。然而,尽管 VBO 数据不同,但 glDrawArrays() 绘制的图形完全相同
import ctypes
import numpy as np
import pygame as pg
from pygame.locals import *
from array import array
SCREEN_SIZE = (800, 600)
from OpenGL.GL import *
from OpenGL.GLU import *
def resize(width, height):
glViewport(0, 0, width, height)
glMatrixMode(GL_PROJECTION)
glLoadIdentity()
gluPerspective(60.0, float(width)/height, .1, 1000.)
glMatrixMode(GL_MODELVIEW)
glLoadIdentity()
def create_shader(shader_type,source):
shader = glCreateShader(shader_type)
glShaderSource(shader,source)
glCompileShader(shader)
print(glGetShaderiv(shader, GL_COMPILE_STATUS, None))
return shader
pg.init()
screen = pg.display.set_mode(SCREEN_SIZE, HWSURFACE|OPENGL|DOUBLEBUF)
resize(*SCREEN_SIZE)
#creating and compiling fragment shader
fragment = create_shader(GL_FRAGMENT_SHADER,"""
#version 130
out vec4 finalColor;
void main()
{
finalColor = vec4(.0,0.0,1.0,1.0);
}
""")
#creating and compiling vertex shader
vertex = create_shader(GL_VERTEX_SHADER,"""
#version 130
in vec3 pos;
void main()
{
gl_Position=gl_ProjectionMatrix*gl_ModelViewMatrix *vec4(pos,1.0);
}
""")
#create and link program
program = glCreateProgram()
glAttachShader(program, fragment)
glAttachShader(program, vertex)
glLinkProgram(program)
#get location of the position variable in vertex shader
posAttrib = glGetAttribLocation(program, "pos")
vbo=glGenBuffers(1)
vbo2=glGenBuffers(1)
#vao=glGenVertexArrays(1)
#glBindVertexArray(vao)
glBindBuffer(GL_ARRAY_BUFFER, vbo)
vertices=[1.5, -0.5, -4.0, 0.5, -0.5, -4.0, 0.5, 0.5, -4.0]
nparray = np.array(vertices,dtype=np.dtype('<f4'))
glBufferData(GL_ARRAY_BUFFER, nparray, GL_STATIC_DRAW)
vertices=[2., -0.5, -4.0, -0.5, -0.5, -2.0, 0.5, 0.5, -1.0]
#vertices=[1.5, -0.5, -4.0, 0.5, -0.5, -4.0, 0.5, 0.5, -4.0]
nparray = np.array(vertices,dtype=np.dtype('<f4'))
glBindBuffer(GL_ARRAY_BUFFER, vbo2)
glBufferData(GL_ARRAY_BUFFER, nparray, GL_STATIC_DRAW)
#specify how the variable pos gets data from the buffer data
glEnableVertexAttribArray(posAttrib)
glVertexAttribPointer(posAttrib, 3, GL_FLOAT, False, 3*4,ctypes.cast(0, ctypes.c_void_p))
while 1:
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glClearColor(1.0, 1.0, 1.0, 0.0)
glUseProgram(program)
glBindBuffer(GL_ARRAY_BUFFER, vbo)
print('vbo 1:',glGetInteger(GL_ARRAY_BUFFER_BINDING))
print('vbo data 1:',glGetBufferSubData(GL_ARRAY_BUFFER,0,3*3*4,None))
# glDrawArrays(GL_TRIANGLES, 0, 3)
glBindBuffer(GL_ARRAY_BUFFER, vbo2)
print('vbo 2:',glGetInteger(GL_ARRAY_BUFFER_BINDING))
print('vbo data 2:',glGetBufferSubData(GL_ARRAY_BUFFER,0,3*3*4,None))
glDrawArrays(GL_TRIANGLES, 0, 3)
pg.display.flip()
pg.time.delay(100)
代码的重要部分是我使用 glBufferData 和绘制命令 glDrawArrays 上传数据的地方。如果您尝试注释掉其中一个或另一个 glDrawArrays(),您将看到代码实际上绘制了完全相同的图形。然而,我向两个VBO上传了不同的数据(通过打印用glGetBufferSubData获得的数据可以看出)。这很奇怪。当 VBO 数据明显不同时,为什么两个 glDrawArray 产生相同的结果?这是 PyOpenGL 中的错误还是我在这里遗漏了一些基本的东西?
最佳答案
它不是定义通用顶点属性数据数组的绑定(bind)顶点缓冲区对象,而是存储在默认顶点数组对象中的状态。
当您调用glVertexAttribPointer
时定义了通用顶点属性数据的数组。如果此时绑定(bind)了数组缓冲区,则数组定义引用的是缓冲区对象。
这意味着您必须在绘制对象之前切换数组定义:
# define an array of generic vertex attribute data which refers to "vbo"
glBindBuffer(GL_ARRAY_BUFFER, vbo)
glVertexAttribPointer(posAttrib, 3, GL_FLOAT, False, 0,ctypes.cast(0, ctypes.c_void_p))
glEnableVertexAttribArray(posAttrib)
glDrawArrays(GL_TRIANGLES, 0, 3)
# define an array of generic vertex attribute data which refers to "vbo2"
glBindBuffer(GL_ARRAY_BUFFER, vbo2)
glVertexAttribPointer(posAttrib, 3, GL_FLOAT, False, 0,ctypes.cast(0, ctypes.c_void_p))
glEnableVertexAttribArray(posAttrib)
glDrawArrays(GL_TRIANGLES, 0, 3)
作为替代方案,您可以使用 2 Vertex Array Objects :
# vertex data 1
vertices=[1.5, -0.5, -4.0, 0.5, -0.5, -4.0, 0.5, 0.5, -4.0]
nparray = np.array(vertices,dtype=np.dtype('<f4'))
vbo=glGenBuffers(1)
glBindBuffer(GL_ARRAY_BUFFER, vbo)
glBufferData(GL_ARRAY_BUFFER, nparray, GL_STATIC_DRAW)
# vertex data 2
vertices=[2., -0.5, -4.0, -0.5, -0.5, -2.0, 0.5, 0.5, -1.0]
nparray = np.array(vertices,dtype=np.dtype('<f4'))
vbo2=glGenBuffers(1)
glBindBuffer(GL_ARRAY_BUFFER, vbo2)
glBufferData(GL_ARRAY_BUFFER, nparray, GL_STATIC_DRAW)
# vertex array object 1
vao=glGenVertexArrays(1)
glBindVertexArray(vao)
glBindBuffer(GL_ARRAY_BUFFER, vbo)
glEnableVertexAttribArray(posAttrib)
glVertexAttribPointer(posAttrib, 3, GL_FLOAT, False, 3*4,ctypes.cast(0, ctypes.c_void_p))
# vertex array object 2
vao2=glGenVertexArrays(1)
glBindVertexArray(vao2)
glBindBuffer(GL_ARRAY_BUFFER, vbo2)
glEnableVertexAttribArray(posAttrib)
glVertexAttribPointer(posAttrib, 3, GL_FLOAT, False, 3*4,ctypes.cast(0, ctypes.c_void_p))
glBindBuffer(GL_ARRAY_BUFFER, 0)
glBindVertexArray(0)
# draw vertex array 1
glBindVertexArray(vao)
glDrawArrays(GL_TRIANGLES, 0, 3)
# draw vertex array 2
glBindVertexArray(vao2)
glDrawArrays(GL_TRIANGLES, 0, 3)
关于python - PyOpenGL,无法使用两个不同的VBO进行绘制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49894819/
我有一个在 blender 中创建的 3-D 对象。我想从 blender 中导出它并能够将它导入到 OpenGL 中。是否有为此过程推荐的方法或特定的文件扩展名? 最佳答案 来自 Here: 使用
我正在尝试使用 pillow 加载图像在 OpenGL 中绘制二维图像,但是当我在 OpenGL 中渲染它时,图像是倾斜的。 这是原始图像: 加载.png 这是代码: # -*- coding: ut
我正在尝试使用 pyopengl 创建一个简单的场景,但我不断收到运行时错误。我正在使用 glfw 来显示 opengl 场景。 我使用 python 是因为我想在其他一些 python 项目中包含
我遇到一个奇怪的问题,我试图使用两个不同的 VBO 并使用 glDrawArrays()。然而,尽管 VBO 数据不同,但 glDrawArrays() 绘制的图形完全相同 import ctypes
我从特定的角度(使用 View 和投影矩阵)绘制了一个特定的场景。我使用了三角形的 VBO 等等。我可以使用以下方法获取图像的 RGB: data = glReadPixels(0, 0, width
所以我只是测试一下我的引擎中的工作原理,并尝试简单地使用以下命令来旋转对象。 rot_y = Matrix44.from_y_rotation(glfw.get_time() * 0.5) 但是...
我有一个需要快速渲染的场景。所以我成功地将三角形的顶点生成为 numpy,上传到 GPU 并以非常快的速度渲染它。到目前为止一切顺利。 当场景中的某些元素需要从场景中消失时,问题就开始了。我所做的就是
所以我有一个问题,我已经追了几天了,但找不到任何帮助。我刚刚开始尝试学习 pyOpenGL 并很快遇到了这个问题。我希望我已经包含了足够的信息,感谢您的帮助。 问题: 当我绘制一个立方体时,后面的一些
我正在进行 PyQt5 PyOpenGL 项目。我正在尝试用一堆彩色实心立方体绘制一个白色线框立方体。线框立方体是从元组点列表以及对这些点的元组引用列表中绘制的。实心立方体是从对点的元组引用列表中绘制
我尝试了一切,但仍然没有得到我的错误。我正在尝试在我的球体对象上放置纹理。 """ Minimal texture on sphere demo This is demo for showing ho
我对 PyOpenGL 比较陌生,并开始学习转换以及模型、 View 和投影矩阵。一切都很好,直到我编译并运行我的代码,发现我的对象突然消失了,说实话,我不知道 OpenGL 是否正在裁剪我的对象,或
经过一些建议,我决定用困难的方式学习一点 OpenGL。我尝试将一个 (float - 名为 myAttrib) 变量传递给顶点着色器,它似乎有效(第 33 行),但显然不起作用't。稍后我想将代码分
好吧,感谢你们,我对OpenGL在(几乎)现代工作中的了解有了更深入的了解。但有件事我想不通。 即使我错过了正确设置的片段着色器如何对我的纹理进行采样?我认为采样器会以某种方式自动获取纹理。但如何呢?
我的问题是我的程序显示一个具有 120-fps 限制的简单立方体只能以 25 fps 运行。我发现所有性能损失都在 OpenGL 部分,但我无法弄清楚具体位置。 我的问题是: OpenGL 在 Pyt
这个问题在这里已经有了答案: What is the proper way to modify OpenGL vertex buffer? (3 个答案) 关闭 2 年前。 我想在 PyOpenGL
所以我一直在绞尽脑汁地不停地试错。我觉得我总是带着关于同一件事的问题回来,这令人沮丧。 我正在按照教程查看 C++ 代码,并跟随 Python 尝试复制结果。我注意到通过反复试验存在细微差别,并且我在
出现包含GLUT图形的窗口后,我想在终端输入: user@computer: python woop.py # Now displaying a beautiful landscape (cmd):
我刚刚开始学习 pyOpenGL 并遇到了一个问题,我的第一个项目非常简单:我试图打开一个窗口并使用着色器绘制一个简单的三角形。我使用 glfw 创建窗口,所有内容都正确编译,但未绘制三角形。 我的主
我使用了Python Imaging Library来加载.ttf字体。这是代码: self.rect = Image.new("RGBA", (600,100), (255,255,255)) se
我正在尝试用 Pygame 创建一个 2D python 游戏。 但我意识到我可以使用 PyOpengl,所以我尝试学习如何使用它。我可以在我的屏幕上用顶点创建一个三角形 strip 。但是,我想使用
我是一名优秀的程序员,十分优秀!