日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

osg图元绑定方式总结

發布時間:2023/12/15 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 osg图元绑定方式总结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

osg中圖元綁定方式主要有下面幾種:

/*取消綁定。此時,顏色數據或者法線數據與頂點數據完全沒有關系,頂點數據的顏色和法線方向完全由缺省值決定。 */ BIND_OFF/*綁定全部幾何體。此時,顏色數組或者法線坐標數組中只需要保存一個數據,該數據將影響此Geometry類的所 有幾何體頂點坐標。例如,將紅色綁定到全部幾何體上,則這個類繪制出的所有物體均是紅色的。*/ BIND_OVERALL/*綁定逐個幾何體。此時,顏色數組或者法線坐標數組中保存的數據數量應當與用戶將要繪制的幾何體數量相同。例如,用戶依據8個頂點來繪制兩個四邊形時,可以分別為它們設置兩個法線坐標,并使用此參數進行綁定。 */ BIND_PER_PRIMITIVE/*綁定逐個點。逐點綁定。比如上面的例子,將四個顏色數據分別綁定到四個頂點坐標,可以實現頂點顏色之間的過渡效果。 */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);

就是逐個綁定幾何體。此時,顏色數組或者法線坐標數組中保存的數據數量應當與用戶將要繪制的幾何體數量相同。例如:上面繪制了黑色和白色相間的棋盤格,即白色四邊形和黑色四邊形,因為有兩種四邊形,即兩種幾何體,當采用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

此時運行的結果如下:

?

如果將上面的顏色綁定方式改為如下:

geom->setColorArray(colors, osg::Array::BIND_OVERALL);

即使顏色數組有兩組,但還是將所有幾何體(本例指黑色和白色的棋盤格)?的顏色都綁定到顏色數組的第一組,此時效果如下:

?

?

總結

以上是生活随笔為你收集整理的osg图元绑定方式总结的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。