天天看點

[菜鳥每天來段CUDA_C]GPU實作水波動畫效果

本文利用GPU強大的計算能力生成不同時刻的水波圖檔,并使用OpenGL繪制,實作水波動畫效果。其中幾個時刻的截圖如下:

[菜鳥每天來段CUDA_C]GPU實作水波動畫效果

生成一幀動畫的代碼為:

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

繼續閱讀