kernel SpecificationMathsKernel : ImageComputationKernel<ePixelWise>
{
Image<eWrite, eAccessPoint> dst;
void define()
{
/// Math functions cannot be used when providing params default values.
}
local:
float4 local1;
float local2;
void init() {
/// Math functions can be used to initialise locals in init().
local1 = float4(cos(sin(float4(3.0f))));
local2 = acos(asin(0.5f));
}
void MathFunctionsExample() {
SampleType(dst) pixel = SampleType(dst)(0.5f);
/// The following math functions are defined on both scalar and vector float types.
/// i.e. float, float1, float2, float3 and float4.
/// On vectors the math function is applied to each component element-wise
/// For example: sin(float2(1.0f, 2.0f)) is equivalent to float2(sin(1.0f), sin(2.0f)).
/// When a function takes multiple arguments the same logic is applied to each argument element-wise.
/// Trigonometric functions:
// floatn sin(floatn a);
pixel = sin(pixel);
// floatn cos(floatn a);
pixel = cos(pixel);
// floatn tan(floatn a);
pixel = tan(pixel);
// floatn asin(floatn a);
pixel = asin(pixel);
// floatn acos(floatn a);
pixel = acos(pixel);
// floatn atan(floatn a);
pixel = atan(pixel);
// floatn atan2(floatn a, floatn b);
pixel = atan2(pixel, pixel);
/// Logarithmic, exponential and power functions:
// floatn exp(floatn x);
// Returns the natural exponent, e^x.
pixel = exp(pixel);
// floatn log(floatn x);
// Returns the natural log, log x of base e.
pixel = log(pixel);
// floatn log2(floatn x);
// Returns the log x of base 2.
pixel = log2(pixel);
// floatn log10(floatn x);
// Returns the log x of base 10.
pixel = log10(pixel);
// floatn pow(floatn x, floatn a);
// Returns x^a.
pixel = pow(pixel, pixel);
// floatn sqrt(floatn x);
// Returns the positive square root of x.
pixel = sqrt(pixel);
// floatn rsqrt(floatn x);
// Returns the inverse square root of x, i.e. 1.0f/sqrt(x).
pixel = rsqrt(pixel + 1.0f);
/// Rounding functions:
// floatn floor(floatn x);
// Returns x rounded to an integer towards negative infinity.
pixel = floor(pixel);
// floatn ceil(floatn x);
// Returns x rounded to an integer towards positive infinity.
pixel = ceil(pixel);
/// Absolute and sign functions:
// floatn fabs(floatn x);
// Returns the absolute value of x.
pixel = fabs(pixel);
// floatn sign(floatn x);
// Returns the value of the sign bit of x i.e. 1.0f for positive values,
// -1.0f for negative values and 0.0f for +/-0.0f.
pixel = sign(pixel);
/// Remainder functions:
// floatn fmod(floatn x, floatn y);
// Returns the floating point remainder of the division of x / y.
pixel = fmod(pixel, SampleType(dst)(0.5f));
/// Clamping functions:
// floatn min(floatn x, floatn y);
pixel = min(pixel, SampleType(dst)(0.5f));
// floatn max(floatn x, floatn y);
pixel = max(pixel, SampleType(dst)(0.5f));
// floatn clamp(floatn x, floatn y, floatn z);
pixel = clamp(pixel, SampleType(dst)(0.0f), SampleType(dst)(1.0f));
/// Special cases:
/// These functions don't follow the standard pattern on vectors like the above functions, but instead compute something bespoke.
// float dot(floatn x, floatn y);
// Returns the dot product of x dot y.
float dotProduct = dot(pixel, pixel);
// float3 cross(float3 x, float3 y);
// Returns the cross product of x cross y.
float3 crossProduct = cross(float3(1.0f, 2.0f, 3.0f), float3(4.0f, 5.0f, 6.0f));
// int length(floatn x);
// Returns the number of elements in a vector i.e. length(float2(1.0f, 2.0f)) -> 2
int len = length(pixel);
// floatn normalize(floatn x);
// Returns the L2-Norm of x.
pixel = normalize(pixel);
// float median(float data[], int size);
// Returns the median value in an array of data of length size.
float arr[6] = {1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f};
float med = median(arr, 6);
dst() = pixel;
}
void process(int2 pos) {
MathFunctionsExample();
}
};