ওপেনজিএল জিএলএসএল - সোবেল এজ সনাক্তকরণ ফিল্টার


9

এই বিষয়ে সম্মানের সাথে আমি সাফল্যের সাথে জিএলএসএলে সোবেল এজ সনাক্তকরণ ফিল্টারটি প্রয়োগ করেছি । ফিল্টারটির টুকরোটি শেডার কোডটি এখানে:

#version 330 core
in vec2 TexCoords;
out vec4 color;

uniform sampler2D screenTexture;

mat3 sx = mat3( 
    1.0, 2.0, 1.0, 
    0.0, 0.0, 0.0, 
   -1.0, -2.0, -1.0 
);
mat3 sy = mat3( 
    1.0, 0.0, -1.0, 
    2.0, 0.0, -2.0, 
    1.0, 0.0, -1.0 
);

void main()
{
    vec3 diffuse = texture(screenTexture, TexCoords.st).rgb;
    mat3 I;
    for (int i=0; i<3; i++) {
        for (int j=0; j<3; j++) {
            vec3 sample  = texelFetch(screenTexture, ivec2(gl_FragCoord) + ivec2(i-1,j-1), 0 ).rgb;
            I[i][j] = length(sample); 
    }
}

float gx = dot(sx[0], I[0]) + dot(sx[1], I[1]) + dot(sx[2], I[2]); 
float gy = dot(sy[0], I[0]) + dot(sy[1], I[1]) + dot(sy[2], I[2]);

float g = sqrt(pow(gx, 2.0)+pow(gy, 2.0));
color = vec4(diffuse - vec3(g), 1.0);
} 

এবং এখানে সোবেল প্রান্ত সনাক্তকরণ সহ একটি কিউবের ফলাফল:

সোবেল প্রান্ত সনাক্তকরণ ফিল্টার সহ কিউব

আপনি যদি ছবিটি প্রসারিত করেন তবে দেখতে পাবেন যে সোবেল দ্বারা উত্পাদিত প্রচুর "শব্দ" রয়েছে: নীল / সাদা গ্রেডিয়েন্টের কারণে পুরো দৃশ্যে ধূসর অনুভূমিক স্ট্রাইপ রয়েছে। ফুটারমোর, হালকা শঙ্কুগুলি কিউবে একটি অযাচিত প্যাটার্ন উত্পাদন করে। কিউবের বাম দিকে কালো প্রান্তগুলিও কিউবের বাম অর্ধেকের হালকা শঙ্কুর কারণে বিবর্ণ হয়ে গেছে বলে মনে হচ্ছে।

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

এখন আমার দুটি প্রশ্ন আছে:

  1. সর্বোত্তম সম্ভাব্য প্রান্ত সনাক্তকরণ ফলাফল উত্পাদন করতে নিম্নলিখিত পদক্ষেপগুলি কি সঠিক:

    • গ্রেস্কেল
    • গাউসিয়ান ব্লার
    • সোবেল / ক্যানি প্রান্ত সনাক্তকরণ
  2. যদি হ্যাঁ, আমি কীভাবে প্রক্রিয়াজাত চিত্রটির সাথে মূল চিত্রটি একীভূত করব? আমি বোঝাতে চাইছি, উপরে বর্ণিত পদক্ষেপগুলি প্রক্রিয়া করার পরে, আমি একটি চিত্র পেয়েছি যা হয় সাদা প্রান্ত বা ভাইস ভারকা সহ পুরোপুরি কালো। আমি কীভাবে আমার মূল চিত্র / জমিনে প্রান্ত স্থাপন করব?

আপনার সাহায্যের জন্য ধন্যবাদ!


আমি ভাবছি যদি আপনি কোনওভাবে ওপেনএলএল এর প্রান্ত পতাকা ব্যবহার করে আপনার পছন্দসই ফলাফলগুলি পেতে পারেন । দেখে মনে হচ্ছে লাইন মোডে থাকা প্রান্তের পতাকা সহ কেবল শীর্ষ প্রান্তগুলি আঁকা থাকে। এখানে একটি বিবরণ আছে । (আমি এটি নিজে ব্যবহার করি নি বা আমি একটি উদাহরণ পোস্ট করেছি))
ব্যবহারকারী 1118321

উত্তর:


9
  1. সেরা ফলাফল দৃ strongly়ভাবে আপনার ব্যবহারের ক্ষেত্রে নির্ভর করে। আপনি কী প্রভাব অর্জন করতে চান তার উপরও এগুলি নির্ভর করে। সোবেল কেবল একটি প্রান্ত সনাক্তকারী ফিল্টার: প্রান্তগুলি ইনপুট সিগন্যালের উপর নির্ভর করবে, চয়ন করে যে ইনপুট সংকেত আপনার উপর নির্ভর করবে।

    এখানে আপনি রঙের চিত্রটিকে একটি ইনপুট হিসাবে ব্যবহার করছেন এবং ফিল্টারটি নীল গ্রেডিয়েন্টে মজাদার প্রান্তগুলি সঠিকভাবে সনাক্ত করে, যখন ঘনকটির প্রান্তগুলি ব্যাকগ্রাউন্ডের রঙের থেকে খুব কাছাকাছি অবস্থিত সেখানে বাধা পায়।

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

  2. প্রান্তের তথ্যটি কীভাবে একত্রিত করতে হবে সে সম্পর্কে আপনার প্রশ্নের বিষয়ে, আমি আপনাকে gএটি ব্যবহার করার আগে একটু ফিল্টার করার পরামর্শ দিচ্ছি । তারপরে আপনি এটি ব্যবহার করতে পারেন মূল রঙ এবং পছন্দসই প্রান্ত রঙের মধ্যে বিভক্ত করতে।

    উদাহরণস্বরূপ আপনি এই জাতীয় কিছু চেষ্টা করতে পারেন:

    float g = sqrt(pow(gx, 2.0)+pow(gy, 2.0));

    // Try different values and see what happens
    g = smoothstep(0.4, 0.6, g);

    vec3 edgeColor = vec3(1., 0., 0.2);
    color = vec4(mix(diffuse, edgeColor, g), 1.);

অভিযোজ্য বস্তু

গভীরতা বা নরমাল ব্যবহার করতে, আপনার যদি এটি ইতিমধ্যে সম্পন্ন না হয়ে থাকে তবে তাদের একটি টেক্সচারে সংরক্ষণ করতে হবে। আপনি যখন আপনার নিয়মিত রেন্ডারিং পাসের জন্য ফ্রেম বাফার তৈরি করেন, আপনি এটির সাথে বিভিন্ন টেক্সচার সংযুক্ত করতে পারেন (দেখুন glFramebufferTexture2D) এবং দৃশ্যের বর্ণের চেয়ে অন্যান্য তথ্য তাদের কাছে লিখতে পারেন ।

যদি আপনি গভীরতার টেক্সচারটি (সাথে GL_DEPTH_ATTACHMENT) সংযুক্ত করেন তবে এটি স্বয়ংক্রিয়ভাবে গভীরতার জন্য ব্যবহৃত হবে। যদি আপনি এক বা একাধিক রঙের টেক্সচার সংযুক্ত করেন (এর সাথে GL_COLOR_ATTACHMENTi), আপনি আপনার খণ্ডের শেডারে কয়েকটি আউটপুট ঘোষণা করে তাদের কাছে এটি লিখতে পারেন (এটি দিয়ে ব্যবহৃত হত gl_FragData; কোনওভাবেই দেখুন, দেখুন glDrawBuffers)।

বিষয়ে আরও তথ্যের জন্য, "মাল্টি রেন্ডার লক্ষ্য" (এমআরটি) সন্ধান করুন।


সুন্দর তথ্য, ধন্যবাদ জুলিয়েন। আরও একটি প্রশ্ন: আমি কীভাবে আমার খন্ডের শেডারটিতে গভীরতা বা সাধারণ তথ্য ব্যবহার করতে পারি? আমি এখনও জিএলএসএল নিয়ে বেশ নতুন এবং তাই সোয়েল অ্যালগরিদমে মানগুলি কীভাবে অন্তর্ভুক্ত করা যায় সে সম্পর্কে কোনও ধারণা নেই।
এনএন ৮87

2
আপনি যখন আপনার রেন্ডারিং পাসের জন্য ফ্রেমবফার তৈরি করেন, আপনি এটিতে একাধিক টেক্সচার যুক্ত করতে পারেন। আপনি যদি গভীরতার জমিন সংযুক্ত করেন তবে এটি স্বয়ংক্রিয়ভাবে গভীরতার জন্য ব্যবহৃত হবে। এটা আপনাকে অন্য রঙ জমিন আপনি আলাদাভাবে তা লিখতে পারেন (দেখুন সংযুক্ত opengl.org/sdk/docs/man/html/glDrawBuffers.xhtml ), একটি বৈশিষ্ট্য বলা হয় "মাল্টি রেন্ডার উদ্দিষ্ট" (এমআরটি)।
জুলিয়েন গের্তাউল্ট

@ এন্নি ৮87: সাহায্য করার জন্য খুশি। :)
জুলিয়েন গের্তাউল্ট

@ থ্রিচোপ্লেক্স: পরামর্শের জন্য ধন্যবাদ; সম্পন্ন.
জুলিয়েন গের্তাউল্ট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.