glprogramstringarb تسبب gl_invalid_operation ... أو المساعدة في برامج الأجزاء
سؤال
أحاول أن أكتب برنامجًا شظايا سيأخذ نسيجًا ويثبت Texels بين قيمتين. بمعنى أنه إذا كانت قيمة MIN قول 0.2 وكانت القيمة الأقصى 0.6 ، فسيصبح أي Texel أقل من 0.2 0 ، وأي Texel أكبر من 0.6 سيصبح 1.0 ، وسيتم تعيين جميع القيم بين 0 إلى 1.0.
مكالمتي إلى glprogramstringarb هي السبب في gl_invalid_operation. لا يمكنني معرفة سبب حدوث هذا. الرجاء المساعدة.
هذه هي محاولتي الأولى لكتابة تظليل ، لذا لست متأكدًا تمامًا مما أقوم به. هذا هو الكود الخاص بي:
String str =
"!!ARBfp1.0\n"+
"TEMP R0;\n"+
"MOV R0.x, fragment.texcoord[1];\n"+
"ADD R0.w, fragment.texcoord[2].x, -R0.x;\n"+
"TEX R0.xyz, fragment.texcoord[0], texture[0], 2D;\n"+
"RCP R0.w, R0.w;\n"+
"ADD R0.xyz, R0, -fragment.texcoord[1].x;\n"+
"MUL_SAT result.color.xyz, R0, R0.w;\n"+
"END\n";
int count = str.Length;
Gl.glEnable(Gl.GL_FRAGMENT_PROGRAM_ARB);
Gl.glGenProgramsARB(1, out mFragProg);
Gl.glBindProgramARB(Gl.GL_FRAGMENT_PROGRAM_ARB, mFragProg);
Gl.glProgramStringARB(Gl.GL_FRAGMENT_PROGRAM_ARB, Gl.GL_PROGRAM_FORMAT_ASCII_ARB, count, str);
GetGLError("glProgramStringARB");
Gl.glDisable(Gl.GL_FRAGMENT_PROGRAM_ARB);
ثم لاستخدامه أفعل ما يلي:
Gl.glEnable(Gl.GL_FRAGMENT_PROGRAM_ARB);
Gl.glBindProgramARB(Gl.GL_FRAGMENT_PROGRAM_ARB, mFragProg);
float max = (mMiddle + (mRange / 2.0f))/65535.0f;
float min = (mMiddle - (mRange / 2.0f))/65535.0f;
Gl.glMultiTexCoord1f(Gl.GL_TEXTURE1_ARB, min);
Gl.glMultiTexCoord1f(Gl.GL_TEXTURE2_ARB, max);
GetGLError("Enable Program for Drawing");
/*
* Drawing Code
*/
Gl.glDisable(Gl.GL_FRAGMENT_PROGRAM_ARB);
المحلول
لم أبرم أي تظليل ، لكن ربما لا يتعرف برنامج التحويل البرمجي للتظليل على الخط الجديد؟ هل حاولت وضع " n r"؟
تعديل:
سؤال آخر قد تطرحه على نفسك هو ما هي اللغة التي تستخدمها؟ هل الأوتار في يونيكود ، أي 16 بت/شار؟ لقد لاحظت للتو أن التنسيق الذي تمرره إلى glprogramstringarb () تم ضبطه على ASCII. إذا كانت السلسلة غير متوفرة حقًا ، فسيؤدي ذلك إلى حدوث مشاكل.
على سبيل المثال ، سلاسل Java و C# في Unicode. ليس ASCII.
نصائح أخرى
أولاً: لا أعرف الكثير عن ARB_FRAGMENT_PROGRAM ، لذا فأنا أخمن جزئيًا هنا.
سيكون الخيار الأفضل هو الحصول على سلسلة الأخطاء (glgetString (gl_program_error_string_arb)) ومعرفة ما يخبرك به.
بعد النظر إلى التظليل ، يبدو أنك تستخدم العدد الخاطئ من المكونات في الأسطر 3 و 7 (وربما أكثر). على سبيل المثال ، لا أعتقد أنه يمكنك تعيين متجه مكون من 4 مكونات (Fragment.texcoord [1]) إلى حقل قياسي (r0.x).