glprogramstringarb تسبب gl_invalid_operation ... أو المساعدة في برامج الأجزاء

StackOverflow https://stackoverflow.com/questions/339042

  •  19-08-2019
  •  | 
  •  

سؤال

أحاول أن أكتب برنامجًا شظايا سيأخذ نسيجًا ويثبت 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).

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