برنامج OpenGL ES فون - رسم خطوط المضادة مستعارة
-
06-07-2019 - |
سؤال
وعادة، وكنت تستخدم شيئا مثل:
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_BLEND);
glEnable(GL_LINE_SMOOTH);
glLineWidth(2.0f);
glVertexPointer(2, GL_FLOAT, 0, points);
glEnableClientState(GL_VERTEX_ARRAY);
glDrawArrays(GL_LINE_STRIP, 0, num_points);
glDisableClientState(GL_VERTEX_ARRAY);
وانها تبدو جيدة في محاكاة فون، ولكن على اي فون خطوط الحصول رقيقة للغاية وث / س أي التعرج المضادة.
وكيف تحصل AA على iPhone؟
المحلول
ويمكن للمرء أن تحقيق تأثير مضاد التعرج بثمن بخس جدا باستخدام القمم مع التعتيم 0. وإليك مثال صورة لشرح:
ومقارنة مع AA:
ويمكنك قراءة ورقة حول هذا هنا:
http://research.microsoft.com/en- لنا / أم / الناس / هوب / overdraw.pdf
هل يمكن أن تفعل شيئا على هذا النحو:
// Colors is a pointer to unsigned bytes (4 per color).
// Should alternate in opacity.
glColorPointer(4, GL_UNSIGNED_BYTE, 0, colors);
glEnableClientState(GL_COLOR_ARRAY);
// points is a pointer to floats (2 per vertex)
glVertexPointer(2, GL_FLOAT, 0, points);
glEnableClientState(GL_VERTEX_ARRAY);
glDrawArrays(GL_TRIANGLE_STRIP, 0, points_count);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_COLOR_ARRAY);
نصائح أخرى
وابتداء من عام <م> دائرة الرقابة الداخلية الإصدار 4.0 م> لديك حلا سهلا، فمن الممكن الآن لاستخدام الحواف لكامل المشهد برنامج OpenGL ES مع بضعة أسطر من التعليمات البرمجية المضافة. (وتقريبا أي خسارة الأداء، على الأقل على GPU SGX).
لرمز يرجى قراءة ما يلي أبل ديف المنتدى الموضوع . وهناك أيضا بعض الصور عينة كيف يبدو بالنسبة لي على بلدي بلوق.
وأنها ليست مثالية كما أنها ليست جميلة مثل تلك التي كنت قد تعادل مع كور الرسومات، ولكنها جيدة جدا. أنا فعلا رسم نفس المنوال (القمم) مرتين - مرة واحدة مع أكبر الملمس واللون، ثم مع نسيج أصغر والأبيض الشفاف
وهناك التحف عندما تتداخل خطوط محكم جدا وأشعة الفا تبدأ تتراكم.
ونهج واحد حول هذا القيد هو tessellating الخطوط الخاصة بك إلى شرائح مثلث محكم (كما رأينا هنا ).
والمشكلة هي أن على بينغل فون يجعل لكائن الإطار عازلة بدلا من المخزن المؤقت الإطار الرئيسي وكما أفهمها FBO للا تدعم مولتيسامبلينغ.
وهناك العديد من الحيل التي يمكن القيام به، مثل تقديم لFBO آخر في ضعف حجم العرض ومن ثم الاعتماد على تصفية الملمس لتسهيل الامور، لا شيء لقد حاولت على الرغم من ذلك لا يمكن التعليق على مدى يعمل هذا.
وأتذكر على وجه التحديد جدا لأنني حاولت ذلك وليس هناك طريقة بسيطة للقيام بذلك باستخدام OpenGL على اي فون. يمكنك رسم باستخدام CGPaths وCGContextRef، ولكن ذلك سيكون أبطأ بكثير.
ووضع هذا في بلدكم تقديم طريقة وعازلة setUpFrame ... سوف تحصل ظهور مكافحة مستعارة.
/*added*/
//[_context presentRenderbuffer:GL_RENDERBUFFER];
//Bind both MSAA and View FrameBuffers.
glBindFramebuffer(GL_READ_FRAMEBUFFER_APPLE, msaaFramebuffer);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER_APPLE, framebuffer );
// Call a resolve to combine both buffers
glResolveMultisampleFramebufferAPPLE();
// Present final image to screen
glBindRenderbuffer(GL_RENDERBUFFER, _colorRenderBuffer);
[_context presentRenderbuffer:GL_RENDERBUFFER];
/*added*/