2017-03-12 10 views
-1

나는 원형으로 움직이는 사각형을 그리기 위해 PyOpenGL과 GLUT를 사용하고 있습니다. 직사각형을 그린 후에는 화면을 지우지 않습니다. 왜냐하면 후행 효과를 원하기 때문입니다. 웬일인지 이미 그려져있는 사각형은 새로운 사각형이 그려지면 움직일 것입니다.이상한 OpenGL 픽셀 동작

사각형의 획에있는 여분의 픽셀은 이 아니고입니다. 사각형의 흔적은 정적이 아닙니다.

Here 내가 관련되어 있다고 생각하는 코드를 제공하고있어 효과

의 예입니다. 첫째,이 창을 초기화하는 데 사용하는 코드 :

glutInit() 
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_ALPHA | GLUT_DEPTH) 
glutInitWindowSize(width, height) 

둘째는,이 코드 조각은 모든 사각형이 그려지는 전에 한 번이라고합니다. 셋째

glLoadIdentity() 
glViewport(0, 0, width, height) 
glMatrixMode(GL_PROJECTION) 
glLoadIdentity() 
glOrtho(0.0, width, 0.0, height, 0.0, 1.0) 
glMatrixMode(GL_MODELVIEW) 
glLoadIdentity() 

광장

def rect_fill(x, y, w, h): 
    glBegin(GL_QUADS) 
    glVertex2f(x, y) 
    glVertex2f(x + w, y) 
    glVertex2f(x + w, y + h) 
    glVertex2f(x, y + h) 
    glEnd() 

def rect_stroke(x, y, w, h, lw): 
    lw = lw/2 
    glBegin(GL_LINES) 
    glVertex2f(x - lw, y) 
    glVertex2f(x + w + lw, y) 

    glVertex2f(x + w, y - lw) 
    glVertex2f(x + w, y + h + lw) 

    glVertex2f(x + w + lw, y + h) 
    glVertex2f(x - lw, y + h) 

    glVertex2f(x, y + h + lw) 
    glVertex2f(x, y - lw) 
    glEnd() 

나는이 잠시 동안되었으며, 유사한 문제로 사람을 찾을 수 없어 실제 도면. 어떤 도움을 주셔서 감사합니다.

+0

'width == height'가 아니라면'lw'는 x 축과 y 축에서 동일하지 않을 것입니다. – BDL

+0

여분의 픽셀이 문제가 아니라는 점을 명확히하기 위해 질문을 편집했습니다. –

+0

왜 downvotes? downvoted 경우 의견을 남겨주세요. –

답변

0

문제는

glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_ALPHA | GLUT_DEPTH) 

GLUT_DOUBLE 이중 버퍼링을 활성화 라인에있다. 이중 버퍼링은 드로잉에 사용할 수있는 2 개의 완전한 색상 버퍼를 제공합니다. 다른 버퍼가 그려지는 동안 하나의 버퍼가 표시됩니다. 드로잉이 완료되면 두 개의 버퍼가 스왑되므로 보려는 버퍼가 드로잉에 사용됩니다.

이것이 두 가지 다른 제곱 효과 사이에서이 홀수 변경을 일으키는 원인입니다.

+1

이중 버퍼링으로 인해 이러한 아티팩트가 발생할 수있는 방법을 자세히 설명해 주시겠습니까? 대부분의 경우 이러한 추가 픽셀은 스트로크 렌더링 중에 오프셋을 계산할 때 가로 세로 비율을 고려하지 않기 때문에 발생합니다 (픽셀 센터를 고려하지 않아도됩니다. 매개 변수를 표시하지 않기 때문에 말할 수 없습니다) 'rect_stroke'를 호출합니다). – BDL

+0

내 문제는 여분의 픽셀이 아니 었습니다. 그려지는 사각형의 흔적은 정적이 아니 었습니다. 분명히 "흔들리는"또는 "떨리는 것"입니다. 나는 그 사각형이 이미 그려졌고 더 이상 수정되지 않았기 때문에 이상하다고 생각했습니다. 하나의 사각형이 그려지기 때문에 이중 버퍼가 원인이었습니다. 그러면 버퍼가 바뀌어서 내가 그린 첫 번째 사각형을 볼 수 없었습니다. 즉, 각 사각형은 단 하나의 버퍼에 있지만 둘 다에 있지는 않습니다. –

+1

@ EnricoBorba에 동의합니다. "떨리는"효과는 버퍼를 지우지 않고 번갈아 가며 그려집니다. 텍스처에 이미 그려진 각 버퍼를 저장하고 새 사각형 앞에 각 프레임에이 텍스처를 그립으로써 피할 수 있습니다. 이렇게하면 이중 버퍼링을 사용할 수 있습니다. – Ripi2