OSGを使用して点群を描画しています。私は、多くのインスタンスで1つの点を作成し、テクスチャを介してグラフィックスカードにポイントの場所を転送する方法を示す「描画インスタンス付きレンダリングポイントクラウドデータ」というOSG料理の例を続けました。その後、シェーダを使用してテクスチャからポイントを引き出し、各インスタンスを正しい場所に移動します。レンダリングされるものには2つの問題があるようです。OSGの描画インスタンスでレンダリングポイントクラウドデータが動作しないCookbookが機能しない
第1に、レンダリングのより直接的で実用的なアプローチと比べて、ポイントが正しい場所にありません。彼らは、間違ったゼロ、ポジションの何らかの乗法因子から大まかにスケールされているように見えます。
第2に、画像がぼやけています。ポイントは一般的に正しい場所にある傾向があります。大きなオブジェクトがあるはずの場所には多くの点があります。しかし、私はそのオブジェクトが何であるかは分からない。私の作業(しかしより遅い)レンダリング方法でレンダリングされたデータは、鮮明に見えます。
テクスチャと描画の両方に同じ入力データがあることを確認しましたので、レンダリングで何かをする必要があるようです。
ここでは、テキストブックからほとんど直接コピーされたジオメトリを設定するコードを示します。
osg::Geometry* geo = new osg::Geometry;
osg::ref_ptr<osg::Image> img = new osg::Image;
img->allocateImage(w,h, 1, GL_RGBA, GL_FLOAT);
osg::BoundingBox box;
float* data = (float*)img->data();
for (unsigned long int k=0; k<NPoints; k++)
{
*(data++) = cloud->x[k];
*(data++) = cloud->y[k];
*(data++) = cloud->z[k];
*(data++) = cloud->meta[0][k];
box.expandBy(cloud->x[k],cloud->y[k],cloud->z[k]);
}
geo->setUseDisplayList(false);
geo->setUseVertexBufferObjects(true);
geo->setVertexArray(new osg::Vec3Array(1));
geo->addPrimitiveSet(new osg::DrawArrays(GL_POINTS, 0, 1, stop));
geo->setInitialBound(box);
osg::ref_ptr<osg::Texture2D> tex = new osg::Texture2D;
tex->setImage(img);
tex->setInternalFormat(GL_RGBA32F_ARB);
tex->setFilter(osg::Texture2D::MIN_FILTER, osg::Texture2D::LINEAR);
tex->setFilter(osg::Texture2D::MAG_FILTER, osg::Texture2D::LINEAR);
ここにシェーダコードがあります。
void main() {
float row;
row = float(gl_InstanceID)/float(width);
vec2 uv = vec2(fract(row), floor(row)/float(height));
vec4 texValue = texture2D(defaultTex,uv);
vec4 pos = gl_Vertex + vec4(texValue.xyz, 1.0);
gl_Position = gl_ModelViewProjectionMatrix * pos;
}