是的,它是什么,为什么它出现在Win2003服务器上,而不是在WinXP上.
它似乎根本不会影响我的应用程序,但是当我关闭应用程序时,我收到此错误消息.它很烦人(因为错误信息应该是).
我正在使用pyOpenGl和wxPython来完成图形处理.不幸的是,我是一名C#程序员,已经接管了这个Python应用程序,我不得不学习Python来做到这一点.
我可以提供代码和版本号等,但我仍在学习技术的东西,所以任何帮助将不胜感激.
Python 2.5,wxPython和pyOpenGL
过去几周我一直在学习OpenGL,我在实现Phong着色器方面遇到了一些麻烦.尽管使用了smooth限定符,但似乎在顶点之间没有插值.我在这里错过了什么吗?为了给予信用到期的信用,顶点和片段着色器的代码严重影响了OpenGL SuperBible第五版.我强烈推荐这本书!
顶点着色器:
#version 330
in vec4 vVertex;
in vec3 vNormal;
uniform mat4 mvpMatrix; // mvp = ModelViewProjection
uniform mat4 mvMatrix; // mv = ModelView
uniform mat3 normalMatrix;
uniform vec3 vLightPosition;
smooth out vec3 vVaryingNormal;
smooth out vec3 vVaryingLightDir;
void main(void) {
vVaryingNormal = normalMatrix * vNormal;
vec4 vPosition4 = mvMatrix * vVertex;
vec3 vPosition3 = vPosition4.xyz / vPosition4.w;
vVaryingLightDir = normalize(vLightPosition - vPosition3);
gl_Position = mvpMatrix * vVertex;
}
Run Code Online (Sandbox Code Playgroud)
片段着色器:
#version 330
out vec4 vFragColor; …Run Code Online (Sandbox Code Playgroud) 所以,我只知道如何使用Python,但我也知道如何在3d中建模.我听说过OpenGL,我真的想学习如何使用,因为它看起来非常有用(我想用它创建简单的游戏......).我找到了PyOpenGL,OpenGL的Python绑定,但我找不到任何"真正的"文档,所以唯一的选择是研究用C++或其他东西编写的代码示例和教程.但是,正如我所说,我只知道如何使用Python.我该怎么办?
我刚刚购买了第五版的OpenGL SuperBible.我很高兴他们避免使用已弃用的功能,但他们的例子可以使用GLTools.GLTools提供了一系列有用的功能,用于渲染简单的3D对象和管理视图截头,相机和变换矩阵.
这一切都很棒,但提供的抽象隐藏了低级细节,我很难移动到我无法使用的代码GLTools- 例如,pyopengl.我在网上看到的绝大多数教程都使用了立即模式,我试图避免这种模式.那些使用glDrawArrays使用的glEnableClientState,这我也想避免的.
我正在寻找的是完全符合OpenGL 3.x的入门教程.如果这个订单太高了,也许洗衣清单很好的"起点"功能将是有序的.
我希望对openGL和Python做一些修改,并且无法找到使用PyOpenGl和pyglet的充分理由
你会推荐哪个?为什么?
我在Win7 x64机器上运行Anaconda Python 2.7并使用
pip install PyOpenGL PyOpenGL_accelerate
Run Code Online (Sandbox Code Playgroud)
在Anaconda命令行安装PyOpenGL.
我有一些使用glutInit的代码(不是我自己必须承认的)
import sys
import math
import numpy
import OpenGL
from OpenGL.GL import *
from OpenGL.GLUT import *
import Image
import linkage
# ... a whole load of definitions etc ...
glutInit(sys.argv)
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB)
glutInitWindowSize(600, 600)
glutCreateWindow('linkage')
init()
initWindow()
glutIdleFunc(idle)
glutMainLoop()
Run Code Online (Sandbox Code Playgroud)
我通过在命令行输入以下命令来运行:
python main.py peaucellier.txt
Run Code Online (Sandbox Code Playgroud)
但后来得到以下错误(第371行是上面的glutInt(sys.argv)行)
File "C:/Users/Owner/Documents/Python Scripts/linkage/main.py", line 371, in <module>
glutInit(sys.argv)
File "C:\Anaconda\lib\site-packages\OpenGL\GLUT\special.py", line 333, in glutInit
_base_glutInit( ctypes.byref(count), holder )
File "C:\Anaconda\lib\site-packages\OpenGL\platform\baseplatform.py", line 407, in __call__
self.__name__, …Run Code Online (Sandbox Code Playgroud) 没关系,我是第一个创建纹理的人,我应该非常清楚我为它加载/生成了多少个mipmap.我这样做是为了进行单元测试.似乎没有一个glGetTexParameter参数可以找到它.我最接近的是这样的:
int max_level;
glGetTexParameter( GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, &max_level );
int max_mipmap = -1;
for ( int i = 0; i < max_level; ++i )
{
int width;
glGetTexLevelParameter( GL_TEXTURE_2D, i, GL_TEXTURE_WIDTH, &width );
if ( 0 == width )
{
max_mipmap = i-1;
break;
}
)
Run Code Online (Sandbox Code Playgroud)
无论如何,glGetTexLevelParameter()如果我使用的是NVidia GPU,将为不存在的mipmap返回0宽度,但是对于Mesa,它会返回GL_INVALID_VALUE,这让我相信这是非常错误的事情.
如何找出我填充纹理的mipmap级别?
我想使用Qt和PyOpenGL做一些实时绘图并学习一些关于OpenGL的内容,但是甚至无法让我的initail测试数据显示出来.
这个想法是将x坐标和y坐标存储在不同的缓冲区中,因为x坐标很少会改变,而y坐标几乎每次渲染都会改变.不幸的是,让它们在不同的缓冲区中给我带来了麻烦.
现在我没有错误,没有任何东西出现,所以我不知道该去哪里.
这是我到目前为止绘图类的内容:
class GLWidget(QtOpenGL.QGLWidget):
def __init__(self, parent=None):
self.parent = parent
QtOpenGL.QGLWidget.__init__(self, parent)
self.current_position = 0
def initializeGL(self):
self.initGeometry()
self.vertex_code = """
#version 120
attribute vec4 color;
attribute float x_position;
attribute float y_position;
varying vec4 v_color;
void main()
{
gl_Position = vec4(x_position, y_position, 0.0, 1.0);
v_color = color;
} """
self.fragment_code = """
#version 120
varying vec4 v_color;
void main()
{
//gl_FragColor = v_color;
gl_FragColor = vec4(1,1,1,1);
} """
## Build and activate program
# Request program and shader …Run Code Online (Sandbox Code Playgroud) 我努力学习游戏编程的基础知识,我已经安装pygame,并pyopengl为.
mycode的:
import sys
import OpenGL
from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *
def draw():
glClear(GL_COLOR_BUFFER_BIT)
glutWireTeapot(0.5)
glFlush()
glutInit(sys.argv)
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB)
glutInitWindowSize(250, 250)
glutInitWindowPosition(100, 100)
glutCreateWindow("Python OGL Program")
glutDisplayFunc(draw)
glutMainLoop()
draw()
Run Code Online (Sandbox Code Playgroud)
当我在命令提示符下运行上面的代码时使用
python test.py
Run Code Online (Sandbox Code Playgroud)
我收到以下错误.
Traceback (most recent call last):
File "test.py", line 13, in <module>
glutInit(sys.argv)
File "C:\Python27\lib\site-packages\pyopengl-3.0.2a5-py2.7.egg\OpenGL\GLUT\special.py", line 324, in glutInit
_base_glutInit( ctypes.byref(count), holder )
TypeError: 'NoneType' object is not callable
Run Code Online (Sandbox Code Playgroud)
我不明白为什么我会收到这个错误.我glutinit是以错误的方式打电话的?
我使用的是Python 2.7.2.
我不想进入复杂的三角函数来计算旋转和我的3D世界那样的东西所以gluLookAt似乎是一个不错的选择.根据文档,我需要做的就是为摄像机位置放置3个坐标,为我应该看到的位置设置3个坐标和"向上"位置.直到我认为它必须与屏幕顶部方向上的视线成直角才是最后的意义.
它根本不起作用.我有一些python代码.这是在我进入游戏的这一部分时初始化一些数据和一些模式代码的代码:
def init(self):
self.game_over = False
self.z = -30
self.x = 0
def transfer(self):
#Make OpenGL use 3D
game.engage_3d(45,0.1,100)
gluLookAt(0,0,-30,0,0,0,0,1,0)
Run Code Online (Sandbox Code Playgroud)
"game.engage_3d(45,0.1,100)"基本上将投影矩阵设置为具有45度视角和近和远坐标为0.1和100.
第一个gluLookAt很好地将相机放在正确的位置.
我有一个以(0,0,0)为中心绘制的立方体,没有gluLookAt它工作正常.在我绘制它之前,我有这个代码:
gluLookAt(self.x,0,self.z,0,0,0,0,1,0)
if game.key(KEY_UP):
self.z += 2.0/game.get_fps()
if game.key(KEY_DOWN):
self.z -= 2.0/game.get_fps()
if game.key(KEY_LEFT):
self.x += 2.0/game.get_fps()
if game.key(KEY_RIGHT):
self.x -= 2.0/game.get_fps()
Run Code Online (Sandbox Code Playgroud)
从那时起,向上位置应该始终与它始终是直角相同.我认为它会做的是用向上和向下键向前和向后移动z轴,用左右键向左和向右穿过x轴.实际发生的事情是,当我使用左右键时,立方体将围绕由键加速的"眼睛"旋转.向上键导致另一个立方体从无处穿过屏幕并击中第一个立方体.向下键将神秘的克隆立方体带回来.这可以与轮换相结合,以提供完全不同的结果,因为文档说会出现.
究竟是什么问题?
谢谢.