有人可以告诉我这两个GLSL功能的Cpp等价物是什么吗? (首选组件解决方案)。
vec4 pack( float v ) {
vec4 enc = vec4(1.0, 255.0, 65025.0, 160581375.0) * v;
enc = fract(enc);
enc -= enc.yzww * vec4(1.0/255.0,1.0/255.0,1.0/255.0,0.0);
return enc;
}
float unpack( vec4 rgba ) {
return dot( rgba, vec4(1.0, 1/255.0, 1/65025.0, 1/160581375.0) );
}
答案 0 :(得分:1)
如果您知道所有内置函数的工作原理,那么这并不困难。 fract (...)
返回浮点数的小数部分,点积只是产品的分量总和。
yzww
混蛋,但这很容易实现:// C++ offers `modf (...)`, which does the same thing, but this is simpler.
float fract (float f) {
return f-(long)f;
}
void pack (float v, float* enc) {
enc [0] = fract (1.0f * v);
enc [1] = fract (255.0f * v);
enc [2] = fract (65025.0f * v);
enc [3] = fract (160581375.0f * v);
enc [0] -= enc [1] * 1.0f/255.0f;
enc [1] -= enc [2] * 1.0f/255.0f;
enc [2] -= enc [3] * 1.0f/255.0f;
return enc;
}
float unpack (const float* rgba) {
float dot = rgba [0] * 1.0f + rgba [1] * (1.0f / 255.0f) +
rgba [2] * (1.0f / 65025.0f) + rgba [3] * (1.0f / 160581375.0f);
return dot;
}
我冒昧地改变pack (...)
接受一个存储结果的数组,而不是在堆栈上返回一个数组。这是C中比较常见的做法,但如果你有一些C ++类用于存储4D向量,你可以返回它的实例。
如果使用GLM模板库,所有这些都可以变得更加简单。它在C ++中尽可能地反映了GLSL的类型和运算符。