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
Lesezeichen