[菜鳥每天來段CUDA_C]GPU實現水波動畫效果
阿新 • • 發佈:2019-02-20
本文利用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