osg图元绑定方式总结
生活随笔
收集整理的這篇文章主要介紹了
osg图元绑定方式总结
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
osg中圖元綁定方式主要有下面幾種:
/*取消綁定。此時,顏色數(shù)據(jù)或者法線數(shù)據(jù)與頂點數(shù)據(jù)完全沒有關(guān)系,頂點數(shù)據(jù)的顏色和法線方向完全由缺省值決定。 */ BIND_OFF/*綁定全部幾何體。此時,顏色數(shù)組或者法線坐標(biāo)數(shù)組中只需要保存一個數(shù)據(jù),該數(shù)據(jù)將影響此Geometry類的所 有幾何體頂點坐標(biāo)。例如,將紅色綁定到全部幾何體上,則這個類繪制出的所有物體均是紅色的。*/ BIND_OVERALL/*綁定逐個幾何體。此時,顏色數(shù)組或者法線坐標(biāo)數(shù)組中保存的數(shù)據(jù)數(shù)量應(yīng)當(dāng)與用戶將要繪制的幾何體數(shù)量相同。例如,用戶依據(jù)8個頂點來繪制兩個四邊形時,可以分別為它們設(shè)置兩個法線坐標(biāo),并使用此參數(shù)進行綁定。 */ BIND_PER_PRIMITIVE/*綁定逐個點。逐點綁定。比如上面的例子,將四個顏色數(shù)據(jù)分別綁定到四個頂點坐標(biāo),可以實現(xiàn)頂點顏色之間的過渡效果。 */BIND_PER_VERTEX如下代碼:(摘自osg自帶的例子,源碼在osg源碼目錄下examples\osganimate\osganimate.cpp,讀者可以運行osg的這個例子試試)
osg::Node* createBase(const osg::Vec3& center, float radius) {int numTilesX = 10;int numTilesY = 10;float width = 2 * radius;float height = 2 * radius;osg::Vec3 v000(center - osg::Vec3(width*0.5f, height*0.5f, 0.0f));osg::Vec3 dx(osg::Vec3(width / ((float)numTilesX), 0.0, 0.0f));osg::Vec3 dy(osg::Vec3(0.0f, height / ((float)numTilesY), 0.0f));// fill in vertices for grid, note numTilesX+1 * numTilesY+1...osg::Vec3Array* coords = new osg::Vec3Array;int iy;for (iy = 0; iy <= numTilesY; ++iy){for (int ix = 0; ix <= numTilesX; ++ix){coords->push_back(v000 + dx * (float)ix + dy * (float)iy);}}//Just two colours - black and white.osg::Vec4Array* colors = new osg::Vec4Array;colors->push_back(osg::Vec4(1.0f, 1.0f, 1.0f, 1.0f)); // whitecolors->push_back(osg::Vec4(0.0f, 0.0f, 0.0f, 1.0f)); // blackosg::ref_ptr<osg::DrawElementsUShort> whitePrimitives = new osg::DrawElementsUShort(GL_QUADS);osg::ref_ptr<osg::DrawElementsUShort> blackPrimitives = new osg::DrawElementsUShort(GL_QUADS);int numIndicesPerRow = numTilesX + 1;for (iy = 0; iy < numTilesY; ++iy){for (int ix = 0; ix < numTilesX; ++ix){osg::DrawElementsUShort* primitives = ((iy + ix) % 2 == 0) ? whitePrimitives.get() : blackPrimitives.get();int a = ix + (iy + 1)*numIndicesPerRow;int b = ix + iy * numIndicesPerRow;int c = (ix + 1) + iy * numIndicesPerRow;int d = (ix + 1) + (iy + 1)*numIndicesPerRow;primitives->push_back(ix + (iy + 1)*numIndicesPerRow);primitives->push_back(ix + iy * numIndicesPerRow);primitives->push_back((ix + 1) + iy * numIndicesPerRow);primitives->push_back((ix + 1) + (iy + 1)*numIndicesPerRow);}}// set up a single normalosg::Vec3Array* normals = new osg::Vec3Array;normals->push_back(osg::Vec3(0.0f, 0.0f, 1.0f));osg::Geometry* geom = new osg::Geometry;geom->setVertexArray(coords);geom->setColorArray(colors, osg::Array::BIND_PER_PRIMITIVE_SET);geom->setNormalArray(normals, osg::Array::BIND_OVERALL);geom->addPrimitiveSet(whitePrimitives.get());geom->addPrimitiveSet(blackPrimitives.get());osg::Geode* geode = new osg::Geode;geode->addDrawable(geom);return geode; }其中
geom->setColorArray(colors, osg::Array::BIND_PER_PRIMITIVE_SET);就是逐個綁定幾何體。此時,顏色數(shù)組或者法線坐標(biāo)數(shù)組中保存的數(shù)據(jù)數(shù)量應(yīng)當(dāng)與用戶將要繪制的幾何體數(shù)量相同。例如:上面繪制了黑色和白色相間的棋盤格,即白色四邊形和黑色四邊形,因為有兩種四邊形,即兩種幾何體,當(dāng)采用osg::Array::BIND_PER_PRIMITIVE_SET時,顏色至少也要兩種,例如上面的代碼有下面兩句就說明了要兩種顏色:
osg::Vec4Array* colors = new osg::Vec4Array;colors->push_back(osg::Vec4(1.0f, 1.0f, 1.0f, 1.0f)); // whitecolors->push_back(osg::Vec4(0.0f, 0.0f, 0.0f, 1.0f)); // black此時運行的結(jié)果如下:
?
如果將上面的顏色綁定方式改為如下:
geom->setColorArray(colors, osg::Array::BIND_OVERALL);即使顏色數(shù)組有兩組,但還是將所有幾何體(本例指黑色和白色的棋盤格)?的顏色都綁定到顏色數(shù)組的第一組,此時效果如下:
?
?
總結(jié)
以上是生活随笔為你收集整理的osg图元绑定方式总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 我的世界怎么让盔甲架动
- 下一篇: osg::ComputeBoundsVi