小编whn*_*whn的帖子

什么是vulkan的"推力常数"?

我查看了一堆关于推送常量的教程,暗示可能的好处,但我从未见过,即使在Vulkan文档中,实际上是什么"推动常数"......我不明白他们应该是什么,以及推动常数的目的是什么.我能找到的最接近的是这篇文章,遗憾的是它不会问它们是什么,但是它们和另一个概念之间有什么不同,并没有帮助我.

什么是推动常数,它为什么存在以及它用于什么?它的名字来自哪里?

vulkan

18
推荐指数
1
解决办法
5006
查看次数

在Cubic Bezier曲线上找到Y给定的X?

我需要一种方法,允许我在给定x坐标的情况下在Cubic Bezier曲线上找到Y坐标.

我遇到很多地方告诉我把它当作一个立方函数然后试图找到根,我明白了.然而,对于Cubic Bezier曲线的等式是(对于x-coords):

X(t) = (1-t)^3 * X0 + 3*(1-t)^2 * t * X1 + 3*(1-t) * t^2 * X2 + t^3 * X3

令我困惑的是增加了(1-t)价值观.例如,如果我用一些随机数填写X值:

400 = (1-t)^3 * 100 + 3*(1-t)^2 * t * 600 + 3*(1-t) * t^2 * 800 + t^3 * 800

然后重新安排它:

800t^3 + 3*(1-t)*800t^2 + 3*(1-t)^2*600t + (1-t)^3*100 -400 = 0

我仍然不知道(1-t)系数的值.我怎么样我(1-t)还是应该解决这个方程仍然未知?

c++ bezier curve cubic

12
推荐指数
2
解决办法
5874
查看次数

为什么C++默认不移动构造rvalue引用?

说我有以下功能

void doWork(Widget && param)  // param is an LVALUE of RRef type
{
    Widget store = std::move(param); 
}
Run Code Online (Sandbox Code Playgroud)

为什么我需要param回到rvalue std::move()?是不是很明显,paramrvalue 的类型是因为它在函数签名中被声明为右值引用?不应该仅仅根据这个原则自动调用移动构造函数吗?

为什么不默认发生这种情况?

c++ rvalue-reference move-constructor lvalue-to-rvalue stdmove

12
推荐指数
1
解决办法
953
查看次数

是否有任何理由将C++ 11+ std :: mutex声明为全局变量而不是作为函数参数传递给std :: thread?

我见过大多数使用std::mutex互斥体是全局的例子.我想知道为什么这样做有什么具体的原因?我有自己的程序,我不这样做,只是将互斥量作为一个std::thread std::ref.拥有全局变量不是不好的做法,std::mutexes如果没有语言限制理由这样做,那么C++中全局背后的理性是什么?

c++ multithreading mutex stdthread stdmutex

8
推荐指数
1
解决办法
2647
查看次数

使用 Ranges-V3 移除标记为移除的元素

我有两个向量:

struct MyData{
     double value; 
};
std::vector<int> remove_flags = {0, 1, 0, 0, 0, 0, 1, 0};
std::vector<MyData> data =      {{},{},{},{},{},{},{},{}}; 
Run Code Online (Sandbox Code Playgroud)

remove_flags向量包含一个大小与 完全相同的标志数组data,每个标志要么是 0,要么是 1,其中 1 表示应删除数据。

我想用来remove_flagsdata原地删除元素,即执行擦除删除习语,但根据remove_flags. 最终结果应该是data删除了元素,并希望删除remove_flags了那些相同的元素。

手动执行此操作很烦人,我想为此使用 Range-v3。我目前正在使用 C++17。

在查看文档后,我认为我没有找到解决方案,我能想到的最接近的事情是:

auto result = ranges::views::zip(remove_flags, data) | ranges::actions::remove_if([](std::pair<const int&, const MyData&> pair){
    return pair.first != 0;
});

remove_flags.erase(result.first, remove_flags.end());
data.erase(result.second, data.end());
Run Code Online (Sandbox Code Playgroud)

但是操作无法对视图 zip 进行操作,因此无法编译。如果我切换ranges::actions::remove_ifranges::views::remove_if一个奇怪的视图对象被返回,大概是一个没有实际std::remove对两个向量执行等效操作的对象。

可以使用,contaner_to …

c++ erase-remove-idiom range-v3 c++17

7
推荐指数
1
解决办法
195
查看次数

如何使用python从OpenCV 3中的持久XML/YAML文件读取/写入矩阵?

我一直在尝试使用anaconda的当前cv2(我认为实际上是OpenCV 3.x)读取和写入矩阵到持久文件存储(例如XML ).我在网上查看了解决方案,人们参考了这样的事情:

object = cv2.cv.Load(file)
object = cv2.cv.Save(file)
Run Code Online (Sandbox Code Playgroud)

来源.这对当前的anaconda python不起作用cv2.人们提出像这样的例子的解决方案,但我很困惑为什么这个简单的功能需要这么多锅炉板代码,我不认为这是一个可接受的解决方案.我想要一些像旧解决方案一样简单的东西.

python xml persistence opencv opencv3.0

6
推荐指数
1
解决办法
5982
查看次数

为什么从Mersenne twister切换到Gradient Noise Generator中的其他PRNG会产生不良结果?

我一直在尝试创建一个广义的渐变噪声生成器(它不使用散列方法来获得渐变).代码如下:

class GradientNoise {
    std::uint64_t m_seed;
    std::uniform_int_distribution<std::uint8_t> distribution;
    const std::array<glm::vec2, 4> vector_choice = {glm::vec2(1.0, 1.0), glm::vec2(-1.0, 1.0), glm::vec2(1.0, -1.0),
                                                    glm::vec2(-1.0, -1.0)};

public:
    GradientNoise(uint64_t seed) {
        m_seed = seed;
        distribution = std::uniform_int_distribution<std::uint8_t>(0, 3);
    }

    // 0 -> 1
    // just passes the value through, origionally was perlin noise activation
    double nonLinearActivationFunction(double value) {
        //return value * value * value * (value * (value * 6.0 - 15.0) + 10.0);
        return value;
    }

    // 0 -> 1
    //cosine interpolation
    double interpolate(double a, …
Run Code Online (Sandbox Code Playgroud)

c++ random procedural-generation noise perlin-noise

5
推荐指数
1
解决办法
521
查看次数

如何创建自定义 Murmur Avalanche 混合器?

我正在尝试使用 Avalanche 混合器来散列整数坐标。我一直在使用Murmur3 的32 位和 64 位雪崩混合器来执行此操作(而不是实际的总哈希函数)。对于我的应用程序,不需要整个哈希函数,只需要此处看到的 Avalanche Mixer:

uint32_t murmurmix32( uint32_t h )
{
  h ^= h >> 16;
  h *= 0x85ebca6b;
  h ^= h >> 13;
  h *= 0xc2b2ae35;
  h ^= h >> 16;

  return h;
}


uint64_t murmurmix64( uint64_t h )
{
  h ^= h >> 33;
  h *= 0xff51afd7ed558ccdULL;
  h ^= h >> 33;
  h *= 0xc4ceb9fe1a85ec53ULL;
  h ^= h >> 33;

  return h;
}
Run Code Online (Sandbox Code Playgroud)

这些在我的机器上出现得很快,我将两个 uint32_t 混合到这些函数中以产生雪崩的结果,这会产生我喜欢的伪随机分布。

我想向这个系统引入更多坐标(即 z 和 w),所以我想使用更大的雪崩混合器来散列我的坐标。我相信出于我的目的,我希望看到函数本身产生的最大值是 uint64_t,碰撞本身不是问题,但结果的随机性是问题。

murmur3 …

c++ random hash murmurhash

5
推荐指数
1
解决办法
881
查看次数

什么意味着DX12具有异构多GPU支持而Vulkan不支持?

我一直在研究使用vulkan来利用集成图形和独立图形功能的计算功能.但是,根据这篇文章,尽管通过兼容的SLI配置提供了多GPU支持,但Vulkan没有异构的多GPU支持.同一篇文章继续声称DX12确实有这种支持,"更进一步".

在我的应用程序中,我想利用两个独立设备的计算功能,这两个设备没有SLI/Xfire兼容性,但也不一定在同一计算工作负载上工作,不需要在每个设备之间共享内存来计算其工作负载.

我是不是可以让两个设备在同一个实例中做两个不同的事情,如果有必要,先通过复制到主机共享内存?这个答案似乎意味着实际上可以做到这一点,所以我很困惑异构的多GPU实际上对DX12意味着什么,以及它与我在Vulkan中可以做的有什么不同.

directx graphics gpgpu vulkan directx-12

5
推荐指数
0
解决办法
424
查看次数

glVertexAttribDivisor和glVertexBindingDivisor有什么区别?

我一直在寻找将属性与任意组的顶点相关联的方法,起初,实例化似乎是实现此目的的唯一方法,但是后来我迷迷糊糊地问了这个问题这个答案指出:

但是,使用较新版本的OpenGL可能会设置某个顶点属性的缓冲区偏移增加的速率。有效地,这意味着给定顶点数组的数据在属性的缓冲区偏移量增加之前被复制到n个顶点。设置该除数的函数是glVertexBindingDivisor

(强调我的)

在我看来,这似乎是答案在断言,我可以划分顶点数而不是实例数。但是,当我查看glVertexBindingDivisor的文档并将其与进行比较时,glVertexAttribDivisor它们似乎都指发生在实例而非顶点上的划分。例如,在glVertexBindingDivisor的文档中指出:

glVertexBindingDivisor和glVertexArrayBindingDivisor修改在单个draw命令中渲染图元的多个实例时通用顶点属性前进的速率。如果除数为零,则使用绑定到bindingindex的缓冲区的属性每个顶点前进一次。如果除数不为零,则属性在每个要渲染的顶点集的除数实例中前进一次。如果相应的除数值不为零,则将该属性称为实例

(强调我的)

那么这两个功能之间的实际区别是什么?

opengl vertex-buffer vertex opengl-4 vertex-attributes

5
推荐指数
2
解决办法
1183
查看次数