c++ - 实现类似 OpenGl 的 MIRRORED_REPEAT

标签 c++ indexing

我应该为我的光线追踪纹理实现 MIRRORED_REPEAT。我查看了它在 OpenGL 中的定义 https://www.khronos.org/registry/OpenGL/specs/gl/glspec46.core.pdf第 260 页,然后我自己尝试了,首先是一个一维数组。行为应该是:returns x

基本上它会将索引重复到数组中(取模),但会根据偏移量是偶数还是奇数来镜像输入。 (下图二) 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) 有人能告诉我如何正确地做到这一点吗?

最佳答案

如果换行

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/

相关文章:

c++ -/d2vzeroupper MSVC 编译器优化标志在做什么?

c++ - 使按值常量传递的参数有什么意义?

C++ 指向 const 指针的 const 数组的指针

R:具有重复时间索引条目的时间序列

c - 如何用随机数填充数组以使它们不同?

为查询设置的 mysql 索引

c++ - 这不是垂头丧气吗?

c++ - 调整 C++ std/boost iostreams 以提供对内存块的循环写入

sql-server - SQL Server - 缺少索引 - 什么会使用索引?

python-3.x - 为什么 'reset_index(drop=True)' 函数会意外删除列?