2016-07-31 16 views
0

Ich brauche Hilfe bei der Berechnung von Texturkoordinaten für die Menge der Dreiecke. Gibt es eine Funktion, die sie anhand der Eckpunktkoordinaten ohne Shader berechnet? Oder wie kann man sie manuell mit Vertex-Normalen berechnen? Ich habe eine große Anzahl von kleinen Dreiecken, die aus einer Punktwolke berechnet werden und keine Möglichkeit haben, sie zu beeinflussen. Mein vereinfachtes Testprogramm sieht wie folgt aus:OpenSceneGraph: Texturkoordinaten für die Dreiecke

//read texture 
    text = new_message->text; 
    osg::ref_ptr<osg::Texture2D> texture = new osg::Texture2D; 
    texture->setDataVariance(osg::Object::DYNAMIC); 
    osg::ref_ptr<osg::Image> image = osgDB::readImageFile("Images/" +text); 

    if (!image) 
    { 
    std::cout << "Couldn't load texture." << std::endl; 
    } 
    texture->setImage(image.get()); 
    ... 
    //create and fill an array of vertices 
    osg::ref_ptr<osg::Vec3Array> vertices = new osg::Vec3Array; 
    vertices->push_back(osg::Vec3(...)); 
    ... 
    osg::ref_ptr<osg::Geometry> quad = new osg::Geometry; 
    quad->setVertexArray(vertices.get()); 
    quad->addPrimitiveSet(new osg::DrawArrays(GL_TRIANGLES, 0, 12)); 
    //calculate normals 
    osgUtil::SmoothingVisitor::smooth(*quad); 
    geode = new osg::Geode; 
    geode->addDrawable(quad.get()); 
    //calculate texture coordinates 
    osg::StateSet *state = geode->getOrCreateStateSet(); 
    state->setTextureAttributeAndModes(1, texture.get(), osg::StateAttribute::ON); 
    state->setTextureMode(1, GL_TEXTURE_GEN_S, osg::StateAttribute::ON); 
    state->setTextureMode(1, GL_TEXTURE_GEN_T, osg::StateAttribute::ON); 
    state->setTextureMode(1, GL_TEXTURE_GEN_R, osg::StateAttribute::ON); 
    state->setTextureMode(1, GL_TEXTURE_GEN_Q, osg::StateAttribute::ON); 
    geode->setStateSet(state); 

Die berechneten Normalen perfekt funktionieren, Texturkoordinaten sind gar nicht funktioniert - ich schwarze Dreiecke bekommen. Es gibt nicht viele Informationen darüber, wie man GL_TEXTURE_GEN_S benutzt, also würde jede Hilfe wirklich geschätzt werden. UPD: Ich berechnet Textur manuell Koordinaten mit folgenden Formeln http://paulyg.f2s.com/uv.htm

Antwort

0

GL_TEXTURE_GEN_* generates texture coordinates according to some parametric function (e.g. mapping world or model coordinates, reflection vectors etc.)

Sie nicht angeben, was Sie tatsächlich zu erreichen versucht, aber keine Texturkoordinaten zu erhalten, könnte die GL_TEXTURE_GEN_* arbeiten. Andernfalls könnten Sie über die Eckpunkte und Normalen Ihrer Punktwolke iterieren und die Texturkoordinaten auf der CPU-Seite innerhalb der osg::Geometry generieren. Dies funktioniert genauso wie die Zuweisung der Scheitelpunkte zur Geometrie, jedoch mit einer anderen Funktion zur Berechnung der tatsächlichen Koordinaten, je nach Ihren Anforderungen.

+0

danke für die Antwort Kento! – Etimr

Verwandte Themen