내 컴퓨터 그래픽 프로젝트 용 태양 광 시스템을 시뮬레이션하는 프로그램을 작성하고 있습니다. 저는 Python을 프로그래밍 언어로, Pygame (디스플레이, 마우스 및 키보드 이벤트를 제어), PyOpenGL (3D 모델링 및 텍스처 용) 및 PIL (Python Image Library, OpenGL 텍스처 용 이미지로드 용)으로 사용하고 있습니다. 응용 프로그램의 주요 요점은 키보드를 통해 태양계의 비행을 할 수있게하는 것입니다 (일종의 무료 카메라 게임). Will McGugan이 "시작하는 Python 및 Pygame에서 초보자에서 전문가에게"책의 firstopengl.py 접근 방식을 사용하여 카메라를 제어했습니다. 내 문제는 내가 프로그램을 실행할 때 (장면의 중앙에 질감이있는 태양 만 렌더링 됨) 너무 멀리 또는 너무 멀리 객체에서 이동할 때까지 완벽하게 작동한다는 것입니다 (회전은 지금까지 아무런 문제도 보이지 않았습니다). 오류 출력은 다음과 같습니다gluSphere를 사용하여 질감이있는 태양을 렌더링 할 때 PyOpenGL 오류가 발생합니다.
def loadTexture(texture_path):
#Load texture file
data = open(texture_path)
ix = data.size[0]
iy = data.size[1]
data = data.tostring("raw", "RGBX", 0, -1)
# Create textures
textures = glGenTextures(3)
# Select our current texture
glBindTexture(GL_TEXTURE_2D, int(textures[0])) # 2d texture (x and y size)
glPixelStorei(GL_UNPACK_ALIGNMENT,1)
glTexImage2D(GL_TEXTURE_2D, 0, 3, ix, iy, 0, GL_RGBA, GL_UNSIGNED_BYTE, data)
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP)
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP)
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)
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL)
# Create Linear Filtered Texture
glBindTexture(GL_TEXTURE_2D, int(textures[1]))
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)
glTexImage2D(GL_TEXTURE_2D, 0, 3, ix, iy, 0, GL_RGBA, GL_UNSIGNED_BYTE, data)
# Create a MipMapped Texture
glBindTexture(GL_TEXTURE_2D, int(textures[2]))
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR)
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST)
gluBuild2DMipmaps(GL_TEXTURE_2D, 3, ix, iy, GL_RGBA, GL_UNSIGNED_BYTE, data)
return textures
나는 또한 해요 : 그래서 여기에 태양의 질감을 적용하는 것은 내가 할하는 데 사용되는 코드 때 내가 뭔가를 잘못하고 있어요처럼
C:\Python27\python.exe E:/Nestor/RESPALDO/NESTOR/DATA/7mo_Semestre/GxC/Proyecto/star-trip/main.py
Traceback (most recent call last):
File "E:/Nestor/RESPALDO/NESTOR/DATA/7mo_Semestre/GxC/Proyecto/star-trip/main.py", line 235, in <module>
main()
File "E:/Nestor/RESPALDO/NESTOR/DATA/7mo_Semestre/GxC/Proyecto/star-trip/main.py", line 225, in main
planets[0].render()
File "E:\Nestor\RESPALDO\NESTOR\DATA\7mo_Semestre\GxC\Proyecto\star-trip\spaceobjects.py", line 46, in render
baseline.loadTexture(self.texture)
File "E:\Nestor\RESPALDO\NESTOR\DATA\7mo_Semestre\GxC\Proyecto\star-trip\baseline.py", line 158, in loadTexture
glTexImage2D(GL_TEXTURE_2D, 0, 3, ix, iy, 0, GL_RGBA, GL_UNSIGNED_BYTE, data)
File "C:\Python27\lib\site-packages\pyopengl-3.1.0-py2.7.egg\OpenGL\latebind.py", line 41, in __call__
return self._finalCall(*args, **named)
File "C:\Python27\lib\site-packages\pyopengl-3.1.0-py2.7.egg\OpenGL\wrapper.py", line 875, in wrapperCall
raise err
OpenGL.error.GLError
언뜻 보인다 내가 이해하지 못하는 "불충분 한 메모리"오류가 발생하여 모든 최적화 조언이 제공 될 것입니다.
loadTexture 함수에 대한 추측이 정확합니다. 나는 그것을 메인 루프에서 한 프레임에 한 번 호출한다. OpenGL에서 메모리 사용을 처리하는 방법에 대해서는 정통하지 않습니다 (또는 컴퓨터 그래픽에서 그 문제에 관해서는 처음부터 배우고 있습니다 :)) 그래서 나는 고전적인 루키 실수를 한 것 같습니다. 나는 당신의 접근 방식을 시도하고 어떤 일이 일어날지를 볼 것입니다. 고마워 ... 추신 :이 문제에 대한 좋은 자습서를 추천 할 수 있다면 편리 할 것입니다. – nacastro
NeHe 튜토리얼은 일반적으로 좋은 편이며, 대부분 파이썬으로 번역되었습니다 (예 : 텍스처 매핑에 대한 내용 : http : //pyopengl.sourceforge.net/context/tutorials/nehe6.html) – Gretchen
그건 그렇고, 찾으면 도움이되는 답변은 대답으로 받아 들여주세요 :) – Gretchen