Реализовать OpenGl-подобный MIRRORED_REPEAT - PullRequest
0 голосов
/ 11 декабря 2019

Я должен реализовать MIRRORED_REPEAT для моих текстур трассировки лучей. Я посмотрел, как это определено в OpenGL https://www.khronos.org/registry/OpenGL/specs/gl/glspec46.core.pdf на странице 260, а затем попробовал сам, сначала с 1-мерным массивом. Поведение должно быть таким: returns x

По сути, он повторяет индекс в массиве (по модулю), но отражает входные данные, основываясь на том, является ли смещение четным или нечетным. (2-е изображение ниже) enter image description here

#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) Может кто-нибудь сказать мне, как я могу это сделатьправильно?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...