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
シーンの左側に見えます。