2011-09-07 4 views
1

무작위로 계산 된 무작위 지형을 표시하기 위해 셰이더가 생성 한 심플 렉스 노이즈를 사용하는 멋진 작은 게임을 프로그래밍하고 있습니다.Mac OSX의 OpenGL 업데이트 유니폼

Objective-C와 Xcode 4를 사용하고 있으며 NSOpenGLView의 하위 클래스를 사용하여 잘 실행되도록 모든 것을 얻었습니다. 서브 클래스는 먼저 셰이더를 컴파일 한 다음 노이즈 텍스처가있는 쿼드를 렌더링합니다. 이 프로그램은 허용 가능한 속도 (60Hz)로 실행해도 문제가 없습니다.

NSOpenGLView의 하위 클래스는 drawRect:(NSRect)dirtyRect을 호출하는 선택자를 실행하는 데 NSRunLoop을 사용합니다. 이것은 모든 프레임에서 수행됩니다.

이제 셰이더는 각 프레임을 업데이트하는 유니폼을 사용하기를 원합니다. 쉐이더는 모든 프레임에서 발생할 수있는 변수 변경에 반응 할 수 있어야하므로이 주파수에서 유니폼을 업데이트하려고합니다. 유니폼의 업데이트는 drawRect : (NSRect) dirtyRect 함수에서 수행됩니다.

부분적으로 성공했습니다. 처음 30 프레임 동안 원하는대로 화면을 업데이트 한 다음 glUniform1f() 및 NSLog를 호출하고 NSLog가 항상 실행되면서 유니폼을 업데이트하지 않습니다.

이상한 부분은 보류 공간 (또는 그 문제에 대한 다른 키)을 누르면 유니폼이 있어야대로 업데이트된다는 것입니다.

분명히 OSX 또는 OpenGL 또는 기타 유니폼을 처리하는 방법과 관련하여 여기에 뭔가 빠져 있습니다.

무엇이 나를 아프게하는지에 대한 설명은 높이 평가 될 것이지만 이것에 대한 정보를 찾을 수있는 포인터가 충분할 것입니다.

업데이트 :glGetError()glGetUniform*() 만지작 후 혼자 떠날 때 의도 한대로 프로그램이 작동하는 것으로 나타났습니다. 그러나 트랙 패드를 입력으로 사용하면 유니폼이 0.000으로 재설정되고 나머지 프로그램에는 오류가 표시되지 않습니다.

답변

0

먼저, glUniform1f() 다음에 glGetError()을 호출 해 보았습니까?

저는 Mac OS 프로그래밍에 대한 지식이 매우 부족합니다 (2 년 전 iOS 프로그래밍을했고 그 이후 대부분을 잊어 버렸습니다). 그래서 다음은 자연스러운 추측입니다.

drawRect:(NSRect)dirtyRect은 OpenGL 컨텍스트를 소유 한 스레드와 동일한 스레드에서 호출 했습니까? 지금까지 내가 아는 한 OpenGL은 스레드로부터 안전하지 않으므로 다른 스레드에서 glUniform1f() 시도가 호출되어 아무 것도 할 수 없었을 수 있습니다.

+0

glGetError()를 시도하지 않았습니다. 오류 코드 1282 (0x502, GL_INVAILD_OPERATION)를 제공합니다. 또한 하나의 스레드 만 사용하고 있음을 확인했습니다. – Ashlaban

+0

그런 다음 오류를 추적해야합니다. 어느 호출이 에러를 일으키는 지 확인하십시오 (이것은'glUniform1f()'호출 이전에 올 수 있으므로 앞뒤에 체크하여 확인하십시오), 그 결과 무슨 뜻인지 알기 위해서는 범인의 문서를 확인해야합니다. –

+0

도움 주셔서 감사합니다! 유니폼을 쉐이더에 전달하기 전에 glGetError()에 대한 호출을 추가하는 것이 필요했다. 이유는 모르겠지만 프로그램은 현재 작동합니다. – Ashlaban