Anzeige:
Ergebnis 1 bis 2 von 2

Thema: OpenGL in C++ --> Help @ CSG :'(

  1. #1
    Registrierter Benutzer
    Registriert seit
    29.06.2002
    Beiträge
    7

    Unhappy OpenGL in C++ --> Help @ CSG :'(

    Hallo!

    Habe leider folgendes (für mich) schwerwiegendes Problem:

    Muss für eine VU muss ich eine CSG schreiben. Es wäre normalerweise eine Übung für 4 Personen muss sie aber alleine machen (auf die Gründe dafür möchte ich nicht näher eingehen..)

    Hab es geschafft eine UND "Verknüpfung" mit 2 "Objekten" zu schaffen -> aber ich weiss nicht wie ich dass für mehrere zusammenbringe.

    Leider sind sämtliche HowTos und Beschreibungen zu dem Thema eine Verknüpfung von 2 Objekten bzw. wenn es mehrere sind in einem normalisierten Baum.

    Könnte mir da jemand bitte weiterhelfen?

    Danke im voraus!

    lg, Helmut
    "Softwareentwicklung und Wissensmanagement" Student an der Technischen Universität Graz, Österreich.
    Gentoo GNU/Linux User trotz 56k Modem ;)

  2. #2
    Registrierter Benutzer
    Registriert seit
    29.06.2002
    Beiträge
    7
    So - bin selbst weitergekommen, hab aber das Problem, dass ich scheinbar Probleme mit dem zBuffer habe :/

    Kann sich das jemand bitte ansehen und mir sagen welchen Fehler ich habe?

    Hab das ganze nach der "Anleitung" auf https://www2.icg.tu-graz.ac.at/BACGV..._rendering.pdf implementiert... (Ist zwar https, aber ist trotzdem öffentlich)

    Code:
    void drawIntoZBuffer(SoNode *A, SoGLRenderAction *action, GLenum face)
    {
      glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
      glDepthMask(GL_TRUE);
      glDepthFunc(GL_ALWAYS);
      glEnable(GL_DEPTH_TEST);
      glDisable(GL_STENCIL_TEST);
      glEnable(GL_CULL_FACE);
      glCullFace(face);
      A->GLRender(action);
      glDisable(GL_CULL_FACE);
    }
    Code:
    void drawIntoStencil(SoNode *A, SoGLRenderAction *action, GLuint plane)
    {
      GLuint ref=(0x01 << plane);
      GLuint mask=ref;
      cout << "ref : " << ref << " mask : "<< mask << endl;
      glColorMask(GL_FALSE,GL_FALSE,GL_FALSE,GL_FALSE);
      glDisable(GL_CULL_FACE);
    
      glDepthMask(GL_FALSE);
      glDepthFunc(GL_LEQUAL); //LEAL
      glEnable(GL_DEPTH_TEST);
    
      glStencilOp(GL_KEEP, GL_KEEP, GL_INVERT);
      glStencilFunc(GL_ALWAYS, ref, mask);
      glStencilMask(mask);
      glEnable(GL_STENCIL_TEST);
    
      A->GLRender(action);
    }
    Code:
    void performStencilOperation(SoNode* A, SoGLRenderAction* action, GLenum face, CsgDepthBuffer &buffer, GLuint bitmask)
    {
      glDepthMask(GL_TRUE);
      glDisable(GL_DEPTH_TEST);
      CsgDepthBuffer::fillZBuffer(1.0);
      glDepthMask(GL_TRUE);
      glEnable(GL_DEPTH_TEST);
      glDepthFunc(GL_ALWAYS);
      glStencilMask(0);
      glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
      glStencilFunc(GL_EQUAL, bitmask, ~0);
    
      glEnable(GL_STENCIL_TEST);
      glEnable(GL_CULL_FACE);
      glCullFace(face);
      A->GLRender(action);
      glDisable(GL_CULL_FACE);
      glDisable(GL_STENCIL_TEST);
      glDisable(GL_DEPTH_TEST);
    
      CsgDepthBuffer temp;
      temp.readFromOpenGL();
      buffer.mergeBuffer(temp);
      buffer.compareBuffer(temp);
    }
    In einer Schleife werden diese drei Funktionen dann aufgerufen:

    Code:
        CsgDepthBuffer buffer;
        buffer.clear();
        glStencilMask(~0);
        glClearStencil(0);
        glClear(GL_STENCIL_BUFFER_BIT);
        glDisable(GL_DEPTH_TEST);
        glDisable(GL_STENCIL_TEST);
        for (index=0; index<num_children; ++index)
        {
            glDepthMask(GL_TRUE);
            buffer.fillZBuffer(1.0);
    
            SoNode *child = (SoNode *) children->get(index);
            GLenum face=GL_BACK;
            if (complement[index])
              face=GL_FRONT;
            drawIntoZBuffer(child, action, face);
    
               if (child->getTypeId() == CsgPrimitive::getClassTypeId())
               {
                 cout << "Rendering a primitive.\n";
                 GLuint plane=0;
                 GLuint bitmask=0;
                 for (int i=0; i<num_children; i++)
                 {
                    if (i==index)
                      continue;
                    if (face==GL_BACK)
                      bitmask=(bitmask | (0x01 << plane));
    
                    cout << "Bitmask : " << bitmask << " Plane : " << plane << endl;
                    drawIntoStencil((SoNode *) children->get(i),action, plane);
                    plane++;
                 }
                 performStencilOperation(child, action, face, buffer, bitmask);
           }
            else if (child->getTypeId() == CsgProduct::getClassTypeId()) {
                cout << "Rendering a product.\n";
            }
            else {
               cout << "Warning: rendering unknown object. CSG tree may be invalid.\n";
            }
        }
      glDisable(GL_DEPTH_TEST);
      glDisable(GL_STENCIL_TEST);
      buffer.writeToOpenGL();
      glEnable(GL_DEPTH_TEST);
      glDepthFunc(GL_EQUAL);
      glDepthMask(GL_FALSE);
      glDisable(GL_CULL_FACE);
      glColorMask(GL_TRUE,GL_TRUE,GL_TRUE,GL_TRUE);
      for (index=0; index<num_children; ++index)
      {
        SoNode *child = (SoNode *) children->get(index);
        child->GLRender(action);
      }
    Leider ist das Ergebnis aber nicht so wie es sein sollte -> wollte wissen ob jemand vielleicht einen logisch Fehler findet? (Oder hat jemand vielleicht einen einfache CSG Implementation zum vergleichen zur Hand (die auf der SGI HP sind entweder für 2 Objekte ausgelegt oder ziemlich kompliziert mit allen raffinessen azfgebaut))

    Danke im voraus!

    lg, Helmut
    "Softwareentwicklung und Wissensmanagement" Student an der Technischen Universität Graz, Österreich.
    Gentoo GNU/Linux User trotz 56k Modem ;)

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •