2012-09-29 2 views
1

일단 응용 프로그램을 실행하면 두 개의 렌더 사이에서 응용 프로그램의 뷰포트가 깜박입니다. 프론트 버퍼와 백 버퍼가 바뀌고 있다고 가정합니다.깜박임 (백 버퍼?)

어떻게 방지 할 수 있습니까? 모든 삼각형이 항상 화면에 머물러 있기를 바랍니다.

나는 Sierpinski 가스켓을 연구하고있다. (나는 아직 끝나지 않았지만, 알아 내고 싶지 않다!). 나는 일반 코드 정리에 관심이있다. 나는 어떤 제안이라도 열려있다!

#include SFML/Graphics.hpp 
#include GL/glew.h 

using namespace sf; 

struct point 
{ 
    float x, y; // z is always 0 ... for now. MWUAHAHAA 
}; 

point points[3] = {{0.f, 1.f},  // top 
       {-1.f, -1.f},  // left 
       { 1.f, -1.f}};  // right 

point temp = {points[0].x, points[0].y}; 

void renderFirstTriangle() 
{ 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    glBegin(GL_TRIANGLES); 

    glColor3f(1.f, 1.f, 1.f); 
    glVertex3f(points[0].x, points[0].y, 0.f); 

    glColor3f(1.f, 1.f, 1.f); 
    glVertex3f(points[1].x, points[1].y, 0.f); 

    glColor3f(1.f, 1.f, 1.f); 
    glVertex3f(points[2].x, points[2].y, 0.f); 

    glEnd(); 
} 

int main() 
{ 
Window window(VideoMode(800, 600), "Fractal", Style::Default, ContextSettings(32)); 
window.setVerticalSyncEnabled(true); 

renderFirstTriangle(); 

while (window.isOpen()) 
{ 
    Event event; 
    while (window.pollEvent(event)) 
    { 
     if (event.type == Event::Resized) 
      glViewport(0, 0, event.size.width, event.size.height); 

     else if (event.type == Event::Closed) 
      window.close(); 
    } 

    for (int i = 0; i < 2; i++) 
    { 
     // calculate new vertex positions 

     temp.x = points[0].x; 
     temp.y = points[0].y; 

     glBegin(GL_TRIANGLES); 

     if(i % 2) 
      glColor3f(0.1f, 0.1f, 0.1f); 

     glVertex3f((points[0].x + points[1].x)/2, (points[0].y + points[1].y)/2, 0.0f); 
     glVertex3f((points[1].x + points[2].x)/2, (points[1].y + points[2].y)/2, 0.0f); 
     glVertex3f((points[2].x + temp.x)/2, (points[2].y + temp.y)/2, 0.0f); 

     glEnd(); 
    } 
    window.display(); 
} 
} 

답변

0

지우기 화면 메인 루프를 통해 각 시간 :

// g++ main.cpp -lGL -lsfml-graphics -lsfml-window 
// using SFML 1.6 

#include <SFML/Graphics.hpp> 

using namespace sf; 

struct point 
{ 
    float x, y; // z is always 0 ... for now. MWUAHAHAA 
}; 

point points[3] = {{0.f, 1.f},  // top 
       {-1.f, -1.f},  // left 
       { 1.f, -1.f}};  // right 

point temp = {points[0].x, points[0].y}; 

void renderFirstTriangle() 
{ 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    glBegin(GL_TRIANGLES); 

    glColor3f(1.f, 1.f, 1.f); 
    glVertex3f(points[0].x, points[0].y, 0.f); 

    glColor3f(1.f, 1.f, 1.f); 
    glVertex3f(points[1].x, points[1].y, 0.f); 

    glColor3f(1.f, 1.f, 1.f); 
    glVertex3f(points[2].x, points[2].y, 0.f); 

    glEnd(); 
} 

int main() 
{ 
    Window window(VideoMode(800, 600), "Fractal"); 
    window.UseVerticalSync(true); 

    renderFirstTriangle(); 

    while (window.IsOpened()) 
    { 
     Event event; 
     while (window.GetEvent(event)) 
     { 
      if (event.Type == Event::Resized) 
       glViewport(0, 0, event.Size.Width, event.Size.Height); 

      else if (event.Type == Event::Closed) 
       window.Close(); 
     } 

     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
     for (int i = 0; i < 2; i++) 
     { 
      // calculate new vertex positions 

      temp.x = points[0].x; 
      temp.y = points[0].y; 

      glBegin(GL_TRIANGLES); 

      if(i % 2) 
       glColor3f(0.1f, 0.1f, 0.1f); 

      glVertex3f((points[0].x + points[1].x)/2, (points[0].y + points[1].y)/2, 0.0f); 
      glVertex3f((points[1].x + points[2].x)/2, (points[1].y + points[2].y)/2, 0.0f); 
      glVertex3f((points[2].x + temp.x)/2, (points[2].y + temp.y)/2, 0.0f); 

      glEnd(); 
     } 
     window.Display(); 
    } 
} 
+0

안녕하세요. 귀하의 회신에 감사드립니다. 나는 이것을 시도했지만 화면에 루프의 데이터 플롯 만 표시했다. 그래서,이 경우에, 단일 삼각형의 무리가 그 지점까지 모든 삼각형이 아닙니다. 이것이 SFML의 문제 일 수 있습니까? –