首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在OpenCL代码中使用clamp函数

在OpenCL代码中使用clamp函数
EN

Stack Overflow用户
提问于 2012-08-16 18:23:14
回答 4查看 3.4K关注 0票数 2

在我的OpenCL代码(不是我自己写的,它只是一个来自互联网的示例代码)中,有下面的一句话来使用夹具的功能。

代码语言:javascript
复制
return clamp(color,0,1);

然而,这似乎会在编译过程中出错,所以我通过使用来自clGetProgramBuildInfo的CL_PROGRAM_BUILD_LOG得到了错误信息消息。

代码语言:javascript
复制
Error during compilation! (-11)
4483
build log
:211:9: error: call to 'clamp' is ambiguous
        return clamp(color,0,1);
               ^~~~~
<built-in>:3558:26: note: candidate function
float4  __OVERLOADABLE__ clamp(float4 x, float min, float max)   ;
                         ^
<built-in>:3577:25: note: candidate function
float4 __OVERLOADABLE__ clamp(float4, float4, float4);
                        ^
<built-in>:3556:26: note: candidate function
float3  __OVERLOADABLE__ clamp(float3 x, float min, float max)   ;
                         ^
<built-in>:3575:25: note: candidate function
float3 __OVERLOADABLE__ clamp(float3, float3, float3);
                        ^
:296:52: error: address expression must be an lvalue or a function designator
                                r.origin = matrixVectorMultiply(viewTransform, &(float3)(0, 0, -1));
                                                                               ^~~~~~~~~~~~~~~~~~
:297:62: error: address expression must be an lvalue or a function designator
                                r.dir    = normalize(matrixVectorMultiply(viewTransform, &(float3)(x, y, 0)) - r.origin);
                                                                                         ^~~~~~~~~~~~~~~~~

在OpenCL代码中使用clamp函数有没有必要的关键字?顺便说一句,我使用的环境是Linux Ubuntu 10.04 64位。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-08-16 18:56:03

请尝试以下操作

代码语言:javascript
复制
return clamp(color,0.0f,1.0f);

这样,我们就可以确定第二个和第三个参数没有歧义,并且您正在尝试调用该函数:

代码语言:javascript
复制
clamp(float4 color, float min, float max);

如果这不起作用,那么看看你的颜色参数,但是第二个和第三个参数现在应该没问题了。

票数 5
EN

Stack Overflow用户

发布于 2012-08-17 19:56:48

OpenCL中有几个重载的clamp内置函数;编译器需要根据参数的类型选择一个。有效的组合包括

代码语言:javascript
复制
T clamp(T,T,T) and T clamp(T,S,S)

其中,T是OpenCL整型或浮点型之一,当T是向量类型时,S是T的元素的标量类型。

看起来您的示例代码非法地将浮点数和整数参数混合到调用中。与float类型的0.0f和1.0f不同,常量1和0属于int类型。

有关更多详细信息,请参阅quick reference card

票数 2
EN

Stack Overflow用户

发布于 2013-12-14 19:49:05

我在同一段代码(http://www.gamedev.net/blog/1241/entry-2254210-realtime-raytracing-with-opencl-ii/)上遇到了同样的问题。它写得很糟糕,并设法挂起了我的电脑。

通过确保最后两个参数是浮点型,clamp()问题确实得到了修复。

通过更改该函数的签名,可以修复matrixVectorMultiply()问题。它最初是:

代码语言:javascript
复制
float3 matrixVectorMultiply(__global float* matrix, float3* vector){ 
    float3 result;
    result.x = matrix[0]*((*vector).x)+matrix[4]*((*vector).y)+matrix[8]*((*vector).z)+matrix[12];
    result.y = matrix[1]*((*vector).x)+matrix[5]*((*vector).y)+matrix[9]*((*vector).z)+matrix[13];
    result.z = matrix[2]*((*vector).x)+matrix[6]*((*vector).y)+matrix[10]*((*vector).z)+matrix[14];
    return result;
}

但是,向量绝对没有理由成为指针,所以您可以在每次出现vector之前删除*

然后代码应该会编译,但程序可能仍然会崩溃。

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

https://stackoverflow.com/questions/11985173

复制
相关文章

相似问题

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