ফং আলো - স্পেকুলার লাইটিংয়ের সাথে খুব অদ্ভুত কিছু রয়েছে


17

আমি ফোং লাইটিং প্রয়োগ করেছি। সমস্ত কিছু কাজ করে বলে মনে হচ্ছে - টরাস এবং গোলকগুলি প্রত্যাশার মতো আলোকিত হয় তবে আমি দিকনির্দেশক আলোর আলো সংক্রান্ত আলোয় কিছু অদ্ভুত বিষয় লক্ষ্য করি।

এখানে দুটি স্ক্রিনশট রয়েছে।

প্রথম:

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

দ্বিতীয়ত:

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

আপনি দেখতে পাচ্ছেন যে ক্যামেরাটি কোনও বস্তুর থেকে দূরে থাকলে আরও বেশি অঞ্চলে আলোকসংক্রান্ত আলো থাকে।

এখানে সরলীকৃত ভার্টেক্স শ্যাডার:

#version 330 core

layout(location = 0) in vec3 vertexPos;
layout(location = 1) in vec3 vertexNorm;
layout(location = 2) in vec2 vertexUV;

uniform mat4 MVP;
uniform mat4 M;

out vec2 fragmentUV;
out vec3 fragmentNormal;
out vec3 fragmentPos;

void main() {
  fragmentUV = vertexUV;
  fragmentNormal = (M * vec4(vertexNorm, 0)).xyz;
  fragmentPos = (M * vec4(vertexPos, 1)).xyz;

  gl_Position = MVP * vec4(vertexPos, 1);
}

... এবং টুকরা শেডার:

#version 330 core

in vec2 fragmentUV;
in vec3 fragmentNormal;
in vec3 fragmentPos;

struct DirectionalLight {
  vec3 Color;
  vec3 Direction;
  float AmbientIntensity;
  float DiffuseIntensity;
};

uniform sampler2D textureSampler;
uniform vec3 cameraPos;
uniform float materialSpecularFactor;
uniform float materialSpecularIntensity;
uniform DirectionalLight directionalLight;

out vec4 color;

void main() {
  vec3 normal = normalize(fragmentNormal); // should be normalized after interpolation

  vec4 ambientColor = vec4(directionalLight.Color, 1) * directionalLight.AmbientIntensity;

  float diffuseFactor = clamp(dot(normal, -directionalLight.Direction), 0, 1);
  vec4 diffuseColor = vec4(directionalLight.Color, 1) * directionalLight.DiffuseIntensity * diffuseFactor;

  vec3 vertexToCamera = normalize(cameraPos - fragmentPos);
  vec3 lightReflect = normalize(reflect(directionalLight.Direction, normal));
  float specularFactor = pow(clamp(dot(vertexToCamera, lightReflect), 0, 1), materialSpecularFactor);
  vec4 specularColor = vec4(directionalLight.Color, 1) * materialSpecularIntensity * specularFactor;

  color = texture(textureSampler, fragmentUV) * (ambientColor + diffuseColor + specularColor);
}

কোনও সরলীকরণ ছাড়াই পুরো উত্স কোডটি এই সংগ্রহস্থলটিতে পাওয়া যাবে ।

আমি জানতে চেয়েছিলাম যে আমি কিছু ভুল প্রয়োগ করেছি কিনা। নাকি ফোং লাইটিংয়ের জন্য ঠিক আছে?


2
একটি কম্পিউটার গ্রাফিক্স স্ট্যাক রয়েছে যা আপনি এই প্রশ্নের সাথে আরও ভাল উত্তর পেতে পারেন।
অ্যান্ড্রু উইলসন

উত্তর:


34

দিকনির্দেশক আলোর আলোকিত আলো

যখন ক্যামেরা কোনও বস্তু থেকে দূরে থাকে তখন আরও বেশি অঞ্চলে স্পেকুলার আলোক থাকে

হ্যাঁ, আমার কাছে ঠিক দেখাচ্ছে।

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

উদাহরণ 1: সানগ্লিন্টের অঞ্চল আবাসিক লটের প্রায় সমান

লেকের ওপারে সানলিন্ট

http://academic.emporia.edu/aberjame/remote/lec10/lec10.htm

উদাহরণ 2: সানগ্লিন্টের অঞ্চলটি গ্রেট লেকের সমান

গ্রেট লেকের উপরে সানলিন্ট

http://earthobservatory.nasa.gov/IOTD/view.php?id=78617

প্রকৃতপক্ষে সানগ্লিন্ট অঞ্চলটি আপনার দৃষ্টিভঙ্গি থেকে সমতলের চেয়ে আরও বেশি গোলাকার হওয়ার জন্য পৃথিবী থেকে যতটা দূরে থাকবে ততক্ষণ বাড়ানো থাকবে।

ফোং প্রতিবিম্ব মডেলের ক্ষেত্রে, বর্ণটি তিনটি দিকের উপর নির্ভর করে: চোখ, আলো এবং পৃষ্ঠ the যেহেতু আপনার ক্যামেরাটি একই পৃষ্ঠের দিকে তাকাচ্ছে, কেবল সরে যাচ্ছে, চোখ একই থাকে; সমতল হওয়ার কারণে ভূপৃষ্ঠটি একই থাকে এবং আলো সংজ্ঞা অনুসারে একই থাকে (এটি একটি দিক নির্দেশক আলো), সুতরাং স্পষ্টাকার প্রতিচ্ছবিটি একই হবে - অবশ্যই ক্যামেরা / পর্দার দৃষ্টিকোণ থেকে।


1
Love বাস্তব জীবনের উদাহরণ একটি প্রোগ্রামিং প্রশ্নের উত্তর
defhlt

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