我应该为我的光线追踪纹理实现 MIRRORED_REPEAT。我查看了它在 OpenGL 中的定义 https://www.khronos.org/registry/OpenGL/specs/gl/glspec46.core.pdf第 260 页,然后我自己尝试了,首先是一个一维数组。行为应该是:
基本上它会将索引重复到数组中(取模),但会根据偏移量是偶数还是奇数来镜像输入。 (下图二)
#include <iostream>
int main() {
int values[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
const auto mod = [](const int a, const int n) noexcept
{
return (a % n + n) % n;
};
const auto mirror = [](const int a) noexcept
{
return a >= 0.f ? a : -(1 + a);
};
const auto mirrored_repeat = [&](const int x) noexcept {
return (10 - 1) - mirror(mod(x, 2 * 10)) - 10;
};
for(int i = -5; i < 6; ++i) {
std::cout << values[mirrored_repeat(i)] << std::endl;
}
}
但是这不起作用,但给了我很好的未定义行为输出 x) 有人能告诉我如何正确地做到这一点吗?
最佳答案
如果换行
std::cout << values[mirrored_repeat(i)] << std::endl;
与
std::cout << mirrored_repeat(i) << std::endl;
您会看到 mirrored_repeat
返回的索引显然是错误的(它们首先是负数)。
我认为规范中的公式有点错误,因为它有一个不匹配的括号。如果我们重写这一行
return (10 - 1) - mirror(mod(x, 2 * 10)) - 10;
像这样
return (10 - 1) - mirror(mod(x, 2 * 10) - 10);
代码开始产生更合理的东西。
关于c++ - 实现类似 OpenGl 的 MIRRORED_REPEAT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59287642/