我在Ubuntu Natty上使用PyOpenGL 3.
我想使用这个glDrawElementsBaseVertex功能.
我可以看到它列在我的glxinfo输出中,所以我知道我的卡有它.
但是,我找不到如何实际调用它.如果我尝试使用它,当我import OpenGL.GL得到NameError它.(与它不同None).
我现在正在玩glsl.为此,我需要将一个数组从opengl代码传递给gsls,然后返回gsls计算出一个新的颜色.但不知何故,这对我不起作用.而不是获得整个阵列我总是只停留在第一个条目.你能帮我说一下我做错了什么吗?
import numpy as np
\\...
array = np.array([1.2,2.5,3.8,4.3,5.6, #....])
location = glGetUniformLocation(program,"arrayInShader")
glUniform1fv(location,1,array)
Run Code Online (Sandbox Code Playgroud)
并在着色器中:
uniform float arrayInShader[5];
varying vec3 color;
void main()
{
color.r=arrayInShader[0]+arrayInShader[1];
color.g=arrayInShader[2];
color.b=arrayInShader[3]+arrayInShader[4];
}
Run Code Online (Sandbox Code Playgroud)
非常感谢!
我一直在尝试编译PyQt5 helloGL 示例代码。当我尝试构建解决方案时,我得到:
Traceback (most recent call last):
File "C:\Users\\-PATH-\trunk\view\test.py", line 142, in initializeGL
self.gl = self.context().versionFunctions()
ImportError: No module named 'PyQt5._QOpenGLFunctions_4_3_Compatibility'
[Finished in 0.3s]
Run Code Online (Sandbox Code Playgroud)
在我的 PyQt5 文件夹中,我有:
_QOpenGLFunctions_4_1_Core.pyd
_QOpenGLFunctions_2_0.pyd
_QOpenGLFunctions_2_1.pyd
Run Code Online (Sandbox Code Playgroud)
作为我的不同版本的 QOpenGLFunctions 集。我试图搜索所有调用 versionFunctions() 的工作方式,以查看是否可以强制它使用 4_1_Core 文件,但无济于事。在几次重新启动后,我现在重新安装了 PyQt5 两次,看看它是否是奇怪的注册表恶作剧 - 这是在我确保更新我的图形驱动程序以便正确版本的 OpenGL 甚至在我的系统上之后(如果那是某种方式)导致问题)
PyOpenGL 已安装并更新,我也重新安装了它。
我的最终目标是将 OpenGL 渲染器嵌入到 Qt 窗口中,但我没有找到很多关于如何在 python 中执行此操作的示例。我使用 Vispy 有一段时间了,但也遇到了很多问题,因为他们的旧 Qt 示例也不再工作了。
我对 PyOpenGL 比较陌生,开始学习转换和模型、视图和投影矩阵。这很好,直到我编译并运行我的代码,然后发现我的对象突然消失了,老实说我不知道 OpenGL 是否正在剪辑我的对象,或者只是因为某些相机错误而没有显示它,但我相信它有一些东西与在我的代码中实现的投影矩阵有关,因为当我从我的代码中删除投影矩阵并运行我的程序时,除了我不会实现透视投影这一事实之外,一切都突然再次工作。无论如何,任何人都会非常感激:D
这是我的 PyOpenGL 代码。
import OpenGL, PIL, pygame, numpy, pyrr, math, sys, os
from OpenGL.GL import *
from PIL import Image
from pyrr import Matrix44, Vector4, Vector3, Quaternion
VERT_DATA = numpy.array([0.5, 0.5, 0.0,
0.5, -0.5, 0.0,
-0.5, -0.5, 0.0,
-0.5, 0.5, 0.0],
dtype="float32")
COLOR_DATA = numpy.array([1.0, 0.0, 0.0, 1.0,
0.0, 1.0, 0.0, 1.0,
0.0, 0.0, 1.0, 1.0,
0.0, 1.0, 1.0, 1.0],
dtype="float32")
TEXTURE_COORD_DATA = numpy.array([0.5, 0.5,
0.5, -0.5,
-0.5, -0.5,
-0.5, 0.5],
dtype="float32")
INDICES = numpy.array([0, …Run Code Online (Sandbox Code Playgroud) 我有兴趣设置一个环境来使用 pyOpenGL 编写粒子模拟器。我已经安装了 pyOpenGL。这是测试代码,只是为了确保 opengl 正常工作。
from OpenGL import *
from OpenGL.GLUT import *
from OpenGL.GLU import *
window = 0
width, height = 500,400
def draw():
glClear(GL_COLOR_BUFFER_BIT |GL_DEPTH_BUFFER_BIT)
glLoadIdentity()
glutDwapBuffers()
#initialization
glutInit()
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_ALPHA | GLUT_DEPTH)
glutInitWindowSize(width,height)
glutInitWindowPosition(0,0)
window = glutCreateWindow(b"noobtute")
glutDisplayFunc(draw)
glutIdleFunc(draw)
glutMainLoop()
Run Code Online (Sandbox Code Playgroud)
但是,当我从命令运行脚本时,出现以下错误:
NameError: name 'glClear' is not defined
GLUT Display callback <function draw at 0x0000000002F8CB70> with (),{} failed:
returning None name 'glClear' is not defined
Run Code Online (Sandbox Code Playgroud)
我尝试重新安装 pyOpengl 但没有成功。
我在 Windows 8.1 上运行 Python …
我正在尝试填充由4行生成的四边形GL_LINES.但是,当我尝试填充四边形时,它只填充三角形.这是绘制线条的代码:
def SurfaceContour(self, vertices, edges):
glBegin(GL_LINES)
for edge in edges:
for vertex in edge:
glColor3fv((1.0, 0.0, 0.0))
glVertex3fv(vertices[vertex])
glEnd()
Run Code Online (Sandbox Code Playgroud)
这是绘制填充四边形的代码:
def Surfaces(self, vertices):
glBegin(GL_QUADS)
for i in range(4):
glColor4f(1, 1, 1, 0.3)
glVertex3fv(vertices[i ,:])
glEnd()
Run Code Online (Sandbox Code Playgroud)
这是我传入的顶点矩阵:
[[ 0. -20.23 7. ]
[ 0. -20.23 -7. ]
[ 100. -10. 5. ]
[ 100. -10. -5. ]]
Run Code Online (Sandbox Code Playgroud)
我正在尝试用Python创建Rubik's Cube,我已经从视觉上表示了这个立方体。如何实施轮换方面有些困难。
我想我正在寻求有关如何执行此操作的反馈。我首先想到的是旋转每个多维数据集的顶点,但是运气不好。
我基本上想从一组多维数据集对象(大小不同)中选择一个切片,对每个对象执行旋转和平移。
import pygame
import random
from pygame.locals import *
from OpenGL.GL import *
from OpenGL.GLU import *
vertices = (
(1, -1, -1),
(1, 1, -1),
(-1, 1, -1),
(-1, -1, -1),
(1, -1, 1),
(1, 1, 1),
(-1, -1, 1),
(-1, 1, 1)
)
edges = (
(0,1),
(0,3),
(0,4),
(2,1),
(2,3),
(2,7),
(6,3),
(6,4),
(6,7),
(5,1),
(5,4),
(5,7)
)
surfaces = (
(0,1,2,3),
(3,2,7,6),
(6,7,5,4),
(4,5,1,0),
(1,5,7,2),
(4,0,3,6)
)
colors = (
(1,0,0), #Red
(0,1,0), …Run Code Online (Sandbox Code Playgroud) 所以我试图运行此:
import pygame
from pygame.locals import *
from OpenGL.GL import *
from OpenGL.GLU import *
Run Code Online (Sandbox Code Playgroud)
但是出现错误并说:
import pygame
ImportError: No module named pygame
Run Code Online (Sandbox Code Playgroud)
有时它说:
Traceback (most recent call last):
File "/Users/Abood/Documents/lol.py", line 3, in <module>
from OpenGL.GL import *
ModuleNotFoundError: No module named 'OpenGL.GL'
Run Code Online (Sandbox Code Playgroud)
但是,即使我尝试将PyCharm的“设置”更改为python 2.7.16并添加了Anaconda,这也适用于IDLE 2.7.16版和Sublime文本。
我今年13岁,对Coding还是陌生的,任何事情都会有所帮助。
谢谢
我们需要在python中制作3D游戏,所以在我的研究中我发现了PyOpenGL.经过一段时间的游戏,我变得难以理解如何移动相机.给我一些示例代码和解释.
我正在尝试学习OpenGL,并且我已经经历了许多关于加载纹理的教程,但是每一个教程似乎都错过了最重要的一步:我如何实际在某些东西上放置纹理?
我正在使用Python,这是我加载纹理的函数:
def loadTexture():
textureSurface = pygame.image.load('test_image.png')
textureData = pygame.image.tostring(textureSurface,"RGBA",1)
width = textureSurface.get_width()
height = textureSurface.get_height()
glEnable(GL_TEXTURE_2D)
texid = glGenTextures(1)
glBindTexture(GL_TEXTURE_2D, texid)
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, textureData)
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT)
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT)
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST)
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST)
return texid
Run Code Online (Sandbox Code Playgroud)
这是加载我的多维数据集的函数:
vertices = (
# x y z
( 1,-1,-1),
( 1, 1,-1),
(-1, 1,-1),
(-1,-1,-1),
( 1,-1, 1),
( 1, 1, 1),
(-1,-1, 1),
(-1, 1, 1)
)
edges = (
(0,1),
(0,3),
(0,4), …Run Code Online (Sandbox Code Playgroud) 因此,我一直在使用learnopengl.com书,并且一直无法让纹理单元工作.起初我在主循环中调用glGetUniform1i,就像他在书中所做的那样,但是建议(通过#learnprogramming IRC)将任何纹理操作限制在主循环之前.使用本书的代码时,问题是纹理不会像片段着色器中那样正确混合,只会渲染绑定到GL_TEXTURE_2D的第二个纹理(在本例中为"faceTexture").翻转渲染顺序可以渲染出先前使用的纹理.
但是,在主循环之前放置纹理单元代码会导致glUniform1i调用上的无效操作:
File "C:/Users/1117254/Documents/Python Experiments/OpenGL/OpenGL Testing/main.py", line 171, in main
glUniform1i(wood_texture_loc, 0)
File "C:\Users\1117254\AppData\Local\Programs\Python\Python36\lib\site-packages\OpenGL\platform\baseplatform.py", line 402, in __call__
return self( *args, **named )
File "errorchecker.pyx", line 53, in
OpenGL_accelerate.errorchecker._ErrorChecker.glCheckError (src\errorchecker.c:1218)
OpenGL.error.GLError: GLError(
err = 1282,
description = b'invalid operation',
baseOperation = glUniform1i,
cArguments = (23724032, 0)
)
Run Code Online (Sandbox Code Playgroud)
我的错误似乎与frag着色器中统一变量的位置有关,但我不确定glGetUniformLocation给出的位置(似乎是23724032)是否有效.
下面的相关源以及顶点和片段着色器:
# Shader
shader = shader_loader.Shader("vertex.vs", "fragment.fs")
# Vertex Buffering
vao = GLuint(0)
vbo = GLuint(0)
ebo = GLuint(0)
glGenVertexArrays(1, vao)
glGenBuffers(1, vbo)
glGenBuffers(1, ebo)
glBindVertexArray(vao)
glBindBuffer(GL_ARRAY_BUFFER, vbo)
glBufferData(GL_ARRAY_BUFFER, …Run Code Online (Sandbox Code Playgroud) 在我的应用程序中,我需要通过glUseProgram(程序)在两个GLSL程序之间切换.我想知道我是否写道:
glUseProgram(program1)
buf1 = glGenBuffers(1)
glUseProgram(program2)
buf2 = glGenBuffers(1)
Run Code Online (Sandbox Code Playgroud)
buf1和buf2可以是相同的值吗?即每个程序都有自己的缓冲区,还是共享缓冲区?
我是 PYopenGL 的新手,实际上,我也不确定 PYopenGL 是否适合我的任务。
我有一个 Wavefront obj 文件格式的 3D 模型。我需要从给定的视图中获取模型的“打印屏幕”。换句话说,我需要渲染模型而不是显示模型将其保存为图像(jpg)
我的想法是使用 PYopenGL 来完成这项任务。但是,谷歌搜索我找不到如何做到这一点的建议或示例。因此,我开始怀疑 PYopenGL 是否适合我的任务。
你们中有人已经有了这样的东西,或者知道一个我可以用来学习的例子吗?
提前致谢。
道