2015-02-01 3 views
0

http://ogldev.atspace.co.uk에서 튜토리얼을 사용하여 Python 3에서 PyOpenGL로 작업하면서 '현대'OpenGL을 이해하고 this을 참조하려고합니다.PyOpenGL : 버텍스 버퍼 객체의 내용이 무시되었습니다

지금은 화면의 여러 위치에서 하나의 점을 그리려하고 있지만 VBO에 넣은 데이터에 관계없이 화면 중앙에 항상 점이 그려집니다.

비슷한 모양의 this question이 발견되었지만 rewind() 함수는 LWJGL과 유사하므로 여기에 해당하지 않는다고 생각합니다.

import sdl2 
import numpy 
from OpenGL import GL 

def _init_gl(self): 
    self._gl_context = sdl2.SDL_GL_CreateContext(self._window.window) 
    GL.glClearColor(0, 0, 0, 1) 

    self._vao = GL.glGenVertexArrays(1) 
    GL.glBindVertexArray(self._vao) 

    self._vbo = GL.glGenBuffers(1) 
    GL.glBindBuffer(GL.GL_ARRAY_BUFFER, self._vbo) 
    vertexData = numpy.array([0.5, 0.5, 0.0], dtype=numpy.float32) 
    GL.glBufferData(GL.GL_ARRAY_BUFFER, vertexData.nbytes, vertexData, 
        GL.GL_STATIC_DRAW) 
    GL.glEnableVertexAttribArray(0); 
    GL.glVertexAttribPointer(0, 3, GL.GL_FLOAT, GL.GL_FALSE, 0, None) 

def _draw(self): 
    GL.glClear(GL.GL_STENCIL_BUFFER_BIT | 
       GL.GL_DEPTH_BUFFER_BIT | 
       GL.GL_COLOR_BUFFER_BIT) 
    GL.glBindVertexArray(self._vao) 
    GL.glDrawArrays(GL.GL_POINTS, 0, 1) 

    sdl2.SDL_GL_SwapWindow(self._window.window) 

사람이 잘못 갈 수있는 것을 발견 할 수 다음과 같이

내 코드의 관련 비트는? 당신은 일반적인 정점을 사용하고

답변

1

속성 :

GL.glEnableVertexAttribArray(0); 
GL.glVertexAttribPointer(0, 3, GL.GL_FLOAT, GL.GL_FALSE, 0, None) 

일반 속성은 사용자가 게시 된 코드가없는 쉐이더와 함께 사용됩니다. 셰이더를 사용하지 않고 이들을 사용하려고하면 적어도 특정 플랫폼에서는 일부 조건 하에서는 작동하지만 일반적으로 실망에 대한 처방입니다.

기존 고정 기능 파이프 라인을 사용하는 한 고정 기능 속성을 사용해야합니다.

GL.glEnableClientState(GL.GL_VERTEX_ARRAY) 
GL.glVertexPointer(3, GL.GL_FLOAT, 0, None) 

다른 옵션은 완전히 OpenGL을 핵심 프로필을 사용하여 커밋과 코드에 쉐이더를 추가 할 것입니다 : 일치하는 정점의 위치가 설정하는 호출합니다. 다음 자습서의 다음 단계 중 하나에서이를 수행하는 방법에 대해 설명합니다.

+0

glEnableClientState에서 "잘못된 연산"오류가 발생하여 다른 방법을 사용하고 작은 쉐이더를 추가하면 문제가 제대로 발생합니다. 감사합니다! – Juzley

+0

사용중인 도구로 어떤 종류의 컨텍스트를 만들지 확실하지 않습니다. 이전 프로파일을 사용할 수 없으며 쉐이더가 필요한 핵심 프로파일 컨텍스트를 얻었을 수 있습니다. 그러나 이것은 당신이 어쨌든 가고 싶었던 방향으로 당신을 이끌고 있습니다, 그래서 그것은 좋은 것입니다. –

관련 문제