public static void Sobel(cudaTextureObject_t texObj, float[] output, int width, int height) //make output to be a surface { for (int i = threadIdx.y + blockIdx.y * blockDim.y; i < height; i += blockDim.y * gridDim.y) { for (int j = threadIdx.x + blockIdx.x * blockDim.x; j < width; j += blockDim.x * gridDim.x) { int pixelId = i * width + j; if (i != 0 && j != 0 && i != height - 1 && j != width - 1) { float tl = TextureHelpers.tex2D(texObj, j - 1.0F, i - 1.0F); float t = TextureHelpers.tex2D(texObj, j - 1.0F, i); float tr = TextureHelpers.tex2D(texObj, j - 1.0F, i + 1.0F); float l = TextureHelpers.tex2D(texObj, j, i - 1.0F); float r = TextureHelpers.tex2D(texObj, j, i + 1.0F); float br = TextureHelpers.tex2D(texObj, j + 1.0F, i + 1.0F); float bl = TextureHelpers.tex2D(texObj, j + 1.0F, i - 1.0F); float b = TextureHelpers.tex2D(texObj, j + 1.0F, i); float data = (Math.Abs((tl + 2.0F * l + bl - tr - 2.0F * r - br)) + Math.Abs((tl + 2.0F * t + tr - bl - 2.0F * b - br))); if (data > 255) { data = 255; } output[pixelId] = data; } else { output[pixelId] = 0; } } } }
public static void Sobel(cudaTextureObject_t texObj, cudaSurfaceObject_t surfObj, int width, int height) { for (int i = threadIdx.y + blockIdx.y * blockDim.y; i < height; i += blockDim.y * gridDim.y) { for (int j = threadIdx.x + blockIdx.x * blockDim.x; j < width; j += blockDim.x * gridDim.x) { int pixelId = i * width + j; if (i != 0 && j != 0 && i != height - 1 && j != width - 1) { float tl = TextureHelpers.tex2D(texObj, j - 1.0F, i - 1.0F); float t = TextureHelpers.tex2D(texObj, j - 1.0F, i); float tr = TextureHelpers.tex2D(texObj, j - 1.0F, i + 1.0F); float l = TextureHelpers.tex2D(texObj, j, i - 1.0F); float r = TextureHelpers.tex2D(texObj, j, i + 1.0F); float br = TextureHelpers.tex2D(texObj, j + 1.0F, i + 1.0F); float bl = TextureHelpers.tex2D(texObj, j + 1.0F, i - 1.0F); float b = TextureHelpers.tex2D(texObj, j + 1.0F, i); float data = (Math.Abs((tl + 2.0F * l + bl - tr - 2.0F * r - br)) + Math.Abs((tl + 2.0F * t + tr - bl - 2.0F * b - br))); if (data > 255) { data = 255; } TextureHelpers.surf2Dwrite(data, surfObj, j * sizeof(float), i); } else { TextureHelpers.surf2Dwrite(0.0F, surfObj, j * sizeof(float), i); } } } }
public static void Sobel(cudaTextureObject_t texObj, cudaSurfaceObject_t surfObj, int width, int height) { float ii, jj; for (int i = threadIdx.y + blockIdx.y * blockDim.y; i < height; i += blockDim.y * gridDim.y) { ii = (float)i; for (int j = threadIdx.x + blockIdx.x * blockDim.x; j < width; j += blockDim.x * gridDim.x) { if (i != 0 && j != 0 && i != height - 1 && j != width - 1) { jj = (float)j; float tl = TextureHelpers.tex2D(texObj, jj - 1.0F, ii - 1.0F); float t = TextureHelpers.tex2D(texObj, jj - 1.0F, ii); float tr = TextureHelpers.tex2D(texObj, jj - 1.0F, ii + 1.0F); float l = TextureHelpers.tex2D(texObj, jj, ii - 1.0F); float r = TextureHelpers.tex2D(texObj, jj, ii + 1.0F); float br = TextureHelpers.tex2D(texObj, jj + 1.0F, ii + 1.0F); float bl = TextureHelpers.tex2D(texObj, jj + 1.0F, ii - 1.0F); float b = TextureHelpers.tex2D(texObj, jj + 1.0F, ii); float data = fabsf((tl + 2.0F * l + bl - tr - 2.0F * r - br)) + fabsf((tl + 2.0F * t + tr - bl - 2.0F * b - br)); if (data > 255.0F) { data = 255.0F; } TextureHelpers.surf2Dwrite(data, surfObj, j * sizeof(int), i); } else { TextureHelpers.surf2Dwrite(0.0F, surfObj, j * sizeof(int), i); } } } }
public static float tex2D(cudaTextureObject_t texObj, float x, float y) { return(0.0F); }