我最近一直在研究使用线性采样方法而不是离散方法来优化高斯模糊着色器。
我读了一篇内容非常丰富的文章:
Efficient Gaussian Blur With Linear Sampling
在两个纹素的这种合并的情况下,我们必须调整坐标,使得所确定的坐标与纹素#1中心的距离应该等于纹素#2的权重除以两个权重的总和。在相同的样式中,确定的坐标与纹素#2中心的距离应等于纹素#1的权重除以两个权重的总和。
虽然我理解这背后的逻辑,但我不确定他们是如何得到给定权重的偏移数字的。是否有人会对我有更多的了解,并解释如何在给定均匀权重变量的情况下计算正确的偏移量?
关于非硬编码偏移,我发现另一篇文章推荐了一种计算偏移的方法,但没有针对可变数量的样本发布解决方案。我怎么能做到这一点?
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];
答案 0 :(得分:1)
我刚刚看到同一篇文章,发现它也非常有用。计算权重和偏移的公式如下:
Formula http://www.rastergrid.com/blog/wp-content/uploads/2010/09/equation.png
作者通过使用pascal三角形中的第12行来达到权重。因此,例如,第二个偏移量由以下公式计算:
1.3846153846 = (1 * 792 + 2 * 495) / (792 + 495)
第二个体重按下式计算:
0.1945945946 = (792 + 495) / 4070
我不确定你的意思是通过计算给定均匀权重变量的偏移但是如果它有帮助我在这篇文章的末尾包含了一个C ++程序,它输出了pascal中任意行的偏移量和权重三角形。
如果我理解您关于非硬编码偏移的问题,那么您希望能够在GLSL中动态计算偏移量吗?你可以通过移植下面的程序来做到这一点,但你仍然需要对二项式系数进行硬编码,或者同时计算那些。然而,这将是昂贵的,因为必须对每个像素进行。我认为更好的选择是预先计算C(或您正在使用的任何编程语言)中的偏移和权重,然后将它们绑定到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";
}