2014-05-23 2 views
0

이 클래스에서 주어진 임의의 숫자로 직사각형을 생성 중입니다.Tao Framework에서 OpenGL 생성 사각형 C#

class Rect 
{ 
    double x; 
    double y; 

    public Rect(double _x, double _y) 
    { 
     x = _x; 
     y = _y; 

    } 
    public void Draw() 
    { 
     Gl.glBegin(Gl.GL_QUADS); 
     Gl.glVertex2d(x + (-0.05d), y + (-0.05d)); 
     Gl.glVertex2d(x + (-0.05d), y + (0.05d));  
     Gl.glVertex2d(x + (0.05d), y + (0.05d));   
     Gl.glVertex2d(x + (0.05d), y + (-0.05d));  
     Gl.glEnd(); 

    } 
} 

나는 페인트 함수를 호출합니다.

 private void simpleOpenGlControl1_Paint(object sender, PaintEventArgs e) 
     { 
      Gl.glClearColor(0, 1, 0, 0); 
      Gl.glClear(Gl.GL_COLOR_BUFFER_BIT); 

      for (int i = 0; i < 4; i++) 
      { 
       rand = new Random(); 
       double x = 2 * rand.NextDouble() - 1; 
       double y = 2 * rand.NextDouble() - 1; 

       rect= new Rect(x,y); 
       rect.Draw(); 
      } 
     } 

모든 것이 잘 보이지만 잘못된 것이 있습니다. 나는 모든 직사각형을 볼 수 없다. 그들 중 일부는 실종되었다. 하지만 어딘가에 중단 점을 토글하거나 MessageBox.Show(x+" "+y); 코드를 잘 작성하면 내가 원하는 사각형이 표시됩니다. 내 코드는 사실이지만 OpenGL에 대해서는 잘못된 것이라고 생각합니다. 나는 Tao Framework를 사용하고 있습니다.

+0

내가 보여주는 코드에 문제가 있다고 생각하지 않으므로 추측하는 것 이상의 작업을 수행 할 수있는 정보가 충분하지 않습니다. 그것은 항상 누락 된 완전한 사각형입니까? 4 대신에 1, 2 또는 3 개의 직사각형이 보입니까? 이 코드에서 볼 수있는 유일한 걱정거리는 렌더링 표면에 깊이 버퍼가 있으면'glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)'를 사용해야한다는 것입니다. –

+0

GL 파이프 라인을 플러시하거나 어떤 시점에서 버퍼를 플러시 (implicit flush)해야합니다. 그렇지 않으면 GL은 이러한 명령을 모두 큐에 넣고 논리적으로 일어날 것으로 예상 할 때가 아니라면 느낄 때마다 실행합니다 (' simpleOpenGlControl1_Paint'). –

+0

'Gl.glClear (Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT); '을 추가했지만 항상 1 또는 2 개의 rect를 보는 차이는 없습니다. 함수의 끝에 "simpleOpenGlControl1.SwapBuffers()'와'Gl.glflush()'을 시도했지만 아무 변화가 없습니다. – user1545283

답변

1

내 생각 엔 문제는 코드의이 비트와 함께입니다 : 당신은 다음 루프의 각 반복에서 새로운 Random 인스턴스를 생성하고있다

for (int i = 0; i < 4; i++) 
{ 
    rand = new Random(); 
    double x = 2 * rand.NextDouble() - 1; 
    double y = 2 * rand.NextDouble() - 1; 

    rect= new Rect(x,y); 
    rect.Draw(); 
} 

이 개 임의 값을 생성하기 위해 해당 인스턴스를 사용합니다. Random에 의해 생성 된 값 시퀀스는 Random을 초기화하는 데 사용 된 시드에 따라 다릅니다. 여기에 사용 된 생성자의 documentation에 따르면

기본 시드 값은 시스템 클럭에서 파생 된 유한 해상도를 가지고있다. 루프에서 Random의 루프 충분히 빨리 실행하는 경우입니다

, 다른 인스턴스가 동일한 xy 값 생성을 일으키는 같은 씨앗로 초기화됩니다 사각형이 다음 중복 및 실종 된 것처럼 보입니다. 또한 중단 점이나 메시지 상자를 사용하여 코드를 중단하면 코드가 작동하는 이유를 설명합니다.

편집 :이 문제에 대한 최선의 해결책은 for 문 앞에 또는 예를 들어, 클래스의 생성자 (클래스 멤버로) rand를 초기화하여, 루프의 외부에 단일 Random 인스턴스를 생성하는 것입니다.

+0

답변 해 주셔서 감사합니다. 'Thread.Sleep (100); '함수를 사용하고 문제가 해결되었습니다. 큰 고마워요 :) – user1545283

+1

그건 창조적 인 해결 방법이지만, 최선은 아닙니다 :-) 나는이 문제에 대한 더 나은 해결책으로 나의 대답을 업데이트했습니다. –

+0

:) 고마워요. 당신 말이 맞아요. 네프 슬립()이 없습니다; 함수 :)이 문제에 대한 논리적 인 해결책이 그 것이다. – user1545283