[菜鸟每天来段CUDA_C]GPU实现水波动画效果

本文利用GPU强大的计算能力生成不同时刻的水波图片,并使用OpenGL绘制,实现水波动画效果。其中几个时刻的截图如下:


生成一帧动画的代码为:

void generateFrame(DataBlock *d, int ticks)
{
	dim3 blocks(DIM/16, DIM/16);
	dim3 threads(16, 16);
	kernel<<<blocks, threads>>>(d->dev_bitmap, ticks);

	cutilSafeCall(cudaMemcpy(d->bitmap->get_ptr(), d->dev_bitmap, d->bitmap->image_size(), cudaMemcpyDeviceToHost));
}


并行计算一帧动画中每个像素的核函数如下:

__global__ void kernel(unsigned char* ptr, int ticks)
{
	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 = sqrtf(fx*fx + fy*fy);
	unsigned char gray = (unsigned char)(128.0f + 127.0f * cos(d/10.0f - ticks/7.0f) / (d/10.0f + 1.0f));

	ptr[offset*4 + 0] = gray;
	ptr[offset*4 + 1] = gray;
	ptr[offset*4 + 2] = gray;
	ptr[offset*4 + 3] = 255;
}


一帧动画图像有DIM*DIM个像素,一共启动了DIM/16*DIM/16个线程块,每个线程块包含一个16*16的线程数组。
水波的生成比较简单,主要代码为上文红色部分,不同时刻ticks值不一样,从而计算出来的函数值不一样,然后利用OpenGL绘制每一帧图像,得到动画效果。
完整代码链接:http://download.csdn.net/detail/jonny_super/6589461

























评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值