рдПрдХ рдмрд╛рд░ рдЬрдм рдореИрдВ рдПрдВрдбреНрд░реЙрдЗрдб рдХреЗ рд▓рд┐рдП рдПрдХ рдЧреЗрдо рд▓рд┐рдЦ рд░рд╣рд╛ рдерд╛, рддреЛ рдореБрдЭреЗ OpenGL ES 1.1 рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рднреА рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рд╣реИ, 2 рдбреА рдЧреНрд░рд╛рдлрд┐рдХреНрд╕, рдЖрдкрдХреЛ рдмрд╕ рдкреАрдПрдирдЬреА рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рдЦреАрдВрдЪрдирд╛ рд╣реЛрдЧрд╛, рдЬрд┐рд╕рдореЗрдВ рд╕реНрдХреЗрд▓ рдХрд░рдиреЗ, рдШреБрдорд╛рдиреЗ, рдкрд╛рд░рджрд░реНрд╢рд┐рддрд╛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реЛрдЧреАред рддрдм рдореИрдВрдиреЗ рдЗрд╕ рдкрд░ рд▓рдЧрднрдЧ рдПрдХ рд╕рдкреНрддрд╛рд╣ рдмрд┐рддрд╛рдпрд╛, рдФрд░ рд╢рд╛рдпрдж рдЗрд╕рд╕реЗ рднреА рдЕрдзрд┐рдХ, рдореБрдЭреЗ рдпрд╛рдж рдирд╣реАрдВ рд╣реИред рдпрд╣ рдореБрд╢реНрдХрд┐рд▓ рдерд╛ рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рдУрдкрдирдЬреАрдПрд▓ рд╕реЗ рдХреЛрдИ рд▓реЗрдирд╛-рджреЗрдирд╛ рдирд╣реАрдВ рдерд╛ред
Libgdx рд╕реНрд░реЛрдд рдХреЛрдб рдиреЗ
рдмрд╣реБрдд рдорджрдж рдХреА, рдЬрд┐рд╕рдореЗрдВ, рд╡реИрд╕реЗ, рд╕рднреА рдирд┐рдореНрди-рд╕реНрддрд░реАрдп OpenGL рдлрд╝рдВрдХреНрд╢рди рдбреЗрд╡рд▓рдкрд░ рд╕реЗ рдЫрд┐рдкреЗ рд╣реБрдП рд╣реИрдВред
рдЯрд╛рдЗрдореНрд╕ рдмрджрд▓ рд░рд╣реЗ рд╣реИрдВ, OpenGL ES 1.1 рдХреЛ рд╕рдВрд╕реНрдХрд░рдг 2.0 рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдЬреЛ рдХрд╛рдлреА рдЕрд▓рдЧ рд╣реИред рд╣рдореЗрдВ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐
рд╡реЗ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ
рд╢реЗрдб рд╣реИрдВ , рдФрд░ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдЙрдирдХреЗ рдмрд┐рдирд╛ рдХреНрдпреЛрдВред рдЗрд╕рдореЗрдВ рдлрд┐рд░ рдХрдИ рджрд┐рди рд▓рдЧрддреЗ рд╣реИрдВред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЖрд╕рд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ 2 рдбреА, рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдк QML рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
Image { source: "brick.png" opacity: 0.8 rotation: 90 }
рдФрд░ рдЕрдЧрд░ рдЖрдк C ++ рдореЗрдВ рд╕рдм рдХреБрдЫ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдХрдИ, рдХреЛрдб рдХреА рдХрдИ рдкрдВрдХреНрддрд┐рдпрд╛рдБ рдорд┐рд▓рддреА рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рд╕рдордЭрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ, рдЕрдЧрд░ рдЖрдк OpenGL рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдирд╣реАрдВ рд╣реИрдВред рдореИрдВрдиреЗ рдХреБрдЫ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЦреЛрдЬрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рдУрдкрдирдЬреАрдПрд▓ рдкрд░ рдПрдХ рдЖрд╡рд░рдг, рдЬреИрд╕реЗ рдХрд┐ libtdx, рдХреЗрд╡рд▓ Qt рдХреЗ рд▓рд┐рдП, рд▓реЗрдХрд┐рди рдХреЛрдИ рдлрд╛рдпрджрд╛ рдирд╣реАрдВ рд╣реБрдЖред рдЗрд╕рд▓рд┐рдП, рдореИрдВрдиреЗ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рдореЗрд░реЗ рд▓рд┐рдП рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВ рдПрдХ рдЫреЛрдЯрд╛ рдЖрд╡рд░рдг рд▓рд┐рдЦреВрдВрдЧрд╛ рдЬреЛ рд╕рднреА рдУрдкрдирдЧреИрд▓ рдХреЙрд▓ рдХреЛ рдЫреБрдкрд╛рддрд╛ рд╣реИ рдФрд░ рдЖрдкрдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ 2 рдбреА рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
GitHub рдЖрд╡рд░рдг рдХреЛрдбGitHub рдХреЗрд╕ рд╕реНрдЯрдбреАрдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдореЗрдВ рдЖрд╡рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ .pro рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдПрдХ рдкрдВрдХреНрддрд┐ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
include (opengl-qt/opengl-qt.pri)
OpenGLQt рд╕реЗ рдЗрдирд╣реЗрд░рд┐рдЯ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╡рд┐рдВрдбреЛ :: рд╡рд┐рдЬреЗрдЯ:
class Widget : public OpenGLQt::Widget { public: Widget(); protected: virtual void drawSprites(); };
рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдкрде рдФрд░ рдбрд┐рдЬрд╛рдЗрдирд░ рдореЗрдВ рдЙрд╕рдореЗрдВ рдЫрд╡рд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдкрд╛рд╕ рдХрд░реЗрдВред рдкреНрд░рд╛рд░рдВрдн рдЯрд╛рдЗрдорд░:
Widget::Widget() : OpenGLQt::Widget(10, "spritesheet.png") , m_counter(0) { startTimer(); }
рдбреНрд░реЙрд╕реНрдкреНрд░рд╛рдЗрдЯреНрд╕ () рд╡рд┐рдзрд┐ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░реЗрдВ:
void Widget::drawSprites() { static Sprite apple = {86, 118, 30, 30};
рдФрд░ рд╡рд╣ рд╕рдм рд╣реИред рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ, рд╣реИ рдирд╛? рдпрджрд┐ рдЖрдк рдЗрд╕ рдЖрд╡рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЕрдкрдиреЗ рд╕рднреА рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдХреЛ рдПрдХ рдкреАрдПрдирдЬреА рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд░рдЦрдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
TexturePacker рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдмрдврд╝рд╛рдирд╛ рд╣реИ: рдмрдирд╛рд╡рдЯ рдХреЛ рдПрдХ рдмрд╛рд░ рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдкрд░ рд╡реАрдбрд┐рдпреЛ рдореЗрдореЛрд░реА рдореЗрдВ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдЕрдВрдд рддрдХ рд╡рд╣рд╛рдВ рд░рд╣рддрд╛ рд╣реИред рдЬрдм рдЖрдк рдПрдХ рдЫрд╡рд┐ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЗрд╕ рдмрдирд╛рд╡рдЯ рдореЗрдВ рдЗрд╕рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рд╣реЛрдВрдЧреЗред

OpenGL рдХрд╛ рдереЛрдбрд╝рд╛ рд╕рд╛ рд╡рд┐рд╡рд░рдгред рд╡рд░реНрдЯреЗрдХреНрд╕ рд╢реЗрдбрд░:
uniform mat4 mvp_matrix; attribute vec4 a_position; attribute vec2 a_texcoord; attribute vec4 a_color; varying vec4 v_color; varying vec2 v_texcoord; void main() { gl_Position = mvp_matrix * a_position; v_texcoord = a_texcoord; v_color = a_color; }
рдЯреБрдХрдбрд╝реЗ рдЯреБрдХрдбрд╝реЗ рдХрд░рдирд╛:
#ifdef GL_ES #define LOWP lowp precision mediump float; #else #define LOWP #endif varying vec2 v_texcoord; varying LOWP vec4 v_color; uniform sampler2D texture; void main() { gl_FragColor = v_color * texture2D(texture, v_texcoord); }
рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдЖрд░рдВрдн рдХреЗ рджреМрд░рд╛рди рдПрдХ рдмрд╛рд░ рдЕрдзрд┐рдХрд╛рдВрд╢ рдУрдкрдирдЧреЗрд▓ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрд╕рдХреЗ рдмрд╛рдж, рдПрдХ рдЯрд╛рдЗрдорд░ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб 60 рдмрд╛рд░ рд╕реНрдХреНрд░реАрди рдЕрдкрдбреЗрдЯ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИ:
void Widget::startTimer() { m_timer.start(1000.0f / 60.0f, this); } void Widget::timerEvent(QTimerEvent *) { updateGL(); } void Widget::paintGL() { beginDraw(); drawSprites(); endDraw(); } void Widget::beginDraw() { m_idx = 0; glClear(GL_COLOR_BUFFER_BIT); glClearColor(m_background.r, m_background.g, m_background.b, m_background.a); } void Widget::endDraw() { glDrawArrays(GL_TRIANGLES, 0, m_idx / 2); }
рд╕рднреА рдЖрд░реЗрдЦрдг рдбреНрд░реЙрд╕реНрдкреНрд░рд┐рдЯреНрд╕ () рд╡рд┐рдзрд┐ рдореЗрдВ рд╣реЛрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдКрдкрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕рдореЗрдВ DrawSpriteArgs рд╕рдВрд░рдЪрдирд╛ рдХреЛ рднрд░рдирд╛ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдЫрд╡рд┐ рдХреЗ рд▓рд┐рдП drawSprite рдкрджреНрдзрддрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реИ рдЬрд┐рд╕реЗ рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдХреБрдЫ рдЧреИрд░-рдорд╛рдирдХ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЫрд╡рд┐ рдХреЛ рдХреЗрдВрджреНрд░ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдирд╣реАрдВ рдШреБрдорд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ, рдмрдирд╛рд╡рдЯ рдФрд░ рд░рдВрдЧреЛрдВ рдХреЗ рд╕рд░рдгрд┐рдпреЛрдВ рдореЗрдВ рднрд░ рд╕рдХрддреЗ рд╣реИрдВред рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╢реБрд░реВ рдХрд░рддреЗ рд╕рдордп рд╕рд░рдгрд┐рдпреЛрдВ рдХрд╛ рдЕрдзрд┐рдХрддрдо рдЖрдХрд╛рд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ QVector рдЬрдм рдпрд╣ рдмрдбрд╝рд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдореЗрдореЛрд░реА рдХреЗ рджреВрд╕рд░реЗ рднрд╛рдЧ рдореЗрдВ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ OpenGL рдХреЛ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╕реВрдЪрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛:
int vertexLocation = m_program->attributeLocation("a_position"); m_program->enableAttributeArray(vertexLocation); glVertexAttribPointer(vertexLocation, 2, GL_FLOAT, GL_FALSE, 0, &m_verts[0]); int texcoordLocation = m_program->attributeLocation("a_texcoord"); m_program->enableAttributeArray(texcoordLocation); glVertexAttribPointer(texcoordLocation, 2, GL_FLOAT, GL_FALSE, 0, &m_texCoords[0]); int colorLocation = m_program->attributeLocation("a_color"); m_program->enableAttributeArray(colorLocation); glVertexAttribPointer(colorLocation, 4, GL_FLOAT, GL_FALSE, 0, &m_colors[0]);
рдкреНрд░рдХреНрд╖реЗрдкрдг рдореИрдЯреНрд░рд┐рдХреНрд╕
рдпрд╣рд╛рдВ рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдпрд╣ рд╡рд┐рдВрдбреЛ рдЖрдХрд╛рд░ рдмрджрд▓рдиреЗ рдХреЗ рджреМрд░рд╛рди рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
void Widget::resizeGL(int w, int h) { glViewport(0, 0, w, h); QMatrix4x4 mat( 2.0f/w, 0, 0, -1, 0, 2.0f/h, 0, -1, 0, 0, -1, 0, 0, 0, 0, 1 ); m_program->setUniformValue("mvp_matrix", mat); }
рд╢рд╛рдпрдж рдпрд╣реА рд╕рдм рд╣реИред рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдЖрд╡рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдореИрдВ рдЕрддреНрдпрдзрд┐рдХ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рд╕рдордЭрдиреЗ рдФрд░ рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдХреЛрдб рдХрд╛ рдкрд░реАрдХреНрд╖рдг рд╡рд┐рдВрдбреЛрдЬ 7 (рдХреНрдпреВрдЯреА 4.8 рдорд┐рдиреАрдЬреАрдбрдмреНрд▓реНрдпреВ, рдПрдордПрд╕рд╡реАрд╕реА 2008), рдореИрдХ рдУрдПрд╕ рдПрдХреНрд╕ 10.8 (рдХреНрдпреВрдЯреА 5.1 рдХреНрд▓реИрдВрдЧ), рдиреЛрдХрд┐рдпрд╛ рдПрди 9 (рдХреНрдпреВрдЯреА 4.7), рдмреНрд▓реИрдХрдмреЗрд░реА 10 (рдХреНрдпреВрдЯреА 4.8) рдкрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдпрд╣ рд╣рд░ рдЬрдЧрд╣ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдЪрд▓рддрд╛ рд╣реИред
рдирд┐рд╖реНрдХрд░реНрд╖
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рди рдХреЗрд╡рд▓ рдореБрдЭреЗ рдЗрд╕реА рддрд░рд╣ рдХреА рд╕рдорд╕реНрдпрд╛рдПрдВ рдереАрдВ рдФрд░ рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рд▓реЗрдЦ рдХрд┐рд╕реА рдХреА рдорджрдж рдХрд░реЗрдЧрд╛, рдХрд┐ рдпрд╣ рдЫреЛрдЯрд╛ рдЖрд╡рд░рдг рдХрд┐рд╕реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдИрдВрдЯ рдмрди рдЬрд╛рдПрдЧрд╛ рдФрд░ рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рдЬреАрд╡рди рдЖрд╕рд╛рди рдмрдирд╛ рджреЗрдЧрд╛ред рдпрд╛ рд╢рд╛рдпрдж рдХрд┐рд╕реА рдХреЛ рдХреЛрдб рд╕реЗ рдХреБрдЫ рд▓реЗрдирд╛ рд╣реЛрдЧрд╛ - рдХреГрдкрдпрд╛ред рдЪреВрдВрдХрд┐ рдореИрдВ рдУрдкрдирдЧреНрд▓рд┐рд╢ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рдирд╣реАрдВ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реЛрдВред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╕реБрдзрд╛рд░ рдХреЗ рд▓рд┐рдП рд╕реБрдзрд╛рд░ рдпрд╛ рд╕реБрдЭрд╛рд╡ рд╣реИрдВ, рддреЛ рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рдорд╣рд╕реВрд╕ рдХрд░реЗрдВред