2016-07-31 4 views
0

Мне нужна помощь при вычислении координат текстуры для набора треугольников. Есть ли функция, которая вычисляет их в соответствии с координатами вершин без шейдеров? Или как их можно вычислить вручную с использованием вершинных нормалей? У меня есть большое количество маленьких треугольников, рассчитанных из облака точек и не имеющих возможности влиять на них. Моя упрощена тестовая программа выглядит следующим образом:OpenSceneGraph: координаты текстур для треугольников

//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); 

Рассчитанные нормалей работают отлично, текстурные координаты не работает вообще - я получаю черные треугольники. Существует мало информации о том, как использовать GL_TEXTURE_GEN_S, поэтому любая помощь будет действительно оценена. UPD: Я вычислил координаты текстуры вручную, используя следующие формулы http://paulyg.f2s.com/uv.htm

ответ

0

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

Вы не утверждаете, что вы на самом деле пытаетесь достичь, но, чтобы получить какую-либо координату текстуры, то GL_TEXTURE_GEN_* может работать. В противном случае вы можете перебирать вершины и нормали точек облачного облака и генерировать координаты текстуры на стороне процессора, в пределах osg::Geometry. Это будет работать так же, как вы назначили вершины геометрии, но с другой функцией для вычисления фактических координат в зависимости от ваших потребностей.

+0

спасибо, что ответ Kento! – Etimr