0
저는 Forms와 함께 win7 microsoft visual studio 08에서 작업하고 있습니다. 방금 그래픽 카드를 바꿨고 응용 프로그램에 일종의 앨리어싱이 나타납니다.OpenGL 앨리어싱?
그레이 라인 가지 앨리어싱 것을 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");
}
mmm 그렇습니다. 실제로 그런 식으로 작동하지만 다른 문제가 있습니다. 깊이 테스트를 비활성화하면 회전 할 때 평면을 볼 수 있고 일부 회전에서는 일부 미친 형상을 얻을 수 있습니다. –
실제로 이상한 형상은 회전의 잘못된 해석이었습니다 (평면을 볼 수있는 것처럼 보입니다. 다른 회전 상태에 있어야 함). –
아, 비행기를 그릴 때 깊이 테스트를 사용하지 마십시오. 나중에 라인을 그릴 때만 사용 중지하면 모든 것이 정상입니다. – Ani