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
danke für die Antwort Kento! – Etimr