#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蝴蝶纹理的更多相关文章

  1. osg添加纹理示例

    转自http://www.cnblogs.com/ylwn817/articles/1976851.html #include <osgDB/ReadFile>#include <o ...

  2. ocean所用的蝴蝶纹理

    #include <ork/render/FrameBuffer.h> #include <ork/scenegraph/SceneManager.h> #include &l ...

  3. OSG学习:计算纹理坐标

    在很多时候,直接指定纹理坐标是非常不方便的,如曲面纹理坐标,只有少数的曲面(如圆锥.圆柱等)可以在不产生扭曲的情况下映射到平面上,其他的曲面在映射到表面时都会产生一定程度的扭曲.一般而言,曲面表面的曲 ...

  4. osg纯手工画球+贴纹理

    手动计算球面顶点的坐标,纹理坐标,来画球并贴纹理 其中createSphereGeom()函数的的二个参数为18,意思是在经纬度上每10度设一个点,因为经度一共是180度,180/18=10,相当于横 ...

  5. osg使用shader动态修改纹理坐标

    #include <osg/Node> #include <osg/Geometry> #include <osg/Notify> #include <osg ...

  6. OSG绘制金字塔geode+动态纹理坐标

    osg::Node* createPyramidModel() { // create the root node which will hold the model. osg::Group* roo ...

  7. osg::Texture2D 贴纹理

    #ifdef _WIN32 #include <Windows.h> #endif // _WIN32 #include<iostream> #include <osgV ...

  8. OpenSceneGraph | OSG如何存储带纹理osgb格式可以节省空间

      在使用OSG(OpenSceneGraph)存储带纹理osgb格式的过程中,大家会遇到这样一种情况:存储后的osgb文件所占用的大小远大于原始文件的大小,几倍至几十倍.这是为何呢?原因是OSG默认 ...

  9. 基于osg的python三维程序开发(三)------几何形体及纹理

    def createScene(): geode = osg.Geode() pointsGeom = osg.Geometry() vertices = osg.Vec3Array() vertic ...

随机推荐

  1. 如何使用jconsole(英文)

    http://docs.oracle.com/javase/6/docs/technotes/guides/management/jconsole.html

  2. CoreJavaE10V1P3.3 第3章 Java的基本编程结构-3.3 数据类型

    3.3 数据类型 这里所说的数据类型是指 Java的8中基本数据类型,是原生就存在的. 不同进制数的字面值表示方法 进制 字面值表示方法 例子 是否默认 JDK版本支持 2进制 0b或0B前缀(每4位 ...

  3. 各类数据库url

    msql: jdbc:mysql://127.0.0.1:3306/databaseName ms-sql jdbc:microsoft:sqlserver://127.0.0.1:1433;Data ...

  4. torisegit 保存帐号密码

    设置 -> git 编辑本地 .git/config 增加 [credential] helper = store

  5. 查看JS object 结构

    function lookProperty(obj){ var ob=eval(obj); var property=""; for(var p in ob){ property+ ...

  6. sql优化--in和exists效率

    系统要求进行SQL优化,对效率比较低的SQL进行优化,使其运行效率更高,其中要求对SQL中的部分in/not in修改为exists/not exists 修改方法如下: in的SQL语句 SELEC ...

  7. 阿里云ECS-Nginx阿里云客户端IP日志记录

    #前端有SLB服务,记录客户端真实IP信息 log_format main 'realip:$http_x_forwarded_for slbip:$remote_addr-$remote_user ...

  8. 注册表对比工具(Regshot) V2.0.1 中文绿色版

    软件名称: 注册表对比工具(Regshot)软件语言: 简体中文授权方式: 免费软件运行环境: Win7 / Vista / WinXP软件大小: 263KB图片预览: 软件简介:Regshot 是一 ...

  9. 干货篇:揭开CSS盒模型神秘的面纱

    写博客可以对学习内容进行总结.分享和交流(面对面的技术分享会也不错)... 如果是单纯的记录,印象笔记完全够了. 步入正题,盒模型是web布局核心,掌握基础知识,以后实战中会如鱼得水~ 概念与历史 C ...

  10. centos 安装cacti监控

    CentOS 6下Cacti搭建文档 安装依赖关系 yum -y install mysql-devel httpd php php-pdo php-snmp php-mysql lm_sensors ...