2012-07-03 2 views
0

저는 Forms와 함께 win7 microsoft visual studio 08에서 작업하고 있습니다. 방금 그래픽 카드를 바꿨고 응용 프로그램에 일종의 앨리어싱이 나타납니다.OpenGL 앨리어싱?

img

그레이 라인 가지 앨리어싱 것을 apreciated 될 수 있고, 또한, 그 거의 보이지 기준 시스템이다.

이 문제를 해결하는 방법에 대한 아이디어가 있습니까?

내가 코드의 일부 단지의 경우에 게시합니다

: 1 : 페인트 기능

private: void Paint(){ 



     int w = glControl1->Width; 
     int h = glControl1->Height; 


     float aspect_ratio = w/(float)h; 
     Matrix4 perpective = Matrix4::CreatePerspectiveFieldOfView(MathHelper::PiOver4, aspect_ratio, 0.1f, 100000.0f); 
     GL::MatrixMode(MatrixMode::Projection); 
     GL::LoadMatrix(perpective); 

     GL::MatrixMode(MatrixMode::Modelview); 
     GL::LoadIdentity(); 
     GL::Viewport(0, 0, w, h); 

     //Situacion de la camara en el espacio 
     Matrix4 lookat = Matrix4::LookAt(100, 100, 100, 0, 0, 0, 0, 0, 1); 
     GL::LoadMatrix(lookat); 

     GL::Scale(this->zoom, this->zoom, this->zoom); 


     GL::Rotate(xrot, 1.0f, 0.0f, 0.0f); 
     GL::Rotate(yrot, 0.0f, 1.0f, 0.0f); 
     GL::Clear(ClearBufferMask::ColorBufferBit | ClearBufferMask::DepthBufferBit); 
      GL::ClearColor(Color::LightGray); 



     Draw3Daxis(); 
     if (allowDraw){ 
      DrawSurface(); 
      } 
     } 

2 : 그림과 같이 모든 것이 (이 GL 단지 무리입니다 그리는 기능 :: Vertex3)

System::Void Draw3Daxis(){ 
     OpcionesPlot* opciones; 
     opciones=OpcionesPlot::Instance(); 
     int extra=2; 
     int sqrnumber=10; 

     //Planos en los ejes 
     GL::Color3(Color::White); 
     GL::Begin(BeginMode::Quads); 
     if(opciones->draw3DXYaxis){ 
      GL::Vertex3(0,0,0); 
      GL::Vertex3(LENGTH,0,0); 
      GL::Vertex3(LENGTH,LENGTH,0); 
      GL::Vertex3(0,LENGTH,0); 
     } 
     if(opciones->draw3DXZaxis){ 
      GL::Vertex3(0,0,0); 
      GL::Vertex3(LENGTH,0,0); 
      GL::Vertex3(LENGTH,0,LENGTH); 
      GL::Vertex3(0,0,LENGTH); 
     } 
     if(opciones->draw3DYZaxis){ 
      GL::Vertex3(0,0,0); 
      GL::Vertex3(0,LENGTH,0); 
      GL::Vertex3(0,LENGTH,LENGTH); 
      GL::Vertex3(0,0,LENGTH); 
     } 
     GL::End(); 


     // ejes XYZ 
     GL::Color3(Color::Black); 
     GL::Begin(BeginMode::Lines); 
     if(opciones->draw3DXYaxis){ 
      GL::Vertex3(0,0,0); 
      GL::Vertex3(LENGTH+extra,0,0); 
      GL::Vertex3(0,0,0); 
      GL::Vertex3(0,LENGTH+extra,0); 
     } 
     if(opciones->draw3DXZaxis){ 
      GL::Vertex3(0,0,0); 
      GL::Vertex3(LENGTH+extra,0,0); 
      GL::Vertex3(0,0,0); 
      GL::Vertex3(0,0,LENGTH+extra); 
     } 
     if(opciones->draw3DYZaxis){ 
      GL::Vertex3(0,0,0); 
      GL::Vertex3(0,LENGTH+extra,0); 
      GL::Vertex3(0,0,0); 
      GL::Vertex3(0,0,LENGTH+extra); 
     } 

     //--> lineas de los planos 
     GL::Color3(Color::DarkGray); 
     for(int i=1;i<=sqrnumber;i++){ 
      if(i==sqrnumber) 
       GL::Color3(Color::Black); 
      if(opciones->draw3DXYaxis){ 
       GL::Vertex3(LENGTH/sqrnumber*i,0,0); 
       GL::Vertex3(LENGTH/sqrnumber*i,LENGTH,0); 
       GL::Vertex3(0,LENGTH/sqrnumber*i,0); 
       GL::Vertex3(LENGTH,LENGTH/sqrnumber*i,0); 
      } 
      if(opciones->draw3DXZaxis){ 
       GL::Vertex3(LENGTH/sqrnumber*i,0,0); 
       GL::Vertex3(LENGTH/sqrnumber*i,0,LENGTH); 
       GL::Vertex3(0,0,LENGTH/sqrnumber*i); 
       GL::Vertex3(LENGTH,0,LENGTH/sqrnumber*i); 

      } 
      if(opciones->draw3DYZaxis){ 
       GL::Vertex3(0,0,LENGTH/sqrnumber*i); 
       GL::Vertex3(0,LENGTH,LENGTH/sqrnumber*i); 
       GL::Vertex3(0,LENGTH/sqrnumber*i,0); 
       GL::Vertex3(0,LENGTH/sqrnumber*i,LENGTH); 
      } 

     } 
     GL::End(); 
     // triangulos para los ejes 
     //----->cuadrado 
     GL::Color3(Color::Black); 
     GL::Begin(BeginMode::Quads); 
     float quadside=0.7; 
     if(opciones->draw3DXYaxis){ 
      GL::Vertex3((float)LENGTH+extra,quadside,quadside); 
      GL::Vertex3((float)LENGTH+extra,-quadside,quadside); 
      GL::Vertex3((float)LENGTH+extra,-quadside,-quadside); 
      GL::Vertex3((float)LENGTH+extra,quadside,-quadside); 

      GL::Vertex3(quadside,(float)LENGTH+extra,quadside); 
      GL::Vertex3(-quadside,(float)LENGTH+extra,quadside); 
      GL::Vertex3(-quadside,(float)LENGTH+extra,-quadside); 
      GL::Vertex3(quadside,(float)LENGTH+extra,-quadside); 


     } 
     if(opciones->draw3DXZaxis){ 
      GL::Vertex3((float)LENGTH+extra,quadside,quadside); 
      GL::Vertex3((float)LENGTH+extra,-quadside,quadside); 
      GL::Vertex3((float)LENGTH+extra,-quadside,-quadside); 
      GL::Vertex3((float)LENGTH+extra,quadside,-quadside); 

      GL::Vertex3(quadside,quadside,(float)LENGTH+extra); 
      GL::Vertex3(-quadside,quadside,(float)LENGTH+extra); 
      GL::Vertex3(-quadside,-quadside,(float)LENGTH+extra); 
      GL::Vertex3(quadside,-quadside,(float)LENGTH+extra); 
     } 
     if(opciones->draw3DYZaxis){ 
      GL::Vertex3(quadside,(float)LENGTH+extra,quadside); 
      GL::Vertex3(-quadside,(float)LENGTH+extra,quadside); 
      GL::Vertex3(-quadside,(float)LENGTH+extra,-quadside); 
      GL::Vertex3(quadside,(float)LENGTH+extra,-quadside); 

      GL::Vertex3(quadside,quadside,(float)LENGTH+extra); 
      GL::Vertex3(-quadside,quadside,(float)LENGTH+extra); 
      GL::Vertex3(-quadside,-quadside,(float)LENGTH+extra); 
      GL::Vertex3(quadside,-quadside,(float)LENGTH+extra); 

     } 
     GL::End(); 


     // --> triangulos para hacer la punta 
     GL::Begin(BeginMode::Triangles); 
     if(opciones->draw3DXYaxis){ 
      GL::Vertex3((float)LENGTH+extra,quadside,quadside); 
      GL::Vertex3((float)LENGTH+extra,-quadside,quadside); 
      GL::Vertex3(LENGTH+extra+5,0,0); 
      GL::Vertex3((float)LENGTH+extra,-quadside,quadside); 
      GL::Vertex3((float)LENGTH+extra,-quadside,-quadside); 
      GL::Vertex3(LENGTH+extra+5,0,0); 
      GL::Vertex3((float)LENGTH+extra,-quadside,-quadside); 
      GL::Vertex3((float)LENGTH+extra,quadside,-quadside); 
      GL::Vertex3(LENGTH+extra+5,0,0); 
      GL::Vertex3((float)LENGTH+extra,quadside,-quadside); 
      GL::Vertex3((float)LENGTH+extra,quadside,quadside); 
      GL::Vertex3(LENGTH+extra+5,0,0); 

      GL::Vertex3(quadside,(float)LENGTH+extra,quadside); 
      GL::Vertex3(-quadside,(float)LENGTH+extra,quadside); 
      GL::Vertex3(0,LENGTH+extra+5,0); 
      GL::Vertex3(-quadside,(float)LENGTH+extra,quadside); 
      GL::Vertex3(-quadside,(float)LENGTH+extra,-quadside); 
      GL::Vertex3(0,LENGTH+extra+5,0); 
      GL::Vertex3(-quadside,(float)LENGTH+extra,-quadside); 
      GL::Vertex3(quadside,(float)LENGTH+extra,-quadside); 
      GL::Vertex3(0,LENGTH+extra+5,0); 
      GL::Vertex3(quadside,(float)LENGTH+extra,-quadside); 
      GL::Vertex3(quadside,(float)LENGTH+extra,quadside); 
      GL::Vertex3(0,LENGTH+extra+5,0); 

     } 
     if(opciones->draw3DXZaxis){ 
      GL::Vertex3((float)LENGTH+extra,quadside,quadside); 
      GL::Vertex3((float)LENGTH+extra,-quadside,quadside); 
      GL::Vertex3(LENGTH+extra+5,0,0); 
      GL::Vertex3((float)LENGTH+extra,-quadside,quadside); 
      GL::Vertex3((float)LENGTH+extra,-quadside,-quadside); 
      GL::Vertex3(LENGTH+extra+5,0,0); 
      GL::Vertex3((float)LENGTH+extra,-quadside,-quadside); 
      GL::Vertex3((float)LENGTH+extra,quadside,-quadside); 
      GL::Vertex3(LENGTH+extra+5,0,0); 
      GL::Vertex3((float)LENGTH+extra,quadside,-quadside); 
      GL::Vertex3((float)LENGTH+extra,quadside,quadside); 
      GL::Vertex3(LENGTH+extra+5,0,0); 

      GL::Vertex3(quadside,quadside,(float)LENGTH+extra); 
      GL::Vertex3(-quadside,quadside,(float)LENGTH+extra); 
      GL::Vertex3(0,0,LENGTH+extra+5); 
      GL::Vertex3(-quadside,quadside,(float)LENGTH+extra); 
      GL::Vertex3(-quadside,-quadside,(float)LENGTH+extra); 
      GL::Vertex3(0,0,LENGTH+extra+5); 
      GL::Vertex3(-quadside,-quadside,(float)LENGTH+extra); 
      GL::Vertex3(quadside,-quadside,(float)LENGTH+extra); 
      GL::Vertex3(0,0,LENGTH+extra+5); 
      GL::Vertex3(quadside,-quadside,(float)LENGTH+extra); 
      GL::Vertex3(quadside,quadside,(float)LENGTH+extra); 
      GL::Vertex3(0,0,LENGTH+extra+5); 
     } 
     if(opciones->draw3DYZaxis){ 
      GL::Vertex3(quadside,(float)LENGTH+extra,quadside); 
      GL::Vertex3(-quadside,(float)LENGTH+extra,quadside); 
      GL::Vertex3(0,LENGTH+extra+5,0); 
      GL::Vertex3(-quadside,(float)LENGTH+extra,quadside); 
      GL::Vertex3(-quadside,(float)LENGTH+extra,-quadside); 
      GL::Vertex3(0,LENGTH+extra+5,0); 
      GL::Vertex3(-quadside,(float)LENGTH+extra,-quadside); 
      GL::Vertex3(quadside,(float)LENGTH+extra,-quadside); 
      GL::Vertex3(0,LENGTH+extra+5,0); 
      GL::Vertex3(quadside,(float)LENGTH+extra,-quadside); 
      GL::Vertex3(quadside,(float)LENGTH+extra,quadside); 
      GL::Vertex3(0,LENGTH+extra+5,0); 

      GL::Vertex3(quadside,quadside,(float)LENGTH+extra); 
      GL::Vertex3(-quadside,quadside,(float)LENGTH+extra); 
      GL::Vertex3(0,0,LENGTH+extra+5); 
      GL::Vertex3(-quadside,quadside,(float)LENGTH+extra); 
      GL::Vertex3(-quadside,-quadside,(float)LENGTH+extra); 
      GL::Vertex3(0,0,LENGTH+extra+5); 
      GL::Vertex3(-quadside,-quadside,(float)LENGTH+extra); 
      GL::Vertex3(quadside,-quadside,(float)LENGTH+extra); 
      GL::Vertex3(0,0,LENGTH+extra+5); 
      GL::Vertex3(quadside,-quadside,(float)LENGTH+extra); 
      GL::Vertex3(quadside,quadside,(float)LENGTH+extra); 
      GL::Vertex3(0,0,LENGTH+extra+5); 

     } 
     GL::End(); 
     Write3D(LENGTH,3,3,GLUT_BITMAP_9_BY_15,"X"); 
     Write3D(3,LENGTH,3,GLUT_BITMAP_9_BY_15,"Y"); 
     Write3D(3,3,LENGTH,GLUT_BITMAP_9_BY_15,"Z"); 
    } 

답변

2

개체 집합 (참조 평면이 먼저, 축이 두 번째, 참조 격자가)을 그리기 전에 깊이 테스트를 사용하지 않도록 설정하십시오.

축이 참조 평면과 Z- 싸우고있는 것처럼 보입니다.

  1. 해제 깊이 테스트 라인 (안 비행기) 그리기 -

    는 여러 옵션이 있습니다. 이렇게하면 z-fighting이 발생하지 않습니다.

  2. 심도 테스트를 계속하고 있지만, z- 파이팅이 전혀 일어나지 않도록 평면을 그릴 때 glPolygonOffset을 사용하십시오.
  3. 면을 그릴 때 DepthFunc로 GL_LEQUAL (또는 그 밖의 것은 무엇이든)을 사용하지만, 선을 그릴 때는 GL_EQUAL을 사용하십시오. 이 일 것입니다.
+0

mmm 그렇습니다. 실제로 그런 식으로 작동하지만 다른 문제가 있습니다. 깊이 테스트를 비활성화하면 회전 할 때 평면을 볼 수 있고 일부 회전에서는 일부 미친 형상을 얻을 수 있습니다. –

+0

실제로 이상한 형상은 회전의 잘못된 해석이었습니다 (평면을 볼 수있는 것처럼 보입니다. 다른 회전 상태에 있어야 함). –

+0

아, 비행기를 그릴 때 깊이 테스트를 사용하지 마십시오. 나중에 라인을 그릴 때만 사용 중지하면 모든 것이 정상입니다. – Ani