2016-08-12 11 views
1

私がやっていることはかなりシンプルなはずですが、私が望むものが得られていないのです(この種のツールでは初心者なので)。私はちょうど、特定のテクスチャイメージ(典型的なレンガなど)を既存のcessna.osgに、頂点シェーダとフラグメントシェーダを介してマップしたいとします。この作業を行うために、非常に単純な頂点とフラグメントのシェーダを選択しましたが、私の限られた理解ではうまくいくはずですが、そうではありません。ここでGLSLシェーダを使ったcessna.osgのテクスチャマッピング

はコードです:私は何を得る

#include <osg/PositionAttitudeTransform> 
#include <osgDB/ReadFile> 
#include <osgDB/FileUtils> 
#include <osgGA/TrackballManipulator> 
#include <osg/Program> 
#include <osg/Shader> 
#include <osgViewer/Viewer> 
#include <iostream> 
#include <osg/Texture2D> 

static const char* VertexShader = { 
    "varying vec2 texCoords;\n" 
    "void main()\n" 
    "{\n" 
    " texCoords = gl_MultiTexCoord0.st;\n" 
    " gl_Position = ftransform();\n" 
    "}\n" 
}; 

static const char* FragmentShader = { 
    "varying vec2 texCoords;\n" 
    "uniform sampler2D tex;\n" 
    "void main()\n" 
    "{\n" 
    " gl_FragColor = texture2D(tex, texCoords);\n" 
    "}\n" 
}; 

int main(int argc, char **argv) 
{ 
    // Assembling scenegraph 
    osg::ref_ptr<osg::Node> model = osgDB::readNodeFile("cessna.osg"); 

    // Assigning program 
    osg::ref_ptr<osg::StateSet> ss = model->getOrCreateStateSet(); 
    osg::ref_ptr<osg::Program> program(new osg::Program); 
    osg::ref_ptr<osg::Shader> vShader(new osg::Shader(osg::Shader::VERTEX, VertexShader)); 
    osg::ref_ptr<osg::Shader> fShader(new osg::Shader(osg::Shader::FRAGMENT, FragmentShader)); 
    program->addShader(vShader); 
    program->addShader(fShader); 
    ss->setAttributeAndModes(program.get()); 

    //Set Texture 1 
    osg::ref_ptr<osg::Texture2D> bodyTexture = new osg::Texture2D; 
    bodyTexture->setImage(osgDB::readImageFile("Images/Brick-Norman-Brown.TGA")); 

    bodyTexture->setWrap(osg::Texture::WRAP_S, osg::Texture::REPEAT); 
    bodyTexture->setWrap(osg::Texture::WRAP_T, osg::Texture::REPEAT); 
    bodyTexture->setFilter(osg::Texture::MIN_FILTER, osg::Texture::LINEAR); 
    bodyTexture->setFilter(osg::Texture::MAG_FILTER, osg::Texture::LINEAR); 

    ss->setTextureAttributeAndModes(0, bodyTexture.get()); 
    ss->addUniform(new osg::Uniform("tex", 0)); 

    // View the scene 
    osgViewer::Viewer viewer; 
    viewer.setSceneData(model); 
    viewer.setUpViewInWindow(0, 0, 512, 384); 
    return viewer.run(); 

    return 0; 
} 

は無地カラー(テクスチャ画像のメインカラー)とセスナモデルですが、私は、実際の「組織化」セスナを取得することはありません。

質問が非常にばかだと謝罪しますが、動くのを助けるようなヒントは本当にありがたいです。

おかげ

+0

OpenGLまたはOpenGL ESを使用していますか? –

+0

この例ではOpenGLを使用していますが、Open GL ES 2.0でまったく同じことをする方法を学ぶことです(今はOpenGLにもっと興味があります) – user3417052

+1

'cessna.osg 'テクスチャ座標を含んでいますか? – SurvivalMachine

答えて

1

あなたのコードがよさそうだが、あなたは間違いなく使用しているcessna.osgモデルは、任意のUV(テクスチャ)座標を持っていません。

モデルのテキストバージョン(cessna.osgt)をメモ帳で調べると、テクスチャ座標ではなく、頂点座標だけが表示されます。

テクスチャ座標を持つ他のモデルでテストを実行します。 osg-data repoにはskydome.osgtのようにいくつかあります

+0

こんにちは、リッキーヴィヴィングです。それが理由かもしれませんが、コードを再度実行して、cessna.osgの代わりにskydome.osgtをロードすると、skydome.osgが元のテクスチャ(雲がついた空)とともに表示されます。 ブリックテクスチャを使用してスカイプームを取得するためにコードを変更する必要がありますか? – user3417052

+0

そうです、読み込まれたモデルのStateSetで指定されたテクスチャは、シーングラフのあなたの下のノードの代わりに使用されています。テキストファイルから独自のテクスチャを削除するか、この呼び出しでテクスチャ属性を上書きすることができます。 'ss-> setTextureAttributeAndModes(0、bodyTexture.get()、osg :: StateAttribute :: ON | osg :: StateAttribute :: OVERRIDE); ' – rickyviking

+0

完璧な、それはやっと働いた!どうもありがとうございます ! – user3417052

関連する問題