এসএসএও বাস্তবায়নের সাথে কাঙ্ক্ষিত ফলাফল পাচ্ছে না


12

বিলম্বিত রেন্ডারিং কার্যকর করার পরে, আমি এই টিউটোরিয়ালটি ব্যবহার করে একটি এসএসএও প্রয়োগের সাথে আমার ভাগ্য চেষ্টা করেছি । দুর্ভাগ্যক্রমে, আমি এসএসএওর মতো দেখতে এমন কিছু পাচ্ছি না, আপনি আমার ফলাফলটি নীচে দেখতে পারেন।

Ssao প্রচেষ্টা ব্যর্থ হয়েছে

আপনি দেখতে পাচ্ছেন যে কিছু অদ্ভুত প্যাটার্ন গঠন করছে এবং সেখানে কোনও প্রকারের ছায়া নেই যেখানে প্রয়োজন (যেমন বস্তুর মধ্যে এবং মাটিতে)। আমি প্রয়োগ করা ছায়াগুলি অনুসরণ:


#VS
#version 330 core

uniform mat4 invProjMatrix;

layout(location = 0) in vec3 in_Position;
layout(location = 2) in vec2 in_TexCoord;

noperspective out vec2 pass_TexCoord;
smooth out vec3 viewRay;

void main(void){
    pass_TexCoord = in_TexCoord;
    viewRay = (invProjMatrix * vec4(in_Position, 1.0)).xyz;
    gl_Position = vec4(in_Position, 1.0);
}

#FS
#version 330 core

uniform sampler2D DepthMap;
uniform sampler2D NormalMap;
uniform sampler2D noise;

uniform vec2 projAB;
uniform ivec3 noiseScale_kernelSize;
uniform vec3 kernel[16];
uniform float RADIUS;
uniform mat4 projectionMatrix;

noperspective in vec2 pass_TexCoord;
smooth in vec3 viewRay;

layout(location = 0) out float out_AO;

vec3 CalcPosition(void){
    float depth = texture(DepthMap, pass_TexCoord).r;
    float linearDepth = projAB.y / (depth - projAB.x);
    vec3 ray = normalize(viewRay);
    ray = ray / ray.z;
    return linearDepth * ray;
}

mat3 CalcRMatrix(vec3 normal, vec2 texcoord){
    ivec2 noiseScale = noiseScale_kernelSize.xy;
    vec3 rvec = texture(noise, texcoord * noiseScale).xyz;
    vec3 tangent = normalize(rvec - normal * dot(rvec, normal));
    vec3 bitangent = cross(normal, tangent);

    return mat3(tangent, bitangent, normal);
}

void main(void){

    vec2 TexCoord = pass_TexCoord;
    vec3 Position = CalcPosition();
    vec3 Normal = normalize(texture(NormalMap, TexCoord).xyz);

    mat3 RotationMatrix = CalcRMatrix(Normal, TexCoord);

    int kernelSize = noiseScale_kernelSize.z;

    float occlusion = 0.0;

    for(int i = 0; i < kernelSize; i++){
        // Get sample position
        vec3 sample = RotationMatrix * kernel[i];
        sample = sample * RADIUS + Position;
        // Project and bias sample position to get its texture coordinates
        vec4 offset = projectionMatrix * vec4(sample, 1.0);
        offset.xy /= offset.w;
        offset.xy = offset.xy * 0.5 + 0.5;
        // Get sample depth
        float sample_depth = texture(DepthMap, offset.xy).r;
        float linearDepth = projAB.y / (sample_depth - projAB.x);
        if(abs(Position.z - linearDepth ) < RADIUS){
            occlusion += (linearDepth <= sample.z) ? 1.0 : 0.0;
        }
    }
    out_AO = 1.0 - (occlusion / kernelSize);
}

আমি একটি পূর্ণ স্ক্রিন কোয়াড আঁকি এবং গভীরতা এবং সাধারণ টেক্সচারগুলি পাস করি। অস্পষ্ট পাসের এও ফ্যাক্টরের জন্য সংরক্ষিত আলফা চ্যানেল সহ সাধারণগুলি আরজিবিএ 16 এফ এ থাকে। আমি একটি অ-রৈখিক গভীরতা বাফারে (32 এফ) গভীরতা সঞ্চয় করি এবং লিনিয়ার গভীরতাটি ব্যবহার করে এটি পুনরুদ্ধার করি:


float linearDepth = projAB.y / (depth - projAB.x);

কোথায় projAB.yগণনা করা হয়:

এখানে চিত্র বর্ণনা লিখুন

এবং projAB.xহিসাবে:

এখানে চিত্র বর্ণনা লিখুন

এগুলি গ্ল্যাম :: দৃষ্টিকোণ (গ্লুপারসিপেক্টিভ) ম্যাট্রিক্স থেকে প্রাপ্ত। z_n এবং z_f হ'ল ক্লিপ দূরত্বে।

উপরে আমি যে লিঙ্কটি পোস্ট করেছি তাতে বর্ণিত হিসাবে, পদ্ধতিটি কেন্দ্রের উচ্চতর বিতরণ সহ একটি গোলার্ধে নমুনা তৈরি করে। এরপরে এটি জেকের দিকের চারপাশে এলোমেলোভাবে গোলার্ধকে ঘোরানোর জন্য একটি টেক্সচার থেকে এলোমেলো ভেক্টর ব্যবহার করে এবং অবশেষে প্রদত্ত পিক্সেলের স্বাভাবিক বরাবর এটি আঁকুন। ফলাফলটি শোরগোলের কারণে, একটি অস্পষ্ট পাস এসএসএও পাসকে অনুসরণ করে।

যাইহোক, আমার অবস্থান পুনর্নির্মাণটি ভুল বলে মনে হচ্ছে না যেহেতু আমিও একই কাজ করার চেষ্টা করেছি তবে অবস্থানটি পুনর্গঠন করার পরিবর্তে কোনও টেক্সচার থেকে পাস হয়ে গেছে।

আমি রেডিয়াস, গোলমাল টেক্সচারের আকার এবং নমুনার সংখ্যা এবং বিভিন্ন ধরণের টেক্সচার ফর্ম্যাটগুলির সাথে ভাগ্যবিহীন খেলতে চেষ্টা করেছি। রেডিয়াস পরিবর্তন করার সময় কোনও কারণে কোনও পরিবর্তন হয় না।

যে কেউ কোন পরামর্শ আছে? ভুল কি হতে পারে?


আমি মনে করি অস্পষ্টতার আলাদা পাস হওয়া দরকার। অস্পষ্টতা ছাড়াই আপনি কি আপনার শেডারের স্ক্রিনশট পোস্ট করতে পারেন?
নাইট 666

অস্পষ্ট পাসটি আলাদা, আপনি প্রাক-অস্পষ্ট স্ক্রিনশটটি পরীক্ষা করতে পারেন ।
গ্রিভারহার্ট

উত্তর:


6

আমি সমস্যাটি খুঁজে পেয়েছি। এটি একটি সত্যই বোকা ভুল ছিল, আমি জানতাম না যে আপনাকে glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_NONE);সঠিক গভীরতার মানগুলি নির্দিষ্ট করতে হবে এবং এইভাবে, আমি গভীরতার মানগুলিকে নমুনা দিচ্ছিলাম না। এখন আমি একটি দুর্দান্ত এসএসএও প্রভাব পেয়েছি:

এখানে চিত্র বর্ণনা লিখুন


এটিকে সঠিক উত্তর হিসাবে পতাকাঙ্কিত করতে দ্বিধা বোধ করুন যাতে লোকেরা জানতে পারে যে আপনি নিজের সমাধানটি পেয়েছেন: পি
সামুগুই

হ্যাঁ, দুর্ভাগ্যক্রমে আমার উত্তরটি সঠিক হিসাবে পতাকাঙ্কিত করতে আমাকে একদিন অপেক্ষা করতে হবে: এস।
গ্রিভারহার্ট

আমার ভুল, টাইমস্ট্যাম্পগুলি পরীক্ষা করে নি।
সোমগুয়ে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.