2010-04-16 8 views
1

나는 win32와 OpenGL을 사용하고 있는데, 나는 창 좌표계의 glOrtho에서 프로젝션을 설정했다. 더블 버퍼링이 가능하고, glGet으로 테스트했습니다. 항상 끊임없이 번역되고 있다면, 내 프로그램은 항상 내가 그리는 모든 원형을 찢어 놓는 것처럼 보입니다. 여기 OpenGL이 찢어 지나요?

내 OpenGL을 초기화 함수입니다 :

glClearColor(0.0f, 0.0f, 0.0f, 1.0f); 

glViewport(0, 0, 640, 480); 
glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glOrtho(0, 640, 0, 480, 0, 100); 

glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
    glDrawBuffer(GL_BACK); 

glLoadIdentity(); 

그리고 이것은 내 렌더링 기능, gMouseX 및 gMouseY 마우스의 좌표이다 상관없이 어떻게

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

glTranslatef(gMouseX, gMouseY, 0.0f); 
glColor3f(0.5f, 0.5f, 0.5f); 
glBegin(GL_TRIANGLES); 
    glVertex2f(0.0f, 128.0f); 
    glVertex2f(128.0f, 0.0f); 
    glVertex2f(0.0f, 0.0f); 
glEnd(); 

SwapBuffers(hDC); 

같은 찢어 문제가 발생 종종 렌더링 기능이 실행됩니다. 내가 잘못하고있는 것이 있거나 여기에없는 것이 있습니까?

답변

0

모니터의 수직 블랭킹 간격과 업데이트를 동기화하지 않으면 끊어집니다. OpenGL에서 약간의 하드웨어 의존성이 있습니다 (전문가가 아닌 것 같습니다), glXWaitVideoSyncSGI를 찾는 것으로 시작하십시오. "vblank에 대한 OpenGL 동기화"검색 기능도 제공됩니다.

+3

glX는 유닉스 용이며, OP는 그가 win32에 있다고 말했다. – slacker

7

하나 또는 두 개의 삼각형을 렌더링하는 경우 매우 높은 프레임 속도 (아마도 수천 개의 FPS)를 가지게됩니다. 즉, 지옥처럼 SwapBuffering을 의미합니다. 즉, 항상 스왑 중에 화면 새로 고침 (더블 버퍼링 사용). 일단 당신의 씬이 더 많은 컨텐츠를 가지면 프레임 레이트가 더 현실적인 값으로 떨어지면 찢어지지 않습니다. 또는 Windows에서 wglSwapIntervalEXT과 같이 V-Sync를 사용하도록 설정합니다. 이 정지 찢어 것 같았다 WS_POPUP을 제거한 후

는 Win32 응용 프로그램 창 스타일을 정의 할 때, 전체 화면은 화면 찢어을 소개 할 문제를 디버깅 후 WS_POPUP
에 포함되지 않습니다
+0

나는 framerate가 약 60FPS (WM_TIMER를 사용하는 매 16ms)로 제한되어 있다는 것을 잊어 버렸습니다. 그리고 타이머 설정에 상관없이 여전히 눈물을 흘립니다. – kaykun

+0

vsync를 @AshleysBrain으로 설정하십시오. 타이머를 사용하여 프레임 속도를 수동으로 캡쳐해도 화면 새로 고침과 동기화되지 않습니다. – jalf

+0

glGetString (GL_EXTENSIONS) 호출 후 "WGL_EXT_swap_control"문자열이 반환되지 않기 때문에 VSync가 내 시스템에서 활성화되어 있지 않음을 알았습니다. 다운로드 할 수있는 거의 모든 게임에이 문제가 없기 때문에 찢어짐을 줄일 수있는 방법은 전혀 없습니다. – kaykun

2

, 나는, 전체 화면의 스타일을 발견 렌더링 루프를 새로 고침 빈도로 강제하지 않아도됩니다. WS_POPUP은 문제가있는 것으로 알려져 있습니다. 또한 모든 전체 스크린 샷을 차단하여 흰색을 완성합니다.

+0

이 문제는 V-Sync로 인해 발생합니다. WS_POPUP과 관련된 증거가 있습니까? – Kromster

+0

전체 화면에서 화면 찢어짐이 발생하는 문제를 디버깅 한 후 전체 화면에 대한 스타일을 발견했습니다. WS_POPUP을 제거한 후 렌더링 루프를 새로 고침 빈도없이 강제로 중지하지 않는 것처럼 보였습니다. WS_POPUP은 문제가있는 것으로 알려져 있습니다. 또한 모든 전체 스크린 샷을 차단하여 흰색을 완성합니다. – Luka

+0

답변에 해당 설명을 추가해야합니다. – Kromster

0

/모자를 넣어 프레임 속도를 제한하거나 (당신이 VSYNC가없는 경우) 아마를 산출하려고 :

let tick equals new_tick 
if tick is less than last_tick do 
    yield 
done 

calculate last_tick 

이 잠을보십시오 : 여기

는 의사 코드 기능과 수율 때문에, 하나에 설정 : 또한

Sleep(1); 

제한하거나 프레임 속도 상한 기억되어 있지하는 것이 바람직 정말 프레임 calcu을 줄이기위한 의미 특정 기능을 거기로 라이온스.

3

인터넷상의 모든 사람들이 제안하려고 시도하기 때문에이 문제를 VSync에 엄격하게 연결하지 않아도됩니다. 내 경우에는 문제는 창을 초기화하는 방식으로 인해 발생했습니다. 나는 dwStyle = WS_POPUP을 없애면 문제가 해결되지만, 부분적으로는 윈도우가 전체 화면 모드가 아니기 때문에 부분적으로 만 문제가 해결되었다는 것을 알았습니다. 결국 나를 위해 일한 것은 SetWindowLong (hwnd, GWL_STYLE, 0); 창을 생성 한 후. 기본적으로 윈도우 스타일을 지 웁니다. 그래서 창을 초기화 내 코드는 다음과 같습니다

dwStyle=WS_POPUP;   //Windows Style 
ShowCursor(FALSE);   //Hide Mouse Pointer 

//Create the Window 
hwnd= CreateWindowEx(NULL, 
    "GLClass", 
    appName, 
    dwStyle, 
    0, 0,        
    (long)windowWidth, 
    (long)windowHeight, 
    NULL,        
    NULL,        
    hInstance,       
    NULL);        
SetWindowLong(hwnd, GWL_STYLE, 0); 

을이 수정 후 내 모든 찢어 문제도 캡쳐 PrintScreen 할 수없는, 해결하고 있습니다. 어디서나 VSync를 만질 필요는 없었습니다.

관련 문제