1

GLES2を搭載したAndroidでOpenSceneGraphを使用しています。

私は2台のカメラを持っています。1台はシーン用で、もう1台はHUD用です。シーンカメラは私のosgViewerのメインカメラです。私の問題はHUDのカメラにあります。OSGジオメトリを2Dシーン(HUDカメラ)に追加しようとしていますが、表示されないようです。

カスタムシェーダーを使用して、ジオメトリの位置を操作しています。私の理解では、投影行列は正しいですが、2台のカメラを使用しているため、ビュー行列に問題がある可能性があると思います。HUDのビューをシーンの最初のビューに設定しようとしましたが、役に立ちませんでした。私がこれで間違っているならば、私を訂正してください。

   // New camera for the HUD
   hud_camera = new osg::Camera;

   // Set the camera's view properties
   hud_camera->setProjectionMatrix(
      osg::Matrix::ortho2D(0, 1280, 0, 696));
   hud_camera->setReferenceFrame(osg::Transform::ABSOLUTE_RF);
   hud_camera->setViewMatrix(osg::Matrix::identity());
   hud_camera->setViewport(0, 0, 1280, 696);

   // Clear the depth buffer
   hud_camera->setClearMask(GL_DEPTH_BUFFER_BIT);

   // Draw the subgraph after the main camera view and don't allow this camera
   // to grab evente focurs from the main camera
   hud_camera->setRenderOrder(osg::Camera::POST_RENDER);
   hud_camera->setAllowEventFocus(false);


   osg::Geode *       geode;
   osg::Geometry *    geom;
   osg::Vec3Array *   vertices;
   osg::Program *     program;

   // Create the geode and geometry to hold the crosshair image
   geode = new osg::Geode;
   geom = new osg::Geometry;
   geode->addDrawable(geom);
   hud_camera->addChild(geode);

   // Set the vertices
   vertices = new osg::Vec3Array;
   vertices->push_back(osg::Vec3(0.0, 0.0, 0.0));
   vertices->push_back(osg::Vec3(1.0, 0.0, 0.0));
   vertices->push_back(osg::Vec3(1.0, 0.0, 1.0));
   vertices->push_back(osg::Vec3(0.0, 0.0, 1.0));
   geom->setVertexArray(vertices);

   // set colors
   osg::Vec4Array* colors = new osg::Vec4Array;
   colors->push_back(osg::Vec4(1.0, 0.0, 0.0, 1.0));
   colors->push_back(osg::Vec4(0.0, 1.0, 0.0, 1.0));
   colors->push_back(osg::Vec4(0.0, 0.0, 1.0, 1.0));
   colors->push_back(osg::Vec4(1.0, 0.0, 1.0, 1.0));
   geom->setVertexAttribArray(7, colors);
   geom->setVertexAttribBinding(7, osg::Geometry::BIND_PER_VERTEX);

   // Set primitive set
   geom->addPrimitiveSet(new osg::DrawArrays(GL_QUADS, 0, 4));
   geom->setUseVertexBufferObjects(true);

   // Vertex Shader
   char vertSource[] =
   "attribute vec4 osg_Vertex;\n"
   "attribute vec4 a_col;"
   "uniform mat4 osg_ModelViewProjectionMatrix;\n"
   "uniform mat4 proj_matrix;\n"
   "uniform mat4 view_matrix;\n"
   "varying vec4 v_col;"
   "void main(void)\n"
   "{\n"
   "gl_Position = view_matrix * proj_matrix * osg_Vertex;\n"
   "v_col = a_col;\n"
   "}\n";

   // Fragment shader
   char fragSource[] =
   "precision mediump float;\n"
   "varying vec4 v_col;"
   "void main(void)\n"
   "{\n"
   "gl_FragColor = v_col;\n"
   "}\n";

   // Set the shaders
   program = new osg::Program;
   program->setName("Crosshair Shader");
   program->addShader(new osg::Shader(osg::Shader::VERTEX, vertSource));
   program->addShader(new osg::Shader(osg::Shader::FRAGMENT, fragSource));
   program->addBindAttribLocation("a_col", 7);

   osg::StateSet* state = geode->getOrCreateStateSet();
   state->addUniform(
      new osg::Uniform("proj_matrix", hud_camera->getProjectionMatrix()));
   state->addUniform(
      new osg::Uniform("view_matrix", hud_camera->getViewMatrix());

   // Add the program shaders
   geode->getOrCreateStateSet()->setAttributeAndModes(
      program, osg::StateAttribute::ON );

   // Needs no lighting or any depth for a 2D image
   geode->getOrCreateStateSet()->setMode(GL_LIGHTING, osg::StateAttribute::OFF);
   state->setMode(GL_DEPTH_TEST, osg::StateAttribute::OFF);

その後、子としてhud_cameraをシーンデータにアタッチします。また、シーンカメラは、シーン内の特定のポイントを見る以外に特別なことは何もしていません。

ジオメトリが作成されているという事実を知っています。頂点シェーダーでこれを使用することにより:

gl_Position = osg_ModelViewProjectionMatrx * osg_Vertex

シーンの左側に見えます。

4

1 に答える 1

0

まず第一に、あなたは演じるべきではありませんview * proj * vertex、それはそうあるべきですproj * view * vertex

ちょっとしたことですが、ビューマトリックスはまったく必要ないと思います。私の理解では、画面にフラットクワッドを描画したいだけですか?

投影行列が(0,0)から(1280,696)にマップされている場合は、この座標系でオブジェクトを描画できます((0,0)から(640,696)までのクワッドが画面の左半分をカバーします。 )。

または、(0,0)から(1,1)までの空間に物を描きたい場合は、投影行列をオーバーライドしてこの空間をマッピングします。HUDのような単純なものにビューマトリックスを含めることは、私にはあまり意味がありません。

于 2012-09-28T15:58:44.660 に答える