osg蝴蝶纹理
#include <osgViewer/Viewer>
#include <osgDB/WriteFile>
#include <osg/StateSet>
#include <osg/Texture>
#include <osg/Texture2D>
#include <osg/Image>
#include <cmath>
#include <osgDB/ReadFile>
#pragma comment(lib, "osgd.lib")
#pragma comment(lib, "osgViewerd.lib")
#pragma comment(lib, "osgDBd.lib")
#pragma comment(lib, "osgGAd.lib")
const int FFT_SIZE = ;
const int PASSES = ;
const int N = ;
const float M_PI = osg::PI; int bitReverse(int i, int N)
{
int j = i;
int M = N;
int Sum = ;
int W = ;
M = M / ;
while (M != ) {
j = (i & M) > M - ;
Sum += j * W;
W *= ;
M = M / ;
}
return Sum;
}
void computeWeight(int N, int k, float &Wr, float &Wi)
{
Wr = cosl(2.0 * M_PI * k / float(N));
Wi = sinl(2.0 * M_PI * k / float(N));
} osg::ref_ptr<osg::Image> CreateImage()
{
osg::ref_ptr<osg::Image> image = new osg::Image;
image->allocateImage(FFT_SIZE, PASSES, , GL_RGBA, GL_FLOAT);
image->setInternalTextureFormat(GL_RGBA16);
osg::Vec4 * data = (osg::Vec4 *)image->data();
for (int i = ; i < PASSES; i++) {
int nBlocks = (int) powf(2.0, float(PASSES - - i));
int nHInputs = (int) powf(2.0, float(i));
for (int j = ; j < nBlocks; j++) {
for (int k = ; k < nHInputs; k++) {
int i1, i2, j1, j2;
if (i == ) {
i1 = j * nHInputs * + k;
i2 = j * nHInputs * + nHInputs + k;
j1 = bitReverse(i1, FFT_SIZE);
j2 = bitReverse(i2, FFT_SIZE);
} else {
i1 = j * nHInputs * + k;
i2 = j * nHInputs * + nHInputs + k;
j1 = i1;
j2 = i2;
}
float wr, wi;
computeWeight(FFT_SIZE, k * nBlocks, wr, wi);
int offset1 = (i1 + i * FFT_SIZE);
data[offset1]._v[] = (j1 + 0.5) / FFT_SIZE;
data[offset1]._v[] = (j2 + 0.5) / FFT_SIZE;
data[offset1]._v[] = wr;
data[offset1]._v[] = wi;
int offset2 = (i2 + i * FFT_SIZE);
data[offset2]._v[] = (j1 + 0.5) / FFT_SIZE;
data[offset2]._v[] = (j2 + 0.5) / FFT_SIZE;
data[offset2]._v[] = -wr;
data[offset2]._v[] = -wi;
}
}
}
return image.get();
}
osg::ref_ptr<osg::Geode> CreateQuad()
{
osg::ref_ptr<osg::Geode> quad = new osg::Geode;
osg::ref_ptr<osg::Geometry> geometry = new osg::Geometry;
osg::ref_ptr<osg::Vec3Array> vArray = new osg::Vec3Array;
osg::ref_ptr<osg::Vec2Array> tArray = new osg::Vec2Array;
vArray->push_back(osg::Vec3(-1.0, -1.0, 0.0));
vArray->push_back(osg::Vec3(1.0, -1.0, 0.0));
vArray->push_back(osg::Vec3(1.0, 1.0, 0.0));
vArray->push_back(osg::Vec3(-1.0, 1.0, 0.0)); tArray->push_back(osg::Vec2(0.0, 0.0));
tArray->push_back(osg::Vec2(1.0, 0.0));
tArray->push_back(osg::Vec2(1.0, 1.0));
tArray->push_back(osg::Vec2(0.0, 1.0)); geometry->setVertexArray(vArray.get());
geometry->setTexCoordArray(, tArray.get()); geometry->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::QUADS, , vArray->size()));
quad->addDrawable(geometry.get());
return quad.get();
} osg::ref_ptr<osg::StateSet> SetUpImageStateSet(osg::ref_ptr<osg::Image> image)
{
osg::ref_ptr<osg::StateSet> stateSet = new osg::StateSet;
osg::ref_ptr<osg::Texture2D> texture2D = new osg::Texture2D;
texture2D->setFilter(osg::Texture2D::MIN_FILTER, osg::Texture2D::NEAREST);
texture2D->setFilter(osg::Texture2D::MAG_FILTER, osg::Texture2D::NEAREST);
texture2D->setWrap(osg::Texture2D::WRAP_S, osg::Texture2D::CLAMP_TO_EDGE);
texture2D->setWrap(osg::Texture2D::WRAP_T, osg::Texture2D::CLAMP_TO_EDGE);
texture2D->setImage(image.get());
stateSet->setTextureAttributeAndModes(, texture2D.get(), osg::StateAttribute::ON);
return stateSet.get();
} int main()
{
osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer;
viewer->setUpViewInWindow(, , , ); osg::ref_ptr<osg::Geode> quad = CreateQuad();
quad->setStateSet(SetUpImageStateSet(CreateImage().get()));
viewer->setSceneData(quad.get());
viewer->getCamera()->getOrCreateStateSet()->setMode(GL_LIGHTING, osg::StateAttribute::OFF);
viewer->run();
return EXIT_SUCCESS;
}
osg蝴蝶纹理的更多相关文章
- osg添加纹理示例
转自http://www.cnblogs.com/ylwn817/articles/1976851.html #include <osgDB/ReadFile>#include <o ...
- ocean所用的蝴蝶纹理
#include <ork/render/FrameBuffer.h> #include <ork/scenegraph/SceneManager.h> #include &l ...
- OSG学习:计算纹理坐标
在很多时候,直接指定纹理坐标是非常不方便的,如曲面纹理坐标,只有少数的曲面(如圆锥.圆柱等)可以在不产生扭曲的情况下映射到平面上,其他的曲面在映射到表面时都会产生一定程度的扭曲.一般而言,曲面表面的曲 ...
- osg纯手工画球+贴纹理
手动计算球面顶点的坐标,纹理坐标,来画球并贴纹理 其中createSphereGeom()函数的的二个参数为18,意思是在经纬度上每10度设一个点,因为经度一共是180度,180/18=10,相当于横 ...
- osg使用shader动态修改纹理坐标
#include <osg/Node> #include <osg/Geometry> #include <osg/Notify> #include <osg ...
- OSG绘制金字塔geode+动态纹理坐标
osg::Node* createPyramidModel() { // create the root node which will hold the model. osg::Group* roo ...
- osg::Texture2D 贴纹理
#ifdef _WIN32 #include <Windows.h> #endif // _WIN32 #include<iostream> #include <osgV ...
- OpenSceneGraph | OSG如何存储带纹理osgb格式可以节省空间
在使用OSG(OpenSceneGraph)存储带纹理osgb格式的过程中,大家会遇到这样一种情况:存储后的osgb文件所占用的大小远大于原始文件的大小,几倍至几十倍.这是为何呢?原因是OSG默认 ...
- 基于osg的python三维程序开发(三)------几何形体及纹理
def createScene(): geode = osg.Geode() pointsGeom = osg.Geometry() vertices = osg.Vec3Array() vertic ...
随机推荐
- 安卓---apk反编译
转自:http://blog.csdn.net/vipzjyno1/article/details/21039349 在学习Android开发的过程你,你往往会去借鉴别人的应用是怎么开发的,那些漂亮 ...
- ecshop3.0.0注入
配个环境来演示给别人看..分析一下.flow.php文件缺陷,order_id在post请求没有单引号保护.造成注入 <?php elseif ($_REQUEST['step'] == 're ...
- Python操作redis、memcache和ORM框架_Day13
一.memcache Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速 ...
- DateTime & UTC 相互转化
public long ToUnixTime(DateTime date) { var epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.U ...
- 利用python3.5 构建流媒体后台音视频切换的服务端程序
#!/usr/bin/env python3.5.0 # -*- coding:utf8 -*- import os,sys,socket,hashlib,time,select,threading, ...
- 我喜欢的快捷键 webstorm
1.打开设置 ctrl+alt+s 2.重命名 rename ctrl+r
- 【转】gcc/g++ 如何支持c11 / c++11标准编译
如果用命令 g++ -g -Wall main.cpp 编译以下代码 : 1 2 3 4 5 6 7 8 9 10 11 12 /* file : main.cpp */ #include ...
- json字符串和对象的相互转化
json在代码中是经常用到的,在此总结一下json字符串和对象及数组之间的相互转化: 1.javascript函数方式: <1> JSON.stringify :把一个对象转换成json字 ...
- [Q]pdfFactory打印机纸张方向设置为横向
不推荐更改pdfFactory打印机默认纸张方向(默认为横向),更改后可能导致不必要的麻烦(pdfFactory要求所定义的纸张方向与实际的纸张方向需一致,因此若更改为横向,则纸张宽度的定义需大于纸张 ...
- 1、API
基本API sectionsColor:['green','orange','red','grey'],//为每一层设置背景颜色 controlArrows:true,//是否显示幻灯片的左右按钮 v ...