Pyglet OpenGL رسم مكافحة الإنقاذ
-
02-10-2019 - |
سؤال
لقد كنت أبحث حولها عن طريقة لمكافحة الخطوط في OpenGL ، ولكن لا يبدو أن أيًا منها يعمل ... إليك بعض رمز المثال:
import pyglet
from pyglet.gl import *
window = pyglet.window.Window(resizable=True)
@window.event
def on_draw():
window.clear()
pyglet.gl.glColor4f(1.0,0,0,1.0)
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
glEnable (GL_BLEND)
glEnable (GL_LINE_SMOOTH);
glHint (GL_LINE_SMOOTH_HINT, GL_DONT_CARE)
glLineWidth (3)
pyglet.graphics.draw(2, pyglet.gl.GL_LINES,
('v2i', (10, 15, 300, 305))
)
pyglet.app.run()
هل يمكن لأي شخص أن يرى ما أفعله خطأ؟
المحلول
السماح لـ Pyglet باستخدام عينة إضافية قد تساعد. قم بتغيير خط النافذة إلى هذا:
config = pyglet.gl.Config(sample_buffers=1, samples=4)
window = pyglet.window.Window(config=config, resizable=True)
هذا يعمل بالنسبة لي.
نصائح أخرى
من الصعب بعض الشيء أن أقول بالتأكيد. أول شيء ربما هو تغيير تلميحك من gl_dont_care إلى gl_nicest. ربما لن تحدث فرقًا كبيرًا مع معظم بطاقات الرسومات ، ولكنها قد تساعد قليلاً.
بخلاف ذلك ، من الصعب القول بعض الشيء. إليك القليل من التعليمات البرمجية (في C ++ ؛ آسف):
void draw_line(float y_offset) {
glBegin(GL_LINES);
glColor3f(1.0f, 1.0f, 1.0f);
glVertex3f(-1.0f, 0.0f+y_offset, -1.0f);
glVertex3f(1.0f, 0.1f+y_offset, -1.0f);
glEnd();
}
void draw() {
glClearColor(0.0f, 0.0f, 0.2f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum(-1.2f, 1.2f, -0.2f, 0.2f, 0.8f, 5.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glEnable(GL_DEPTH_TEST);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glLineWidth(3.0f);
glDisable(GL_LINE_SMOOTH);
draw_line(0.0f);
glEnable(GL_LINE_SMOOTH);
glHint(GL_LINE_SMOOTH_HINT, GL_DONT_CARE);
draw_line(-0.1f);
glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);
draw_line(-0.2f);
glFlush();
}
وهنا ما أحصل عليه كإخراج من ذلك:
يبدو الفرق عند تشغيل خطوط الخط واضحًا. الفرق بين gl_dont_care و gl_nicest هو (على الأكثر) أ كثير أقل من ذلك.
لا تنتمي إلى StackOverflow