亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? oceanfft.cu

?? 采用GPU通用計算API實現快速傅立葉變換
?? CU
?? 第 1 頁 / 共 2 頁
字號:
/*
 * Copyright 1993-2007 NVIDIA Corporation.  All rights reserved.
 *
 * NOTICE TO USER:
 *
 * This source code is subject to NVIDIA ownership rights under U.S. and
 * international Copyright laws.  Users and possessors of this source code
 * are hereby granted a nonexclusive, royalty-free license to use this code
 * in individual and commercial software.
 *
 * NVIDIA MAKES NO REPRESENTATION ABOUT THE SUITABILITY OF THIS SOURCE
 * CODE FOR ANY PURPOSE.  IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR
 * IMPLIED WARRANTY OF ANY KIND.  NVIDIA DISCLAIMS ALL WARRANTIES WITH
 * REGARD TO THIS SOURCE CODE, INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE.
 * IN NO EVENT SHALL NVIDIA BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL,
 * OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
 * OF USE, DATA OR PROFITS,  WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
 * OR OTHER TORTIOUS ACTION,  ARISING OUT OF OR IN CONNECTION WITH THE USE
 * OR PERFORMANCE OF THIS SOURCE CODE.
 *
 * U.S. Government End Users.   This source code is a "commercial item" as
 * that term is defined at  48 C.F.R. 2.101 (OCT 1995), consisting  of
 * "commercial computer  software"  and "commercial computer software
 * documentation" as such terms are  used in 48 C.F.R. 12.212 (SEPT 1995)
 * and is provided to the U.S. Government only as a commercial end item.
 * Consistent with 48 C.F.R.12.212 and 48 C.F.R. 227.7202-1 through
 * 227.7202-4 (JUNE 1995), all U.S. Government End Users acquire the
 * source code with only those rights set forth herein.
 *
 * Any use of this source code in individual and commercial software must
 * include, in the user documentation and internal comments to the code,
 * the above Disclaimer and U.S. Government End Users Notice.
 */

/* 
    FFT-based Ocean simulation
    based on original code by Yury Uralsky

    This sample demonstrates how to use CUFFT to synthesize and
    render an ocean surface in real-time.

    See Jerry Tessendorf's Siggraph course notes for more details:
    http://www.finelightvisualtechnology.com/pages/coursematerials.php    

    It also serves as an example of how to generate multiple vertex
    buffer streams from CUDA and render them using GLSL shaders.
*/

#ifdef _WIN32
#  define WINDOWS_LEAN_AND_MEAN
#  define NOMINMAX
#  include <windows.h>
#endif

// includes
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <GL/glew.h>
#include <cutil.h>
#include <cutil_gl_error.h>
#include <cuda_gl_interop.h>
#include <cufft.h>
#include <math_constants.h>

#if defined(__APPLE__) || defined(MACOSX)
#include <GLUT/glut.h>
#else
#include <GL/glut.h>
#endif

////////////////////////////////////////////////////////////////////////////////
// constants
unsigned int windowW = 512, windowH = 512;
const unsigned int meshW = 256,  meshH = 256;

unsigned int fftInputW, fftInputH;
unsigned int fftInputSize;

// OpenGL vertex buffers
GLuint posVertexBuffer;
GLuint heightVertexBuffer, slopeVertexBuffer;
GLuint indexBuffer;
GLuint shaderProg;
char* vertShaderPath = 0, *fragShaderPath = 0;

// mouse controls
int mouseOldX, mouseOldY;
int mouseButtons = 0;
float rotateX = 20.0f, rotateY = 0.0f;
float translateX = 0.0f, translateY = 0.0f, translateZ = -2.0f;

bool animate = true;
bool drawPoints = false;
bool wireFrame = false;

// FFT data
cufftHandle fftPlan;
float2 *d_h0 = 0, *d_ht = 0;
float2 *h_h0 = 0;
float2 *d_slope = 0;

// simulation parameters
const float g = 9.81;		        // gravitational constant
const float A = 2*.00000000775f;	// wave scale factor
const float patchSize = 100;        // patch size
float windSpeed = 10.0f;
float windDir = CUDART_PI_F/3.0f;

unsigned int timer;
float animTime = 0.0f;
float prevTime = 0.0f;
float animationRate = -0.0005f;

////////////////////////////////////////////////////////////////////////////////
// kernels
#include <oceanFFT_kernel.cu>

////////////////////////////////////////////////////////////////////////////////
// forward declarations
void runTest(int argc, char** argv);

// GL functionality
CUTBoolean initGL();
void createVBO(GLuint* vbo, int size);
void deleteVBO(GLuint* vbo);
void createMeshIndexBuffer(GLuint *id, int w, int h);
void createMeshPositionVBO(GLuint *id, int w, int h);
GLuint loadGLSLProgram(const char *vertFileName, const char *fragFileName);

// rendering callbacks
void display();
void keyboard(unsigned char key, int x, int y);
void mouse(int button, int state, int x, int y);
void motion(int x, int y);
void reshape(int w, int h);
void idle();

// Cuda functionality
void runCuda();
void generate_h0();
void generateFftInput();

////////////////////////////////////////////////////////////////////////////////
// Program main
////////////////////////////////////////////////////////////////////////////////
int main(int argc, char** argv)
{
    printf("CUDA FFT Ocean\n\n"
           "Left mouse button          - rotate\n"
           "Middle mouse button        - pan\n"
           "Left + middle mouse button - zoom\n"
           "'w' key                    - toggle wireframe\n");

    runTest(argc, argv);

    CUT_EXIT(argc, argv);
}

////////////////////////////////////////////////////////////////////////////////
//! Run test
////////////////////////////////////////////////////////////////////////////////
void runTest(int argc, char** argv)
{
    // Cuda init
    CUT_DEVICE_INIT(argc, argv);

    // create FFT plan
    CUFFT_SAFE_CALL(cufftPlan2d(&fftPlan, meshW, meshH, CUFFT_C2R) );

    // allocate memory
    fftInputW = (meshW / 2)+1;
    fftInputH = meshH;
    fftInputSize = (fftInputW*fftInputH)*sizeof(float2);

    CUDA_SAFE_CALL(cudaMalloc((void **)&d_h0, fftInputSize) );
    CUDA_SAFE_CALL(cudaMalloc((void **)&d_ht, fftInputSize) );
    h_h0 = (float2 *) malloc(fftInputSize);
    generate_h0();
    CUDA_SAFE_CALL(cudaMemcpy(d_h0, h_h0, fftInputSize, cudaMemcpyHostToDevice) );

    CUDA_SAFE_CALL(cudaMalloc((void **)&d_slope, meshW*meshH*sizeof(float2)) );

    cutCreateTimer(&timer);
    cutStartTimer(timer);
    prevTime = cutGetTimerValue(timer);

    // Create GL context
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);
    glutInitWindowSize(windowW, windowH);
    glutCreateWindow("CUDA FFT Ocean Simulation");

    vertShaderPath = cutFindFilePath("ocean.vert", argv[0]);
    fragShaderPath = cutFindFilePath("ocean.frag", argv[0]);
    if (vertShaderPath == 0 || fragShaderPath == 0) {
        fprintf(stderr, "Error finding shader files!\n");
        exit(EXIT_FAILURE);
    }

    // initialize GL
    if(CUTFalse == initGL()) {
        return;
    }

    // create vertex buffers and register with CUDA
    createVBO(&heightVertexBuffer, meshW*meshH*sizeof(float));
    CUDA_SAFE_CALL(cudaGLRegisterBufferObject(heightVertexBuffer));

    createVBO(&slopeVertexBuffer, meshW*meshH*sizeof(float2));
    CUDA_SAFE_CALL(cudaGLRegisterBufferObject(slopeVertexBuffer));

    // create vertex and index buffer for mesh
    createMeshPositionVBO(&posVertexBuffer, meshW, meshH);
    createMeshIndexBuffer(&indexBuffer, meshW, meshH);

    runCuda();

    // register callbacks
    glutDisplayFunc(display);
    glutKeyboardFunc(keyboard);
    glutMouseFunc(mouse);
    glutMotionFunc(motion);
    glutReshapeFunc(reshape);
    glutIdleFunc(idle);

    // start rendering mainloop
    glutMainLoop();
}

// Phillips spectrum
// Vdir - wind angle in radians
// V - wind speed
float phillips(float Kx, float Ky, float Vdir, float V, float A)
{
    float k_squared = Kx * Kx + Ky * Ky;
    float k_x = Kx / sqrtf(k_squared);
    float k_y = Ky / sqrtf(k_squared);
    float L = V * V / g;
    float w_dot_k = k_x * cosf(Vdir) + k_y * sinf(Vdir);

    if (k_squared == 0) return 0;

    return A * expf(-1.0 / (k_squared * L * L)) / (k_squared * k_squared) * w_dot_k * w_dot_k;
}

// Generate base heightfield in frequency space
void generate_h0()
{
    for (unsigned int y = 0; y<fftInputH; y++) {
        for (unsigned int x = 0; x<fftInputW; x++) {
            float kx = CUDART_PI_F * x / (float) patchSize;
            float ky = 2.0f * CUDART_PI_F * y / (float) patchSize;

            // note - these random numbers should be from a Gaussian distribution really
            float Er = 2.0f * rand() / (float) RAND_MAX - 1.0f;
            float Ei = 2.0f * rand() / (float) RAND_MAX - 1.0f;

            float P = sqrt(phillips(kx, ky, windDir, windSpeed, A));  

            float h0_re = 1.0f / sqrtf(2.0f) * Er * P;
            float h0_im = 1.0f / sqrtf(2.0f) * Ei * P;

            int i = y*fftInputW+x;
            h_h0[i].x = h0_re;
            h_h0[i].y = h0_im;
        }
    }
}

//Round a / b to nearest higher integer value
int iDivUp(int a, int b)
{
    return (a + (b - 1)) / b;
}

////////////////////////////////////////////////////////////////////////////////
//! Run the Cuda kernels
////////////////////////////////////////////////////////////////////////////////
void runCuda()
{
    // generate wave spectrum in frequency domain
    dim3 block(8, 8, 1);
    dim3 grid(iDivUp(fftInputW, block.x), iDivUp(fftInputH, block.y), 1);
    generateSpectrumKernel<<<grid, block>>>(d_h0, d_ht, fftInputW, fftInputH, animTime, patchSize);

    // execute inverse FFT to convert to spatial domain
    float *hptr;
    CUDA_SAFE_CALL(cudaGLMapBufferObject((void**)&hptr, heightVertexBuffer));
    CUFFT_SAFE_CALL( cufftExecC2R(fftPlan, (cufftComplex *) d_ht, hptr) );

    // calculate slope for shading
    float2 *sptr;
    CUDA_SAFE_CALL(cudaGLMapBufferObject((void**)&sptr, slopeVertexBuffer));
    dim3 grid2(iDivUp(meshW, block.x), iDivUp(meshH, block.y), 1);
    calculateSlopeKernel<<<grid2, block>>>(hptr, sptr, meshW, meshH);

    CUDA_SAFE_CALL(cudaGLUnmapBufferObject(slopeVertexBuffer));
    CUDA_SAFE_CALL(cudaGLUnmapBufferObject(heightVertexBuffer));
}

////////////////////////////////////////////////////////////////////////////////
//! Display callback
////////////////////////////////////////////////////////////////////////////////
void display()
{
    // run CUDA kernel to generate vertex positions
    if (animate) {
        runCuda();
    }

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    // set view matrix
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲激情欧美激情| 日韩精品一区二区在线观看| 91精品国产综合久久久蜜臀图片| 成人免费在线播放视频| 国产不卡在线播放| 中文字幕中文乱码欧美一区二区| 成人听书哪个软件好| **性色生活片久久毛片| 亚洲国产精品t66y| 91精品国产一区二区人妖| 亚洲一区二区三区在线看| 不卡av在线网| 亚洲一卡二卡三卡四卡五卡| 日韩理论电影院| 欧美成人激情免费网| 色久优优欧美色久优优| 国产精品白丝在线| 国产成人精品影院| 久草精品在线观看| 国产精品亚洲一区二区三区在线| 国产传媒一区在线| 欧美v日韩v国产v| 亚洲成年人影院| 全国精品久久少妇| 精品综合久久久久久8888| 欧美亚洲一区二区在线| 欧美一区二区成人| 亚洲bt欧美bt精品777| 91网站视频在线观看| 一本久久综合亚洲鲁鲁五月天 | 国产精品传媒在线| 国产精品66部| 久久久久久久综合色一本| 国产精品蜜臀av| 一区二区免费看| 久久99精品国产麻豆不卡| 欧美精品高清视频| 亚洲国产精品精华液ab| 激情综合色综合久久综合| 91精品久久久久久久91蜜桃| 午夜久久久久久久久| 懂色中文一区二区在线播放| 久久综合精品国产一区二区三区 | 色欧美片视频在线观看在线视频| 欧美国产日韩一二三区| jiyouzz国产精品久久| 欧美精品1区2区3区| 日日骚欧美日韩| 国产成人午夜99999| 久久精品视频在线看| 亚洲国产精品久久久久婷婷884 | 亚洲成a人v欧美综合天堂下载| 91啪亚洲精品| 亚洲综合色成人| 欧美日韩一二三区| 中文字幕中文字幕一区二区| 91在线观看一区二区| 欧美精三区欧美精三区| 青青草国产成人99久久| 欧美mv和日韩mv国产网站| 国产精品一区在线| 综合分类小说区另类春色亚洲小说欧美| av电影天堂一区二区在线| 亚洲欧美日韩电影| 成人综合婷婷国产精品久久免费| 中文字幕五月欧美| 欧美性受xxxx黑人xyx| 激情小说亚洲一区| 日韩一区二区三区观看| 亚洲一区二区视频在线观看| 91精品国产综合久久久蜜臀粉嫩| 国产中文一区二区三区| 国产精品美女久久久久久久久久久 | 日韩精品乱码免费| 国产亚洲欧美日韩在线一区| 色哟哟一区二区| 久久99国产乱子伦精品免费| 亚洲日本欧美天堂| 精品久久久久香蕉网| 色婷婷久久久亚洲一区二区三区| 美女视频黄频大全不卡视频在线播放| 欧美日韩大陆一区二区| 奇米一区二区三区av| 欧美国产综合一区二区| 51精品国自产在线| 成人综合在线观看| 麻豆精品视频在线观看视频| 亚洲欧美综合另类在线卡通| 日韩欧美国产1| 一本一本久久a久久精品综合麻豆| 久久精品国产亚洲a| 精品国产一区二区三区忘忧草| 开心九九激情九九欧美日韩精美视频电影 | 日本欧美大码aⅴ在线播放| 91论坛在线播放| 国产中文字幕一区| 亚洲超碰精品一区二区| 亚洲天天做日日做天天谢日日欢 | 91在线小视频| 国产美女娇喘av呻吟久久| 国产网站一区二区| 欧美成va人片在线观看| 欧美性大战久久久| 色综合婷婷久久| 午夜免费久久看| 亚洲免费观看高清完整版在线观看熊| 久久蜜臀精品av| 欧美一级日韩不卡播放免费| 欧美日韩你懂得| 91黄色免费观看| 99re热这里只有精品视频| 国产成人午夜精品影院观看视频 | 亚洲人成精品久久久久| 国产农村妇女精品| 欧美亚洲综合一区| 97久久精品人人爽人人爽蜜臀| 韩国欧美国产一区| 麻豆国产一区二区| 蜜桃视频一区二区| 青青草成人在线观看| 日韩精品五月天| 日本美女一区二区三区视频| 午夜视频在线观看一区二区| 亚洲一区在线电影| 香蕉久久夜色精品国产使用方法 | 午夜精品久久久久影视| 亚洲国产日韩综合久久精品| 亚洲美女一区二区三区| 亚洲精品一二三| 亚洲一区成人在线| 免费在线看成人av| 美日韩一级片在线观看| 精品一区二区三区av| 乱中年女人伦av一区二区| 国内精品国产三级国产a久久| 精品一区免费av| 国产69精品久久777的优势| 成人动漫av在线| 欧洲人成人精品| 国产sm精品调教视频网站| 国产精品99久久不卡二区| 成人精品亚洲人成在线| 在线视频你懂得一区| 欧美日韩国产影片| 欧美成人精品二区三区99精品| 精品电影一区二区三区 | 久久不见久久见免费视频7| 久久99热99| 成人av资源下载| 欧美色成人综合| 日韩精品一区二区三区蜜臀| 国产午夜亚洲精品羞羞网站| 亚洲精品免费电影| 精品一区二区三区免费播放| 波多野结衣欧美| 欧美猛男男办公室激情| 久久精品无码一区二区三区| 亚洲天堂精品在线观看| 日韩国产欧美视频| 成人手机在线视频| 欧美另类一区二区三区| 国产精品视频免费| 日韩精品电影在线| 成人精品鲁一区一区二区| 欧美日韩精品免费观看视频| 久久久久9999亚洲精品| 视频一区中文字幕国产| 成人午夜短视频| 日韩欧美不卡一区| 亚洲激情在线播放| 国产一区不卡在线| 欧美日本精品一区二区三区| 国产精品嫩草影院com| 美女一区二区三区| 欧美性色欧美a在线播放| 久久久国际精品| 日韩av一级电影| 91久久精品一区二区| 国产精品你懂的在线欣赏| 日本成人在线不卡视频| 色偷偷88欧美精品久久久| 久久精品欧美一区二区三区不卡 | 欧美三级午夜理伦三级中视频| 国产人久久人人人人爽| 麻豆一区二区99久久久久| 欧美亚洲综合网| 亚洲免费在线播放| 国产成人精品www牛牛影视| 日韩欧美你懂的| 亚洲午夜电影在线观看| 色综合久久中文字幕| 中文字幕国产一区| 国产乱妇无码大片在线观看| 精品国产网站在线观看| 免费高清在线视频一区·| 69精品人人人人| 天天操天天综合网| 欧美区一区二区三区| 一区二区成人在线观看| 一本色道久久综合亚洲aⅴ蜜桃|