سؤال

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

في الأصل، لعرض صورتي كنت أستخدم glDrawPixels.ولحل المشكلة أعلاه، سأقوم بإنشاء خريطة ملونة باستخدام glPixelMap.هذا يعمل بشكل جميل.ومع ذلك، لأسباب تتعلق بالأداء، بدأت في استخدام الأنسجة لعرض صورتي.يبدو أن أسلوب glPixelMap لم يعد يعمل.حسنًا، قد ينجح هذا النهج ولكني لم أتمكن من تفعيله.

ثم حاولت بعد ذلك استخدام glPixelTransfer لتعيين المقاييس والتحيز.يبدو أن هذا له نوع من التأثير (ليس بالضرورة هو المطلوب) عند التمريرة الأولى، ولكن عندما تم تغيير القيود العلوية والسفلية، لم يكن هناك أي تأثير مرئي.

قيل لي بعد ذلك أن تظليل الأجزاء سيعمل.ولكن بعد الاتصال بـ glGetString(GL_EXTENSIONS)، وجدت أن GL_ARB_fragment_shader غير مدعوم.بالإضافة إلى ذلك، يؤدي استدعاء glCreateShaderObjectARB إلى حدوث استثناء nullreference.

والآن أنا في حيرة.ماذا علي أن أفعل؟الرجاء المساعدة.


كل ما قد ينجح أنا على استعداد للمحاولة.البائع هو Intel والعارض هو Intel 945G.أنا للأسف مقيد ببطاقة الرسومات المدمجة في اللوحة الأم، والتي تحتوي فقط على gl 1.4.

شكرا لردكم حتى الآن.

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

المحلول

ما لم تكن لديك بطاقة رسومات قديمة جدًا، فمن المفاجئ أنك لا تتمتع بدعم تظليل الأجزاء.أقترح عليك محاولة التحقق مرة أخرى باستخدام هذا.

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

الإجابة المختصرة هي أنك تستخدم عدة تمريرات عرض.أولاً تقوم بعرض الصورة بكثافة عادية.ثم تستخدم المزج الطرحي (ابحث عن glBlendEquation) لطرح الحد الأدنى من القيمة.ثم تستخدم المزج الإضافي لمضاعفة كل شيء بمقدار 1/(الحد الأقصى-الدقيقة) (والذي قد يحتاج إلى تمريرات متعددة).

إذا كنت تريد حقًا القيام بذلك، فيرجى إعادة نشر GL_VENDOR و GL_RENDERER لبطاقة الرسومات الخاصة بك.

يحرر: همم.إنتل 945G لا تملك ARB_fragment_shader, ، ولكن لديها ARB_fragment_program والتي سوف تفعل الخدعة أيضا.

يجب أن يبدو رمز الجزء الخاص بك على هذا النحو (ولكن لقد مر وقت طويل منذ أن كتبت أي شيء، لذا فمن المحتمل أن يكون به خطأ)

!!ARBfp1.0
ATTRIB tex = fragment.texcoord[0]
PARAM cbias = program.local[0]
PARAM cscale = program.local[1]
OUTPUT cout = result.color

TEMP tmp
TXP tmp, tex, texture[0], 2D
SUB tmp, tmp, cbias
MUL cout, tmp, cscale

END 

يمكنك تحميل هذا إلى OpenGL كما يلي:

GLuint prog;
glEnable(GL_FRAGMENT_PROGRAM_ARB);
glGenProgramsARB(1, &prog);
glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, prog);
glProgramStringARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, strlen(src), src);
glDisable(GL_FRAGMENT_PROGRAM_ARB);

بعد ذلك، قبل تقديم الشكل الهندسي الخاص بك، قم بما يلي:

glEnable(GL_FRAGMENT_PROGRAM_ARB);
glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, prog);
colour4f cbias = cmin;
colour4f cscale = 1.0f / (cmax-cmin);
glProgramLocalParameter4fARB(GL_FRAGMENT_PROGRAM_ARB, 0, cbias.r, cbias.g, cbias.b, cbias.a);
glProgramLocalParameter4fARB(GL_FRAGMENT_PROGRAM_ARB, 1, cscale.r, cscale.g, cscale.b, cscale.a);

//Draw your textured geometry

glDisable(GL_FRAGMENT_PROGRAM_ARB);

نصائح أخرى

وانظر أيضا إذا ويدعم التمديد GL_ARB_fragment_program. يدعم هذا التمديد البرامج جزء أسلوب ASM. التي من المفترض أن تكون معتمدة في OpenGL 1.4.

ومن المؤسف حقا أن كنت تستخدم مثل هذا الإصدار القديم من OpenGL. يمكنك ترقية مع بطاقتك؟

لفي الإصدار 2.x OGL أكثر حداثة، وهذا هو بالضبط نوع البرنامج الذي GLSL هو ل. ويمكن الاطلاع على وثائق كبيرة هنا:

برنامج OpenGL الوثائق

برنامج OpenGL تظليل الناطقة

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