我對面的同一篇文章來了,發現它相當有用的爲好。的公式來計算權重和偏移在它被給出:
Formula http://www.rastergrid.com/blog/wp-content/uploads/2010/09/equation.png
作者通過在帕斯卡三角使用第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";
}
對於任何人讀這篇文章,我終於摸索出自己的體重值,就像這樣: EXP( - (I * I)/(2 *西格瑪*西格瑪))/ (SQRT(2個*常量:: PI)*西格瑪); – Aequitas