2010-07-21 9 views
4

C# 용 래퍼를 사용하여 C++로 다중 인스턴스 엔진을 만들려고합니다.
In에서는 CreateEngine과 같은 함수를 사용하여 엔진을 초기화 할 창이나 컨트롤에 대한 핸들을 매개 변수로 사용합니다.
C#에서는 그리기를 위해 OpenGL을 초기화하고 렌더링 이벤트가있는 사용자 지정 컨트롤을 만들었습니다.
컨트롤의 인스턴스를 하나만 만들면 모든 것이 제대로 작동하지만 다른 창에 배치 된 다른 하나를 만들면 두 번째는 검정색으로 깜박입니다 (코드에 검은 색 참조가 없지만 검정색으로 화면 색이 번갈아 바뀝니다). 둘 다 아무것도 그려지지 않습니다. 대신 화면의 색상을 지우십시오. 첫 번째 컨트롤은 공간을 파란색으로, 두 번째 컨트롤은 빨간색으로 (이론적으로) 지 웁니다. 그릴 것이 없으므로 wgl 목록이나 다른 것을 공유해야한다고 생각하지 않습니다 (어쨌든 코드의 일부는 아무 것도 해결하지 못할 것이라고 말했습니다).OpenGL 깜박임 문제

좀 더 생각해보십시오 : 저는 OpenGL n00b가 아니지만 정말 저를 괴롭 힙니다. 나는 또한 내가 아는 모든 것에 대해서도 조사했다. 이 문제는 컨트롤의 인스턴스가 더 많은 경우에만 나타납니다. C#에서는 뷰포트를 지우는 OnPaint 이벤트를 덮어 썼고 33 밀리 초마다이를 무효화했습니다. OnPaintBackground는 깜박 거리는 문제를 발생시키는 것처럼 보였으므로 덮어 씁니다.

+0

OpenGL 명령을 사용하기 전에 각 컨텍스트를 최신으로 설정하고 있습니까? – genpfault

+0

예. 나는 각 렌더링 전에 호출하고 그 함수가 wglMakeCurrent를 호출하는 SetCurrentEngine 명령을 가지고있다. – Sanctus2099

답변

1

이중 버퍼링을 탐색 할 수 있습니다. 시스템에 과도한 마력이 많은 경우 단일 컨트롤을 사용하여 화면이 선명하고 다시 그려지지 않을 수 있지만 두 개의 컨트롤과 모든 설정/해제가 발생하면

기본적으로 렌더링 파이프, 더블 버퍼링은 검색 (항상 오프 스크린 표면에 렌더링 한 후 그 화면의 표면으로 뒤집기 현재 화면의 표면을 heres 오프 스크린 표면

튜토리얼되고 의미 Google에서 OpenGL 이중 버퍼링을 사용하면 더 많은 것을 찾을 수 있습니다.) http://www.swiftless.com/tutorials/opengl/smooth_rotation.html

1

상태와 이벤트의 Winforms와 OpenGL 모델 간의 인터페이스가 매우 까다로울 수 있습니다. 나의 충고는 이것을 성공적으로 수행하는 다른 코드의 구조를 따르는 것이다. 좋은 선택은 Tao Framework에서 SimpleOpenGLControl을 구현하는 것입니다.

http://taoframework.svn.sourceforge.net/viewvc/taoframework/trunk/src/Tao.Platform.Windows/SimpleOpenGlControl.cs?revision=158&view=markup

또 다른 옵션은 오히려 자신의 OpenGL 제어를 구현하는 것보다이 클래스의 사용을하는 것입니다. 어느 쪽이든, 다음이 유용 할 수 있습니다 - 그것은 몇 가지 문제를 강조 여러 컨트롤이있을 때 :

http://slizerboy.wordpress.com/2010/04/14/multiopenglcontrol/

0

OpenTK는 C# 및 OpenGL을 사용하는 방법에 대한 좋은 예를 가지고있다.