الشبكة العربية لمطوري الألعاب

مبتدئ  كنان موعد مشاركة 1

السلام عليكم...
 
في أحد أمثلة برمجة مظللات الرؤوس بواسطة لغة HLSL ظهر الخطأ التالي :
 



error X3025:global variables are implicitly constant ,enable compatibility mode to allow modification
 
وعندما بحثت عن هذا الخطأ على الإنترنت وجدت أن الحل هو وضع أحد العلمين التاليين في التابع :D3DXCompileShaderFromFile()
 
وهما:



D3DXSHADER_USE_LEGACY_D3DX9_31_DLL or D3DXSHADER_ENABLE_BACKWARDS_COMPATIBILITY
 
مع عدم وضع العلم : D3DXSHADER_DEBUG
 
وبالفعل عمل المثال ولكن ما المشكلة التي أدت إلى حدوث هذا........هل هو خطأ في الكود....؟
 
ملفات المثال في المرفقات..........

خبير مدير وسام البهنسي مشاركة 2

أما في 08/شوال/1431 09:44 ص، فقد تنهد keen28 بارتياح وهو يرد:

وبالفعل عمل المثال ولكن ما المشكلة التي أدت إلى حدوث هذا........هل هو خطأ في الكود....؟

نعم. الكود يقوم بعملية غير منطقية. أولاً يجب معرفة أن المظللات لا تستطيع التعديل على الثوابت المررة لها (constants) (وإلا ما دعيت بالثوابت ☺ ).
 
المتغيرات العامة في لغة HLSL هي في الحقيقة ثوابت للمظلل، وبالتالي لا تستطيع التعديل على قيمتها في المظلل.
 
السبب في ظهور الخطأ مع المترجم الجديد هو أنه قد أصبح أكثر صرامة في تطبيق القوانين، وسيمنعك من ارتكاب الخطأ المنطقي المذكور. حل المسألة بسيط، فقط أعلن عن متغير محلي من نوع vector واستخدمه بدلاً من LightDir في داخل الإجراء Main.

وسام البهنسي
مبرمج في إنفيديا وإنفريمز

مبتدئ  كنان موعد مشاركة 3

آها......بالفعل.......😄
 
شكراً أستاذ وسام...........