2016-11-08 10 views
0

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; 
} 

答えて

0

実験を重ねた結果、OSG Cookbookのサンプルコードにいくつかの問題があることがわかりました。

スケールの問題(最初の問題)がシェーダーにあります。

vec4 pos = gl_Vertex + vec4(texValue.xyz, 1.0); 

はgl_Vertexがマトリックス変換と側近に余分な1つの要素で3ベクトルであるからである

vec4 pos = gl_Vertex + vec4(texValue.xyz, 0.0); 

ある必要があります。その要素は常に1でなければなりません。この例では別の3 + 1ベクトルを作成し、それをgl_Vertexに加えて2にします.1を0に置き換えてスケールの問題がなくなります。

ぼかし(第2の問題)は、テクスチャ補間によるものです。

tex->setFilter(osg::Texture2D::MIN_FILTER, osg::Texture2D::LINEAR); 
tex->setFilter(osg::Texture2D::MAG_FILTER, osg::Texture2D::LINEAR); 

補間は単に代わりにポイントクラウドの反対側上の点であってもよい隣接するテクスチャ画素からそれらを補間するテクスチャから値を取るように

tex->setFilter(osg::Texture2D::MIN_FILTER, osg::Texture2D::NEAREST); 
tex->setFilter(osg::Texture2D::MAG_FILTER, osg::Texture2D::NEAREST); 

する必要があります。これらの2つの問題を修正した後、この例は広告として機能し、限られたテストでは少し速くなっているようです。

関連する問題