OpenGL псевдоним?

Я работаю над Win7 Microsoft Visual Studio 08 с формами. Я только что поменял свою графическую карту, и в моем приложении появилось какое-то наложение.

IMG

Можно оценить, что серые линии являются псевдонимами, а также системой отсчета, которая почти невидима.

Есть идеи, как это решить?

Я выложу некоторую часть кода на всякий случай: 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");
     }

1 ответ

Решение

Попробуйте отключить проверку глубины, прежде чем рисовать каждый набор объектов (сначала опорные плоскости, затем оси, а затем опорная сетка).

Похоже, ваши оси Z-сражаются с базовыми плоскостями.

У вас есть несколько вариантов -

  1. Отключите проверку глубины при рисовании линий (не плоскостей). Это обеспечит отсутствие z-боев.
  2. Продолжайте тестирование глубины, но используйте glPolygonOffset при рисовании плоскостей, чтобы сместить их, чтобы z-бой вообще не происходил.
  3. Используйте GL_LEQUAL (или что-то еще) в качестве DepthFunc при рисовании плоскостей, но используйте GL_EQUAL при рисовании линий. Это должно все сделать хорошо.
Другие вопросы по тегам