سؤال

أحاول تنفيذ أضواء نقطة في OpenGL مع GLSL. أرسل كل البيانات المطلوبة إلى التظليل. للبساطة، استخدم فقط ضوء منتشر هنا.

مثالي يظهر مثلث ضخمة أريد أن أضاءت مع مصدر ضوء واحد. يظهر مصدر الضوء كثلث زرقاء صغير.

لضوء منتشر أحتاج إلى معرفة الزاوية بين الضوء والسطح. لذلك، أنا أحسب الشريعة وتوجيه الضوء. ثم سيعطيني المنتج النقاط عددا بين -1 و 1 في حين أن كل شيء بين 0 و 1 مضاءة.

ومع ذلك، هنا أنا عالق لأن هذه الزاوية محسوبة بشكل غير صحيح في مثالي. نظرا لأنه من الصعب تصحيح التظليل، استخدمت عدة مخرجات كون سطحي. لقد استخدمت طبيعيا مثل اللون للمثلث وأين كان الضوء، وكان السطح دائما أخضر. وهذا هو، يشير الحالات الطبيعية إلى محور Y وبالتالي يتم حسابها بشكل صحيح. وهذا هو، يجب أن يكون اتجاه الضوء خطأ. ومع ذلك، لا أستطيع أن أجد السبب وراء وجود خطأ. يتم تمرير موضع النور ووضع Vertex في الفضاء العالمي إلى Vertex Shader، والذي يحولها بعد ذلك إلى مساحة العين، وحسب اتجاه الضوء وتمرير هذا إلى Shigment Shader:

Vertex Shader:

vec4 pos = modelview_matrix * <input vertex>;
vec4 lightPos = modelview_matrix * <light position>;

vec3 lightDir = normalize(lightPos.xyz - pos.xyz);

شظي الشظية:

float NdotL = max(dot(normalize(<correct normal>), normalize(lightDir)), 0.0);
gl_FragColor = vec4(1.0, NdotL, 0.0, 1.0);

لقد ألحقت بعض الصور من هذا المثال والتي تظهر بالتأكيد، أن الاستيفاء غريب حقا. أعلم أن أعرف معرفة ما إذا كان الرمز الذي قمت بلصقهههه هو الصحيح أو ما إذا كنت بحاجة إلى معرفة المزيد من التعليمات البرمجية. علاوة على ذلك، هل هذا السلوك الاستيفاء طبيعي أم أنه خطأ في التعليمات البرمجية الخاصة بي؟

http://img41.imageshack.us/img41/3566/interpolation.png. http://img189.imageshack.us/img189/3566/interpolation.png.

لا سيما الصورة الأولى تظهر أن البقعة المركزية للضوء ليس مباشرة تحت الضوء ولكن انتقل قليلا إلى وسط المثلث.

إذا قمت بتمرير "POS" إلى Shader Fragment (أي، فهو ثابت) ثم حساب "Lightdir" في شادظ الشظية، كل شيء يعمل بشكل جيد.

هل كانت مفيدة؟

المحلول

أعتقد أن تطبيع LightDir الخاص بك في Vertex Shader يؤثر على النتيجة التي تحصل عليها عند قيامها بتشغيل المتجهات لأنها تستغرق الطول من المعادلة وبالتالي يؤثر على "سرعة" الاستيفاء.

إذا كنت تريد شرحا (مرئي)، فحاول سحبه في 2D على الورق. قم أولا بسحب خط (مثلثك) ونقطة (مصدر الضوء). أضف سطرين (LightDir) لكلا طرفي الخط إلى مصدر الضوء ثم يتقلص (تطبيع) خطوط Lightdir تلك بحيث يكون لديهم نفس الطول وكلاهما يجتمع كلاهما في مصدر الضوء. إذا قمت بتوصيل طرفي خطوط LightDir الطبيعية، فستحصل على خط غير متوازي (إذا كان مصدر الضوء ليس بالضبط في منتصف الخط الأول). الآن إذا كنت ترسم خطا يمر بالضبط من خلال منتصف واحدة من الخطوط التي سترى أنها لا تمر عبر منتصف الخط الآخر ولكنها ستضربها قليلا إلى اليسار أو اليمين.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top