在GPU上使用线程实现波纹效果
2012-06-14 23:17
471 查看
#include "cuda.h"
#include "book.h"
#include "cpu_anim.h"
#define DIM 1024
#define PI 3.1415926
struct DataBlock
{
unsigned char *dev_bitmap;
CPUAnimBitmap *bitmap;
};
//释放在GPU上分配的内存
void cleanup(DataBlock *d)
{
cudaFree(d->dev_bitmap);
}
__global__ void kernel(unsigned char *ptr,int ticks)
{
//将threadIdx/BlockIdx映射到像素位置
int x=threadIdx.x+blockIdx.x*blockDim.x;
int y=threadIdx.y+blockIdx.y*blockDim.y;
int offset=x+y*blockDim.x*gridDim.x;
//计算当前位置上的值
float fx=x-DIM/2;
float fy=y-DIM/2;
float d=sqrt(fx*fx+fy*fy);
unsigned char grey=(unsigned char)(128.0f+127.0f*cos(d/10.0f-ticks/7.0f)/(d/10.0f+1.0f));
ptr[offset*4+0]=grey;
ptr[offset*4+1]=grey;
ptr[offset*4+2]=grey;
ptr[offset*4+3]=255;
}
void generate_frame(DataBlock *d,int ticks)
{
dim3 blocks(DIM/16,DIM/16);
dim3 threads(16,16);
kernel<<<blocks,threads>>>(d->dev_bitmap,ticks);
HANDLE_ERROR(cudaMemcpy(d->bitmap->get_ptr(),d->dev_bitmap,d->bitmap->image_size(),cudaMemcpyDeviceToHost));
}
int main(void)
{
DataBlock data;
CPUAnimBitmap bitmap(DIM,DIM,&data);
data.bitmap=&bitmap;
HANDLE_ERROR(cudaMalloc((void**)&data.dev_bitmap,bitmap.image_size()));
bitmap.anim_and_exit((void(*)(void*,int))generate_frame,(void(*)(void*))cleanup);
}
#include "book.h"
#include "cpu_anim.h"
#define DIM 1024
#define PI 3.1415926
struct DataBlock
{
unsigned char *dev_bitmap;
CPUAnimBitmap *bitmap;
};
//释放在GPU上分配的内存
void cleanup(DataBlock *d)
{
cudaFree(d->dev_bitmap);
}
__global__ void kernel(unsigned char *ptr,int ticks)
{
//将threadIdx/BlockIdx映射到像素位置
int x=threadIdx.x+blockIdx.x*blockDim.x;
int y=threadIdx.y+blockIdx.y*blockDim.y;
int offset=x+y*blockDim.x*gridDim.x;
//计算当前位置上的值
float fx=x-DIM/2;
float fy=y-DIM/2;
float d=sqrt(fx*fx+fy*fy);
unsigned char grey=(unsigned char)(128.0f+127.0f*cos(d/10.0f-ticks/7.0f)/(d/10.0f+1.0f));
ptr[offset*4+0]=grey;
ptr[offset*4+1]=grey;
ptr[offset*4+2]=grey;
ptr[offset*4+3]=255;
}
void generate_frame(DataBlock *d,int ticks)
{
dim3 blocks(DIM/16,DIM/16);
dim3 threads(16,16);
kernel<<<blocks,threads>>>(d->dev_bitmap,ticks);
HANDLE_ERROR(cudaMemcpy(d->bitmap->get_ptr(),d->dev_bitmap,d->bitmap->image_size(),cudaMemcpyDeviceToHost));
}
int main(void)
{
DataBlock data;
CPUAnimBitmap bitmap(DIM,DIM,&data);
data.bitmap=&bitmap;
HANDLE_ERROR(cudaMalloc((void**)&data.dev_bitmap,bitmap.image_size()));
bitmap.anim_and_exit((void(*)(void*,int))generate_frame,(void(*)(void*))cleanup);
}
相关文章推荐
- 浪起来!使用 drawBitmapMesh 实现仿真水波纹效果
- 使用CSS实现按钮点击波纹效果
- 使用CSS实现按钮点击波纹效果
- Android学习之使用贝塞尔曲线实现波纹效果
- iOS --- 使用GPUImage实现的简单滤镜效果
- 举例说明如何实现使用线程来实现UC浏览器的等待页面的效果
- 使用 drawBitmapMesh 实现仿真水波纹效果
- 《GPU高性能编程CUDA实战》—— 《笔记一》——使用线程实现GPU上的矢量求和
- 使用GPUImage实现图片的毛玻璃效果
- java学习——如何实现线程之间的通信 ,Condition 的使用
- 使用ActionScript实现滤镜效果
- unity使用线程做一个心跳的效果
- XZ_iOS之使用webView实现开机动画效果
- 使用自定义RadioButton和ViewPager实现TabHost效果和带滑动的页卡效果。
- Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面
- Android 使用开源库StickyGridHeaders来实现带sections和headers的GridView显示本地图片效果
- 使用jquery animate实现锚点慢慢平滑滚动效果
- Android自定义组件系列【14】——Android5.0按钮波纹效果实现
- Android异步机制一:使用Thread+Handler实现非UI线程更新UI界面
- ThreadLocal实现方式&使用介绍—无锁化线程封闭