سؤال

أنا أعمل على لعبة لجهاز iPhone الذي يحتوي على ميكانيكي الرسم/الطلاء ، ولدي مشاكل في محاولة إنشاء أداة من شأنها أن تمحو الأشياء التي تم رسمها بالفعل.

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

أي نصائح؟

تحرير: لإعطاء مزيد من المعلومات ، أستخدم قوامًا لفرشاتي واستخدام Glvertexpointer () و gldrawarrays () لتقديمها. فمثلا:

glBindTexture(GL_TEXTURE_2D, circleBrush);
glVertexPointer(3, GL_FLOAT, 0, verts);
glTexCoordPointer(2, GL_FLOAT, 0, coords);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

تحرير 2: لسوء الحظ ، لا تتوفر المخازن المؤقتة للاستنسل على iPhone. : (

تحرير 3: تتوفر كائنات FrameBuffer على iPhone وهذا هو الطريق الذي اتخذته. لم أقم بتطبيقه بالكامل بعد ، لكن يبدو أنه يعمل بالطريقة التي أردت بها. شكرا لكم جميعا!

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

المحلول

ارسم رباعي الشاشة على شاشة كاملة على المشهد الخاص بك. عندما يرسم المستخدم ضربة فرشاة ، استخدم glTexSubImage2D لتحديث نسيجك.

glreadpixels/gldrawpixels بطيئة.

يعد استخدام FrameBufferObjects أفضل ، لكنني أشك في أن هذا التمديد متاح على iPhone (ثم مرة أخرى ، لا أعرف بالتأكيد ، لذلك ربما جربه). تسمح لك FBO بالرسوم مباشرة إلى نسيج كما لو كان سياقًا آخر عرضًا.

نصائح أخرى

العازلة الاستنسل هي أفضل طريقة للتعامل مع هذا بالتأكيد ... ستوفر الوقت ووحدة المعالجة المركزية والمشاكل المحتملة .. ، فهي متوفرة على iPhone ، عليك فقط إنشاء سطح OpenGles 2.0 (وليس GLES 1.0 أو 1.1) .

        //Turn off writing to the Color Buffer and Depth Buffer
        //We want to draw to the Stencil Buffer only
        glColorMask(false, false, false, false);
        glDepthMask(false);

        //Enable the Stencil Buffer
        glEnable(GL_STENCIL_TEST);

        //Set 1 into the stencil buffer
        glStencilFunc(GL_ALWAYS, 1, 0xFFFFFFFF);
        glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);

        //CALL YOUR DRAWING METHOD HERE


        //Turn on Color Buffer and Depth Buffer
        glColorMask(true, true, true, true);
        glDepthMask(true);

        //Only write to the Stencil Buffer where 1 is set
        glStencilFunc(GL_EQUAL, 1, 0xFFFFFFFF);
        //Keep the content of the Stencil Buffer
        glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);

        //CALL OUR DRAWING METHOD AGAIN

ابحث عن هذا المثال:http://www.opengl.org/resources/code/samples/glut_examples/examples/stenciltst.c

ها هي النتيجة المرئية:http://www.opengl.org/resources/code/samples/glut_examples/examples/stenciltst.jpg

لقد ضمني نفس النوع من الأداة للممحاة مع هذا ، على كل من Android و iPhone ويعمل مثل السحر!

حظا طيبا وفقك الله !

هتافات !

لا تعطي الكثير من المعلومات ، لكنني أفترض أن تخزينك "ترسم" في المخزن المؤقت ثم رسمه على الشاشة مثل هذا:

 glWindowPos2i(X, Y);
 glDrawPixels(drawing->Width, drawing->Height, drawing->Format, 
              GL_UNSIGNED_BYTE, drawing->ImageData);

مع الرسم-> Imagedata كونه المخزن المؤقت. ما يمكنك فعله هو الحصول على خلفية منفصلة ورسمه أولاً. بعد ذلك ، ستقوم أداة المسح ببساطة بتجهيز المخزن المؤقت للرسوم (تحويل جميع القيم ، بما في ذلك ألفا ، على طول الطريق).

لهذا الحل للعمل ، يجب عليك تشغيل المزج و قم بإيقاف اختبار العمق.

 glEnable(GL_BLEND);
 glDisable(GL_DEPTH_TEST);
 glWindowPos2i(X, Y);
 //background never changes
 glDrawPixels(background->Width, background->Height, background->Format, 
              GL_UNSIGNED_BYTE, background->ImageData);
 glWindowPos2i(X, Y);
 glDrawPixels(drawing->Width, drawing->Height, drawing->Format, 
              GL_UNSIGNED_BYTE, drawing->ImageData);
 glEnable(GL_DEPTH_TEST);
 glDisable(GL_BLEND);

هل هذا ما تبحث عنه؟

يمكنك استخدام المخزن المؤقت للاستنسل لهذه العملية. The Stencil Buffer هو مخزن مؤقت خاص يحمل معلومات لكل بكسل ، مشابه للمخزن المؤقت للعمق. على عكس المخزن المؤقت للعمق ، فإنك تقرر كيفية تغيير المخزن المؤقت للاستنسل أثناء الرسم وكيف يؤثر على قرار الاستخلاص في المخزن المؤقت للألوان أم لا. للقيام بذلك ، يمكنك تعيين الحالات المحددة قبل أي عملية رسم. هذا ما تفعله:

  • في الوقت الذي يمحو فيه المستخدمون ، ارسم المنطقة "المحوّة" إلى المخزن المؤقت للستنسل (باستخدام stencilop ، انظر أدناه). يمكنك استخدام أي وظيفة رسم GL لذلك.

  • في كل تمريرة عرض ، ارسم أولاً الخلفية (إذا كنت تريد ، يمكنك استخدام اختبار الاستنسل السلبي هنا لرسم الجزء "المحفور" فقط من الخلفية - قد يزيد من الأداء).

  • ثم ، قم بتمكين اختبار الاستنسل لجميع عمليات الرسم الأخرى. سيقوم OpenGL بعد ذلك فقط بالرسوم إلى المناطق "غير المرجحة".

الوظيفة لتعيين كيفية التأثير على المخزن المؤقت للاستنسل في الرسم (أو لا): glstencilfunc ()

الوظيفة لتعيين كيفية تأثر المخزن المؤقت للاستنسل نفسه بالرسم: glstencilop ()

شرح إضافي ، أيضًا مع الحجج الخاصة به:http://www.opengl.org/resources/code/samples/sig99/advanced99/notes/node117.html

باستخدام وضع glblendfunc (GL_ONE ، GL_ZERO) يمكن الأذن.

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