首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C/CUDA中3D旋转的问题

C/CUDA中3D旋转的问题
EN

Stack Overflow用户
提问于 2011-08-04 03:19:21
回答 1查看 565关注 0票数 0

我正在尝试使用C/CUDA为图像堆栈实现3D旋转例程(主要是为了加快计算时间)。我使用ImageJ源代码作为代码的基础,因此旋转不是围绕原点自由进行的,而是沿轴旋转。不过,我遇到了一个有趣的问题。我实现了一个绕Y轴旋转的对象,没有什么问题。但是,当我尝试绕X轴旋转时,使用非常相似的代码,就会出现问题。我注意到在X旋转中,有明显的条带化,如下例所示:

http://i.imgur.com/dkecs.png

这在我做的Y旋转中是不存在的。

我已经提供了CUDA内核,它们运行来围绕每个轴进行旋转(rotationY是工作的内核,rotationX是提供条带化的内核)。我想知道是否有人可以提供任何建议,为什么我会在一个而不是另一个上遇到问题,前提是它们在实现上非常相似。

编辑:我已经将问题范围缩小到atomicMin()不能正常工作。即使正确设置了所有偏移量,zbuffer仍未正确更改。如果有人知道这可能不起作用的原因,那就太好了。

代码语言:javascript
复制
__global__ void rotationY(int *input, int *projArray, int costheta, int sintheta, int width, int height, int depth, int xcenter, int zcenter,
int projectionwidth, int projectionsize, int *zbuffer, int adjCue, int depthCueSurf, int zmax, int zdiff){
int i=threadIdx.x + blockDim.x*blockIdx.x;
int zcostheta;
int zsintheta;
int offset;
int k, z, point, xnew, znew;
int y=i/width;
int x=i-y*width-xcenter;
int xcostheta = x*costheta;
int xsintheta = x*sintheta;
int offsetinit = y*projectionwidth;
zbuffer[i]=32767;
__syncthreads();
for(k=1; k<=depth; k++){
    z = (int)(k-1+.5) - zcenter;
    zcostheta = z*costheta;
    zsintheta = z*sintheta;
    point = i + (k-1)*width*height;
    if(input[point]>0){
        xnew = (xcostheta + zsintheta)/8192 + xcenter;
        znew = (zcostheta - xsintheta)/8192 + zcenter;
        offset = offsetinit + xnew;
        if (offset<0 || offset>=projectionsize) offset = 0;
        atomicMin(&zbuffer[offset],znew);
    }
    __syncthreads();
    if(input[point]>0){
        if(znew<=zbuffer[offset]) projArray[offset] = adjCue*input[point]/100+depthCueSurf*input[point]*(zmax-znew)/zdiff;
    }

}
}

__global__ void rotationX(int *input, int *projArray, int costheta, int sintheta, int width, int height, int depth, int ycenter, int zcenter,
int projectionsize, int *zbuffer, int adjCue, int depthCueSurf, int zmax, int zdiff)    {

int i=threadIdx.x + blockDim.x*blockIdx.x;
int zcostheta;
int zsintheta;
int offset;
int k, z, point, ynew, znew;
int y=i/width;
int x=i-y*width;
y=y-ycenter;
int ycostheta = y*costheta;
int ysintheta = y*sintheta;
zbuffer[i]=32767;
__syncthreads();
for(k=1; k<=depth; k++){
    z = (int)(k-1+.5) - zcenter;
    zcostheta = z*costheta;
    zsintheta = z*sintheta;
    point = i + (k-1)*width*height;
    if(input[point]>0){
        ynew = (ycostheta - zsintheta)/8192 + ycenter;
        znew = (ysintheta + zcostheta)/8192 + zcenter;
        offset = x + ynew*width;
        if (offset<0 || offset>=projectionsize) offset = 0;
        atomicMin(&zbuffer[offset], znew);
    }
    __syncthreads();
    if(input[point]>0){
        if(znew<=zbuffer[offset]) projArray[offset] = adjCue*input[point]/100+depthCueSurf*input[point]*(zmax-znew)/zdiff;
    }
}
}
EN

回答 1

Stack Overflow用户

发布于 2011-08-04 04:59:33

rotationX的函数原型中缺少参数projectionwidth。这是我现在解决错误的最好的候选者。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6932037

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档