Я должен реализовать MIRRORED_REPEAT для моих текстур трассировки лучей. Я посмотрел, как это определено в OpenGL https://www.khronos.org/registry/OpenGL/specs/gl/glspec46.core.pdf на странице 260, а затем попробовал сам, сначала с 1-мерным массивом. Поведение должно быть таким:
По сути, он повторяет индекс в массиве (по модулю), но отражает входные данные, основываясь на том, является ли смещение четным или нечетным. (2-е изображение ниже)
#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) Может кто-нибудь сказать мне, как я могу это сделатьправильно?