gpt4 book ai didi

glsl - 基于可变权重计算线性高斯模糊的偏移量

转载 作者:行者123 更新时间:2023-12-05 06:47:13 33 4
gpt4 key购买 nike

我最近一直在研究通过使用线性采样方法而不是离散方法来优化高斯模糊着色器。

我读了一篇信息量很大的文章:

Efficient Gaussian Blur With Linear Sampling

In case of such a merge of two texels we have to adjust the coordinates that the distance of the determined coordinate from the texel #1 center should be equal to the weight of texel #2 divided by the sum of the two weights. In the same style, the distance of the determined coordinate from the texel #2 center should be equal to the weight of texel #1 divided by the sum of the two weights.

虽然我理解这背后的逻辑,但我不确定他们是如何得出具有给定权重的偏移量的数字的。谁愿意为我详细说明这一点,并解释一下,在给定统一权重变量的情况下,我们如何计算出正确的偏移量?

关于非硬编码偏移量,我找到了另一篇推荐计算偏移量的方法的帖子,但是没有针对可变数量的样本发布解决方案。我怎样才能做到这一点?

vec2 offsets[3];
offsets[0] = vec2(0.0, 0.0);

offsets[1] = vec2(dFdx(gl_TexCoord[0].s), dFdy(gl_TexCoord[0].t));

offsets[2] = offsets[1] + offsets[1];

Fragment Offset

最佳答案

我刚看到同一篇文章,发现它也非常有用。里面给出了权重和偏移量的计算公式:

Formula
(来源:rastergrid.com)

作者使用帕斯卡三角形中的第 12 行得出了权重。因此,例如第二个偏移量是通过以下方式计算的:

1.3846153846 = (1 * 792 + 2 * 495) / (792 + 495)

第二个权重的计算方式是:

0.1945945946 = (792 + 495) / 4070

我不确定你在给定统一权重变量的情况下计算偏移量是什么意思,但如果它有帮助,我在这篇文章的末尾包含了一个 C++ 程序,它输出 pascal 中任意行的偏移量和权重三角形。

如果我理解您关于非硬编码偏移量的问题,那么您希望能够在 GLSL 中即时计算偏移量?您可以通过移植下面的程序来做到这一点,但您仍然需要对二项式系数进行硬编码,或者同时计算它们。然而,这将是昂贵的,因为它必须为每个像素完成。我认为更好的替代方法是在 C(或您使用的任何编程语言)中预先计算偏移量和权重,然后将它们绑定(bind)到 GLSL 中的统一数组值。这是我的意思的 GLSL 片段:

    uniform float offset[5];
uniform float weight[5];"
uniform int numOffsets;

您需要将“5”替换为您计划使用的最大偏移量/权重数,并将 numOffsets 设置为您用于特定操作的数字。

这是输出权重和偏移量的程序。 “coeffs”应该替换为你想要在 pascal 表中的行的二项式系数。这里包括的是从第22行开始

#include <iostream>
#include <vector>

using namespace std;

int main(int argc, char* argv[])
{
float coeffs[] = { 705432, 646646, 497420, 319770, 170544, 74613, 26334, 7315, 1540, 231 };
double total = coeffs[0];
for (int i = 1; i < sizeof(coeffs) / sizeof(float); i++)
{
total += 2 * coeffs[i];
}
vector<float> offsets;
vector<float> weights;

offsets.push_back(0);
weights.push_back(coeffs[0] / total);

for (int i = 1; i <= (sizeof(coeffs) / sizeof(float) - 1) / 2; i++)
{
int index = (i - 1) * 2 + 1;
float weight = coeffs[index] + coeffs[index + 1];
offsets.push_back((coeffs[index] * index + coeffs[index + 1] * (index + 1)) / weight);
weights.push_back(weight / total);
}

for (int i = 0; i < offsets.size(); i++)
{
cout << offsets[i] << ", ";
}
cout << "\n";

for (int i = 0; i < weights.size(); i++)
{
cout << weights[i] << ", ";
}
cout << "\n";
}

关于glsl - 基于可变权重计算线性高斯模糊的偏移量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12296372/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com