2014-12-08 1 views
1

내 컴퓨터 그래픽 프로젝트 용 태양 광 시스템을 시뮬레이션하는 프로그램을 작성하고 있습니다. 저는 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 

언뜻 보인다 내가 이해하지 못하는 "불충분 한 메모리"오류가 발생하여 모든 최적화 조언이 제공 될 것입니다.

답변

0

loadTexture를 반복적으로 호출합니까? 마치 코드에서 알기 힘들지만 그 것처럼 들리지만, 시작한 후에 예외가 잘 발생한다는 사실 (예를 들어, 태양에 가까이있을 때)은 불려 간다는 신호입니다 렌더링 루프.

모든 렌더링 루프를 호출하는 경우 동일한 텍스처 맵의 gazillions (및 mipmaps의 건물 gazillions)을 할당하므로 그래픽 메모리를 매우 빨리 씹을 수 있습니다. loadtexture를 한 번만 호출하고 반환 된 텍스처 ID를 저장 한 다음 loadtexture를 계속 호출하지 말고 해당 ID로 glBind2D를 호출해야합니다.

+0

loadTexture 함수에 대한 추측이 정확합니다. 나는 그것을 메인 루프에서 한 프레임에 한 번 호출한다. OpenGL에서 메모리 사용을 처리하는 방법에 대해서는 정통하지 않습니다 (또는 컴퓨터 그래픽에서 그 문제에 관해서는 처음부터 배우고 있습니다 :)) 그래서 나는 고전적인 루키 실수를 한 것 같습니다. 나는 당신의 접근 방식을 시도하고 어떤 일이 일어날지를 볼 것입니다. 고마워 ... 추신 :이 문제에 대한 좋은 자습서를 추천 할 수 있다면 편리 할 것입니다. – nacastro

+0

NeHe 튜토리얼은 일반적으로 좋은 편이며, 대부분 파이썬으로 번역되었습니다 (예 : 텍스처 매핑에 대한 내용 : http : //pyopengl.sourceforge.net/context/tutorials/nehe6.html) – Gretchen

+0

그건 그렇고, 찾으면 도움이되는 답변은 대답으로 받아 들여주세요 :) – Gretchen

관련 문제