জিএলএসএল - এক-পাস গাউসি অস্পষ্টতা


18

ওয়ান-পাস গাউসিয়ান ব্লার করার জন্য টুকরা শ্যাডার প্রয়োগ করা সম্ভব? আমি দ্বি-পাসের অস্পষ্টতা (গাউসিয়ান এবং বক্স ব্লার) এর প্রচুর বাস্তবায়ন পেয়েছি:

ইত্যাদি।

আমি গাউসিয়ান ব্লারকে কনভলিউশন হিসাবে বাস্তবায়নের কথা ভাবছিলাম (বাস্তবে এটি কনভলিউশন, উপরের উদাহরণগুলি কেবলমাত্র আপ্রক্সিমেশন):

http://en.wikipedia.org/wiki/Gaussian_blur

উত্তর:


33

হ্যাঁ, আপনি কার্নেলের সমস্ত n ^ 2 পিক্সেল (কার্নেলের প্রস্থ এন এর জন্য) নমুনা তৈরি করে এক পাসে গাউসিয়ান ব্লার প্রয়োগ করতে পারেন । এটি দুটি পাসে সারি এবং কলামগুলিতে চালানো সাধারণত দ্রুততর হয়, তারপরে আপনার ও (এন ^ 2) এর চেয়ে নমুনায় ও (এন) পিক্সেল রয়েছে। এটি মোটামুটি নয়, যেহেতু গাউসিয়ান ব্লার গাণিতিকভাবে পৃথক।


1
এখানে একটি দুর্দান্ত, নমনীয় একক পাস ব্লার শেডার: shadertoy.com/view/XdfGDH
রায় হুলা

7

জিএলএসএল দিয়ে দ্রুত গাউসিয়ান অস্পষ্ট হওয়ার কৌশলটি জিপিইউ হার্ডওয়্যারে লিনিয়ার ইন্টারপোলেশন সরবরাহ করে এই বিষয়টি গ্রহণ করা। অতএব, আপনি কার্যকরভাবে একটি একক উপসাগর বা আটটি 3D ভক্সেল সহ চারটি 2 ডি পিক্সেল নমুনা করতে পারেন। কোথায় নমুনা করবেন তা স্থির করে আপনি আউটপুটকে ওজন করতে পারবেন। সুনির্দিষ্ট রেফারেন্স হ'ল সিগ এবং হ্যাডভিয়ের "ফাস্ট থার্ড-অর্ডার টেক্সচার ফিল্টারিং" যা আপনি অনলাইনে খুঁজে পেতে পারেন।

পঠনযোগ্য ব্যাখ্যার জন্য ওয়েব পৃষ্ঠাটি "লিনিয়ার স্যাম্পলিংয়ের সাথে দক্ষ গাউসিয়ান ব্লার" সন্ধান করুন। যেমনটি উল্লেখ করা হয়েছে, যেহেতু গাউসিয়ান ব্লার বিস্তৃত কর্নেলের সাথে পৃথকযোগ্য তাই প্রতিটি মাত্রায় এক পাস করা সবচেয়ে দক্ষ।

তবে, আপনি এই কৌশলটি কোনও একক পাসে টান কার্নেল দিয়ে কোনও গাউসিকে আনুমানিকভাবে ব্যবহার করতে পারেন। নীচের উদাহরণে আমি উপরের স্লাইস দিয়ে 3D কার্নেলটি অনুকরণ করি = [1 2 1; 2 4 2; 1 2 1]; মাঝের স্লাইস = [2 4 2; 4 8 4; 2 4 2]; নীচে স্লাইস = [1 2 1; 2 4 2; 1 2 1]। প্রতিটি মাত্রায় +/- 0.5 ভক্সেল স্যাম্পল করে আপনি 27 টির পরিবর্তে 8 টি টেক্সচার ফেচ দিয়ে এটি করেন I আমি এটি জিআরএসএলে এমআরআইক্রোএলএল শেডার ফাইল হিসাবে প্রদর্শন করছি - কেবলমাত্র "a.txt" হিসাবে স্ক্রিপ্টটি সংরক্ষণ করুন এবং এটিতে রেখে দিন এমআরআইক্রোকলএল এর "শেডার" ফোল্ডার। আপনি যখন প্রোগ্রামটি পুনরায় চালু করবেন তখন দেখবেন আপনার রশ্মির কাস্ট চিত্রটি ঝাপসা। "ডুব্লুর" চেকবাক্সটি ক্লিক করলে অস্পষ্টতা চালু এবং বন্ধ হয়। আমার ল্যাপটপে আমার সংহত ইন্টেল জিপিইউ এবং "chris_t1" ব্যবহার করে এমআরআইক্রোকলএল-এর সাথে আসা চিত্রটি আমি অস্পষ্টতা ছাড়াই 70fps (1 টেক্সচার ফেঞ্চ) এবং অস্পষ্ট (8 টি ফেচ) সহ 21fps পাই। বেশিরভাগ কোডটি কেবলমাত্র একটি ক্লাসিক রে কাস্টার, "ডুব্লুর" শর্তসাপেক্ষে আপনার প্রশ্নকে গুটিয়ে দেয়।

//-------a.txt ফাইলটি অনুসরণ করে

//pref
doBlur|bool|true
//vert
void main() {
    gl_TexCoord[1] = gl_MultiTexCoord1;
    gl_Position = ftransform();
}
//frag
uniform int loops;
uniform float stepSize, sliceSize, viewWidth, viewHeight;
uniform sampler3D intensityVol;
uniform sampler2D backFace;
uniform vec3 clearColor;
uniform bool doBlur;
void main() {
    // get normalized pixel coordinate in view port (e.g. [0,1]x[0,1])
    vec2 pixelCoord = gl_FragCoord.st;
    pixelCoord.x /= viewWidth;
    pixelCoord.y /= viewHeight; 
    // starting position of the ray is stored in the texture coordinate
    vec3 start = gl_TexCoord[1].xyz;
    vec3 backPosition = texture2D(backFace,pixelCoord).xyz;
    vec3 dir = backPosition - start;
    float len = length(dir);
    dir = normalize(dir);
    vec3 deltaDir = dir * stepSize;
    vec4 colorSample,colAcc = vec4(0.0,0.0,0.0,0.0);
    float lengthAcc = 0.0;
    float opacityCorrection = stepSize/sliceSize;
    //ray dithering http://marcusbannerman.co.uk/index.php/home/42-articles/97-vol-render-optimizations.html
    vec3 samplePos = start.xyz + deltaDir* (fract(sin(gl_FragCoord.x * 12.9898 + gl_FragCoord.y * 78.233) * 43758.5453));
    //offset to eight locations surround target: permute top/bottom, anterior/posterior, left/right
    float dx = 0.5; //distance from target voxel
    vec3 vTAR = vec3( dx, dx, dx)*sliceSize;
    vec3 vTAL = vec3( dx, dx,-dx)*sliceSize;
    vec3 vTPR = vec3( dx,-dx, dx)*sliceSize;
    vec3 vTPL = vec3( dx,-dx,-dx)*sliceSize;
    vec3 vBAR = vec3(-dx, dx, dx)*sliceSize;
    vec3 vBAL = vec3(-dx, dx,-dx)*sliceSize;
    vec3 vBPR = vec3(-dx,-dx, dx)*sliceSize;
    vec3 vBPL = vec3(-dx,-dx,-dx)*sliceSize;
    for(int i = 0; i < loops; i++) {
        if (doBlur) {
            colorSample = texture3D(intensityVol,samplePos+vTAR);
            colorSample += texture3D(intensityVol,samplePos+vTAL);
            colorSample += texture3D(intensityVol,samplePos+vTPR);
            colorSample += texture3D(intensityVol,samplePos+vTPL);
            colorSample += texture3D(intensityVol,samplePos+vBAR);
            colorSample += texture3D(intensityVol,samplePos+vBAL);
            colorSample += texture3D(intensityVol,samplePos+vBPR);
            colorSample += texture3D(intensityVol,samplePos+vBPL);
            colorSample *= 0.125; //average of 8 sample locations
        } else
            colorSample = texture3D(intensityVol,samplePos);
        colorSample.a = 1.0-pow((1.0 - colorSample.a), opacityCorrection);      
        colorSample.rgb *= colorSample.a; 
        //accumulate color
        colAcc = (1.0 - colAcc.a) * colorSample + colAcc;
        samplePos += deltaDir;
        lengthAcc += stepSize;
        // terminate if opacity > 95% or the ray is outside the volume
        if ( lengthAcc >= len || colAcc.a > 0.95 ) break;
    }
    colAcc.rgb = mix(clearColor,colAcc.rgb,colAcc.a);
    gl_FragColor = colAcc;
}

2
ড্যানিয়েল রোকোস দ্বারা রৈখিক নমুনা সহ দক্ষ গাউসিয়ান অস্পষ্টতা ( ক্রিশ্চিয়ান ক্যান শাল্ট জেনসেনের মন্তব্যটিও লক্ষ করুন )।
বেনজি XVI 18
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.