C ++相当于这个GLSL函数

时间:2015-03-09 18:10:08

标签: c++ glsl

有人可以告诉我这两个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) );
}

来源:Source of the code above

1 个答案:

答案 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的类型和运算符。