ocean所用的蝴蝶纹理
- #include <ork/render/FrameBuffer.h>
- #include <ork/scenegraph/SceneManager.h>
- #include <ork/ui/GlutWindow.h>
- #include <pmath.h>
- #include <stbi/stb_image.h>
- #include <iostream>
- #include <fstream>
- const int FFT_SIZE = ;
- const int PASSES = ;
- const int N = ;
- 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));
- }
- float *computeButterflyLookupTexture()
- {
- float *data = new float[FFT_SIZE * PASSES * ];
- 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 + ] = (j1 + 0.5) / FFT_SIZE;
- data[offset1 + ] = (j2 + 0.5) / FFT_SIZE;
- data[offset1 + ] = wr;
- data[offset1 + ] = wi;
- int offset2 = * (i2 + i * FFT_SIZE);
- data[offset2 + ] = (j1 + 0.5) / FFT_SIZE;
- data[offset2 + ] = (j2 + 0.5) / FFT_SIZE;
- data[offset2 + ] = -wr;
- data[offset2 + ] = -wi;
- }
- }
- }
- return data;
- }
- const unsigned char * loadfile(const std::string &file, int &size)
- {
- std::ifstream fs(file.c_str(), std::ios::binary);
- fs.seekg(, std::ios::end);
- size = fs.tellg();
- char * data = new char[size + ];
- fs.seekg();
- fs.read(data, size);
- fs.close();
- data[size] = ;
- return (unsigned char *)data;
- }
- struct P3_UV
- {
- float _x, _y, _z;
- float _u, _v;
- P3_UV()
- {
- }
- P3_UV(float x, float y, float z, float u, float v)
- :_x(x),_y(y),_z(z),_u(u),_v(v)
- {
- }
- };
- class TestWindow : public ork::GlutWindow
- {
- public:
- TestWindow()
- :ork::GlutWindow(ork::Window::Parameters().name("ProlandTerrain").size(, ))
- ,_dist(2.0)
- {
- _mesh = new ork::Mesh<P3_UV, unsigned int>(ork::TRIANGLES, ork::GPU_STATIC);
- _mesh->addAttributeType(, , ork::A32F, false);
- _mesh->addAttributeType(, , ork::A32F, true);
- _mesh->addVertex(P3_UV(-, -, , , ));
- _mesh->addVertex(P3_UV(, -, , , ));
- _mesh->addVertex(P3_UV(, , , , ));
- _mesh->addVertex(P3_UV(-, , , , ));
- _mesh->addIndice();
- _mesh->addIndice();
- _mesh->addIndice();
- _mesh->addIndice();
- _mesh->addIndice();
- _mesh->addIndice();
- int w;
- int h;
- int channels;
- int size;
- /*const unsigned char * data = loadfile("D:/1.jpg", size);
- const unsigned char * logo = stbi_load_from_memory(data, size, &w, &h, &channels, 0);*/
- float *data = computeButterflyLookupTexture();
- ork::ptr<ork::Texture2D> butterfly = new ork::Texture2D(FFT_SIZE, PASSES, ork::RGBA16F, ork::RGBA, ork::ORK_FLOAT,
- ork::Texture::Parameters().min(ork::NEAREST).mag(ork::NEAREST).wrapS(ork::CLAMP_TO_EDGE).wrapT(ork::CLAMP_TO_EDGE),
- ork::Buffer::Parameters(), ork::CPUBuffer(data));
- ork::ptr<ork::Module> meshModule = new ork::Module(, "\
- uniform mat4 localToScreen; \n\
- layout(location = ) in vec3 vertex; \n\
- layout(location = ) in vec2 uv; \n\
- out vec2 fuv; \n\
- void main() { \n\
- fuv = uv; \n\
- gl_Position = localToScreen * vec4(vertex, 1.0); \n\
- } \n\
- ", "\
- uniform sampler2D sampler; \n\
- layout(location = ) out vec4 data; \n\
- in vec2 fuv; \n\
- void main() { \n\
- data = vec4(texture(sampler, fuv).rgb, ); \n\
- } \n\
- ");
- _meshProgram = new ork::Program(meshModule);
- _localToScreen = _meshProgram->getUniformMatrix4f("localToScreen");
- _meshProgram->getUniformSampler("sampler")->set(butterfly);
- _frameBuffer = ork::FrameBuffer::getDefault();
- _frameBuffer->setClearColor(ork::vec4f(0.0, 0.0, 1.0, 1.0));
- _frameBuffer->setDepthTest(true, ork::LESS);
- }
- virtual void redisplay(double t, double dt)
- {
- _frameBuffer->clear(true, false, true);
- static float i = 0.0;
- ork::mat4f cameraToWorld = ork::mat4f::rotatey(i);
- //i += 0.01;
- cameraToWorld = cameraToWorld * ork::mat4f::translate(ork::vec3f(0.0, 0.0, _dist));
- ork::mat4f worldToCamera = cameraToWorld.inverse();
- ork::vec4<int> vp = _frameBuffer->getViewport();
- float width = float(vp.z);
- float height = float(vp.w);
- ork::mat4f cameraToScreen = ork::mat4f::perspectiveProjection(degrees(45.0), width/height, 0.1, 100000.0);
- _localToScreen->setMatrix(cameraToScreen * worldToCamera);
- _frameBuffer->draw(_meshProgram, *_mesh);
- ork::GlutWindow::redisplay(t, dt);
- }
- virtual void reshape(int x, int y)
- {
- _frameBuffer->setViewport(ork::vec4i(, , x, y));
- ork::GlutWindow::reshape(x, y);
- idle(false);
- }
- public:
- static ork::static_ptr<ork::Window> _app;
- ork::ptr<ork::FrameBuffer> _frameBuffer;
- ork::ptr<ork::Mesh<P3_UV, unsigned int> > _mesh;
- ork::ptr<ork::Program> _meshProgram;
- ork::ptr<ork::UniformMatrix4f> _localToScreen;
- float _dist;
- };
- ork::static_ptr<ork::Window> TestWindow::_app;
- int main()
- {
- atexit(ork::Object::exit);
- TestWindow::_app = new TestWindow;
- TestWindow::_app->start();
- return EXIT_SUCCESS;
- }
ocean所用的蝴蝶纹理的更多相关文章
- osg蝴蝶纹理
#include <osgViewer/Viewer> #include <osgDB/WriteFile> #include <osg/StateSet> #in ...
- Unity加载模块深度解析(纹理篇)
在游戏和VR项目的研发过程中,加载模块所带来的效率开销和内存占用(即“加载效率”.“场景切换速度”等)经常是开发团队非常头疼的问题,它不仅包括资源的加载耗时,同时也包含场景物件的实例化和资源卸载等.在 ...
- Ogre参考手册(五)3.2 合成器
3.2 合成器Compositor 合成器框架是Ogre用于全屏后处理的API.你可以通过脚本而不是API定义合成器.你可以很容易为视口实例化合成器. 合成器基础 无论是要替换还是要与主渲染窗口混合, ...
- unity3d 加载优化建议 总结 from 侑虎科技
第一部分 我们对于纹理资源的加载建议如下: 1.严格控制RGBA32和ARGB32纹理的使用,在保证视觉效果的前提下,尽可能采用“够用就好”的原则,降低纹理资源的分辨率,以及使用硬件支持的纹理格式. ...
- 转youhu科技的文章 勿怪 感激 感激
资源加载 资源加载是加载模块中最为耗时的部分,其CPU开销在Unity引擎中主要体现在Loading.UpdatePreloading和Loading.ReadObject两项中,相信经常查看Prof ...
- 面向英特尔® x86 平台的 Unity* 优化指南: 第 1 部分
原文地址 目录 工具 Unity 分析器 GPA 系统分析器 GPA 帧分析器 如要充分发挥 x86 平台的作用,您可以在项目中进行多种性能优化,以最大限度地提升性能. 在本指南中,我们将展示 Uni ...
- D3D三层Texture纹理经像素着色器实现渲染YUV420P
简单记录一下这两天用Texture实现渲染YUV420P的一些要点. 在视频播放的过程中,有的时候解码出来的数据是YUV420P的.表面(surface)通过设置参数是可以渲染YUV420P的,但Te ...
- Shader中贴图知识汇总: 漫反射贴图、凹凸贴图、高光贴图、 AO贴图、环境贴图、 光照纹理及细节贴图
原文过于冗余,精读后做了部分简化与测试实践,原文地址:http://www.j2megame.com/html/xwzx/ty/2571.html http://www.cnblogs.com/z ...
- cocos2d-x 纹理源码分析
转自:http://blog.csdn.net/honghaier/article/details/8068895 当一张图片被加载到内存后,它是以纹理的形式存在的.纹理是什么东西呢?纹理就是一块内存 ...
随机推荐
- js 技巧1
1. 使用===取代== ==和!=操作符会在需要的情况下自动转换数据类型.但===和!==不会,它们会同时比较值和数据类型,这也使得它们要比==和!=快. "){ //速度慢 } & ...
- Win32窗口
#include <Windows.h> #include <CommCtrl.h> #pragma comment(lib, "comctl32.lib" ...
- Tomcat7性能优化
目的 通过优化tomcat提高网站的并发能力. 服务器资源 服务器所能提供CPU.内存.硬盘的性能对处理能力有决定性影响. 优化配置 配置tomcat管理员账户 在conf/ tomcat-users ...
- MySQL语句相关经验总结
1. 字段自减 UPDATE `table_name` SET `total`=IF(`total` < 1, 0, `total`-1) WHERE `id` = 1; 一般在做字段减法的时候 ...
- JDK根目录介绍
/bin 存放可执行程序(编译器javac.exe 运行器java.exe 文档生成器javadoc.exe等 ). /db 小型数据库文件. /jre JRE. /include 形成jdk的c. ...
- Unity性能优化——LOD技术
LOD,中文名多层次细节,是游戏中最常用的技术,它按照模型的位置和重要程度决定物体渲染的资源分配,降低非重要物体的面数和细节度,从而获得高效率的渲染运算.今天我们来实现使用它来做一个简单的优化例子. ...
- SXT分布式缓存技术公开课的观后感
最近几天在研究Redis,Redis作为最近比较流行的缓存技术,其特点还是很明显的,Redis使用Key-Value的结构来存储数据,Redis也是内存型的数据库,数据一开始是保存在内存中的,通过某些 ...
- ie Css Hack 特殊符号
Css Hack 特殊符号 (1)* :IE6/7都能识别*,标准浏览器不识别(2)_:只有IE6识别(3)!Important:IE6不识别,Firefox,IE7/8/9.chorme等主流浏览器 ...
- css 小知识
<!-- IE下消除点击图片文字后出现的虚线框代码 --> <style type="text/css">a {blr:expression(this.on ...
- 建立tcl文件