ãã®èšäºã¯ã
Qt 5.1ã®èšäº
OpenGL-ããŒã1ããã³
ããŒã2ã®ç¿»èš³ã§ãã
ããŒã1
ãã®èšäºã¯ã·ãªãŒãºã®æåã®èšäºã§ãã 圌女ã¯
Qt 5ã§ OpenGLã䜿çšããæ¹æ³ã瀺ããŸãã ãã®èšäºã§ã¯ãQtã§ã®OpenGLã®ãµããŒãã®æŽå²ã«ã€ããŠå°ã説æããŸãã æ¬¡ã«ã
Qt 5.1ã§å°å
¥ãããæ°æ©èœã®æåã®éšåã«ã€ããŠèª¬æããŸãã 以éã®èšäºã§ã¯ãããå€ãã®æ©èœãšãQtã䜿çšããŠOpenGLãæäœããæ¹æ³ã®ç°¡åãªäŸãããã€ã説æããŸãã
ïŒéåžžã«ïŒQtãšOpenGLã®ç°¡åãªæŽå²
Qtã«ã¯ãOpenGLã䜿çšããæç»ãµããŒãã®é·ãæŽå²ããããŸãã ã»ãšãã©ã®Qtéçºè
ã¯ã
QGLWidgetãšãããããOpenGLããŒã¹ã®ãšã³ãžã³ã«ã€ããŠã®èããæã£ãŠããŸãã ããã«ãããçã®OpenGLãæäœãããã
QPainter APIãæäŸããæ©èœã䜿çšãããã§ããŸãã ããã«å ããŠãQtã¯ããŸããŸãªOpenGLãªããžã§ã¯ãã®åšãã«ããã€ãã®äŸ¿å©ãªã©ãããŒãæäŸããŸãïŒ
QGLShaderProgram ã
QGLFramebufferObject ã
QGLBufferãªã©ã
Qt 5ãèšèšããéããããã®QGL *ã¯ã©ã¹ã¯ãå®äºããšããŒã¯ãããææ°ã®QOpenGL *ã¯ã©ã¹ã¯QtGuiã¢ãžã¥ãŒã«ã®äžéšã«ãªããŸããïŒ
翻蚳è
ã®ã¡ã¢ -以åã¯
QtOpenGLã§ããïŒã ãããã®å€æŽã®çç±ã¯ãQt Quick 2ã®æ°ããèŠèŠåãOpenGLã«åºã¥ããŠãããçŸåšQtã®ã°ã©ãã£ã«ã«è£œåã®äž»èŠãªéšåã§ããããã§ãã ããã«ãæ°ããQOpenGL *ã¯ã©ã¹ã¯ãå€ãQGL *ã¯ã©ã¹ãçŽæ¥çœ®ãæãããã®ãšããŠäœ¿çšã§ããŸãã
QtGuiã©ã€ãã©ãªã®QOpenGL *ã¯ã©ã¹ã䜿çšããããšããå§ãããŸãã
Qt 5.0ã¯ïŒåºæ¬çã«ïŒQt 4.8ãæäŸããOpenGLæ©èœã®åããµãã»ãããæäŸããŸãã ããã¯ãç¹ã«
Qt Quick 2ã§å¿
èŠãªæ©èœã®ããã«å¿
èŠã§ããã Qt 4.8ã®æ©èœã«å ããŠãQt 5.0ã¯ãä»»æã®ãã©ãããã©ãŒã ã§ã«ã¹ã¿ã OpenGLãŠã£ã³ããŠãšã³ã³ããã¹ããç°¡åã«äœæããããã®ããŒã«ãæäŸããŸãã
OpenGL Coreãããã¡ã€ã«ããµããŒãã§ããã³ã³ããã¹ããäœæããããã«ãããŸããŸãªãã©ãããã©ãŒã ã®æ©èœãæ°ã«ããå¿
èŠã¯ãããŸããã
QOpenGLContextã䜿çšããã ãã§ãçœé«ªãã身ã
å®ãããšãã§ããŸãïŒ
Qt 5.1ã§ã®åéºã¯ãOpenGLãšQtãã·ã³ãã«ã§ãšã¬ã¬ã³ãããããŠããŸãããã°æ¥œãããã®ã«ããããã®OpenGLæ©èœã®ãã¢ããå§ãŸããŸãïŒ ãã®ç®çã®ããã«ã
KDABã¯QtãšOpenGLã®å¢çã®æ¡å€§ã«å€é¡ã®æè³ãè¡ã£ãŠããŸããã
æ©èœãã©ãã§ãæ©èœïŒ
ççŽã«èšã£ãŠãäžéšã®ãã©ãããã©ãŒã ã§OpenGLã䜿çšããã®ã¯é£ããå ŽåããããŸã
ã ãããã®å°é£ã®äž»ãªçç±ã®1ã€ã¯ããšã³ããªãã€ã³ãã®ã¢ãã¬ã¹ãããã«ãæã§ã¯ãªãå®è¡æã«åçã«å²ãåœãŠãå¿
èŠãããããšã§ãïŒãªã³ã«ãŒããããå®è¡ã§ããå ŽåïŒã ããšãã°ãMicrosoft Windowsã§ã¯ãããŒãžã§ã³1.1以éã®OpenGLã§å°å
¥ããã颿°ã®ã¢ãã¬ã¹ãå®è¡æã«å²ãåœãŠãå¿
èŠããããŸãã ã€ãŸããææ°ã®OpenGLã§äœ¿çšãããã»ãŒãã¹ãŠã®é¢æ°ã«å¯ŸããŠå®è¡ããå¿
èŠããããŸãã
ãããã®åé¡ã解決ããããã«ãQtã«ã¯
QOpenGLContext :: GetProcAddressïŒïŒããã³
QOpenGLFunctionsãšãã䟿å©ãªãŠãŒãã£ãªãã£ãããã€ã
çšæãããŠããŸãã åè
ã¯ãšã³ããªãã€ã³ããæåã§å²ãåœãŠãããã«äœ¿çšã§ããŸãããåŸè
ã¯ãã®ã¡ãœãããOpenGL 2ããã³
OpenGL ES 2颿°ã®å
±éãµãã»ããã衚瀺ããã¯ã©ã¹ã§ãã ãããã®ãã«ããŒã¯å¯èœãªéãåªããŠããŸãã åé¡ã¯ãæäŸãããŠããã¡ãœããïŒOpenGL 2ããã³OpenGL ES 2ã®ãµãã»ããïŒã§QOpenGLFunctionsãå¶éãããŠããããšã§ãã ãšã³ããªãã€ã³ãã®æåå²ãåœãŠã¯éåžžã«é¢åãªäœæ¥ã§ããããšã©ãŒãçºçããŸãã ãŸãã¯ããããã®åé¡ã解決ãã
Glewã
GLeeãªã©ã®ãµãŒãããŒãã£ã©ã€ãã©ãªã®é¢æ°ã䜿çšã§ããŸãã 確ãã«ããããã®ãœãªã¥ãŒã·ã§ã³ã¯ãå¿
èŠãªæ©èœãšQtã§ã®äŸ¿å©ãªäœæ¥ïŒããšãã°ãããããŒã®é åºãèæ
®ããïŒãååŸããããã®åé¡ãåŒãèµ·ãããŸãã
QOpenGLContext :: versionFunctionsïŒïŒã䜿çšããŠãã ããïŒ ããã¯æ§ãããªå°ããªæ©èœã§ããOpenGL颿°ã®ã¢ãã¬ã¹ïŒãšã³ããªãã€ã³ãïŒã®ããŠãŒããã¢ãã¬ã€ã:)ãã®é¢æ°ã¯ãå¿
èŠãªããŒãžã§ã³ãšOpenGLãããã¡ã€ã«ã§ããªããžã§ã¯ãïŒå颿°ã®ã¡ãœããïŒãžã®ãã€ã³ã¿ãŒãååŸããããã«äœ¿çšã§ããŸãã ç°¡åãªäŸãèŠãŠã¿ãŸãããã ã¬ã³ããªã³ã°ãã
QWindowã®ãµãã¯ã©ã¹ããããšããŸãããã
OpenGL 4.3ã³ã¢ãããã¡ã€ã«ãäœæããæäŸããããã¹ãŠã®æ©èœã䜿çšããŸãã ãšãŠãç°¡åã§ãïŒ
Window::Window(QScreen * screen) : QWindow(screen) {
ããããã¯ã
QOpenGLFunctions_4_3_Coreãªããžã§ã¯ãã®ã¡ã³ããŒé¢æ°ã䜿çšã§ããŸãã äŸïŒ
ãã®ã³ãŒãã¯äœã«ã€ããŠã§ããïŒ ã芧ã®ããã«ãOpenGLã®ãã¹ãŠã®æ©èœããµããŒãããŠãããã©ââãããã©ãŒã ã§äœ¿çšããã®ã¯ç°¡åã§ãã ããã«ã
QOpenGLContext ã
QOpenGLFunctions_4_3_Coreãããã³åæ§ã®ã¯ã©ã¹ã¯ãæå¹ãªé¢æ°ãã€ã³ã¿ãŒãå«ãããã¯ãšã³ããé
åžããããšã«ããã颿°ã®äœ¿çšãæå°éã«æããŸãã ãŸãããã®ã¢ãããŒãã¯ããã©ãããã©ãŒã åºæã®é¢æ°ã¢ãã¬ã¹ãèªåçã«åŠçããŸãïŒããšãã°ãè€æ°ã®ã¹ã¬ãããšã³ã³ããã¹ããŸãã¯è€æ°ã®GPUã䜿çšããå ŽåïŒã ãããã®ã¯ã©ã¹ã®ã³ãŒãã¯è£å©ãŠãŒãã£ãªãã£ã䜿çšããŠèªåçã«çæããããããOpenGLã®æ°ããããŒãžã§ã³ããªãªãŒã¹ããããšãã«æŽæ°ããã®ã¯éåžžã«ç°¡åã§ãã
OpenGLæ¡åŒµ
OpenGLã«ã¯äººæ°ã®ãã
æ¡åŒµãšã³ãžã³ãããããã³ããŒã¯æ°ããæ©èœãŸãã¯å®éšçãªæ©èœãšAPIãå°å
¥ããŠãããããæçšã§ããèããããŠãããã©ããã確èªã§ããŸãã æ®å¿µãªãããæ¡åŒµæ©èœãæ°ãã颿°ãå°å
¥ããå Žåã¯ãã¢ãã¬ã¹ãšä»ã®OpenGL颿°ïŒäžèšã®ããã«ïŒãæå®ããå¿
èŠããããŸãã
OpenGLæ¡åŒµæ©èœã䜿çšããã«ã¯ã2ã€ã®æ®µéãçµãå¿
èŠããããŸãã Qtã¯äž¡æ¹ã®ã¹ãããã§åœ¹ç«ã¡ãŸãïŒ
ã¹ããŒãž1ïŒ
çŸåšã®å®è£
ãå¿
èŠãªæ¡åŒµæ©èœããµããŒãããŠããããšã確èªããŸãã æ¡åŒµæ©èœãæ°ããAPIãå°å
¥ããå Žåããšã³ããªãã€ã³ããæå®ããŸãã æ¡åŒµæ©èœããµããŒããããŠããããšã確èªããã«ã¯ã
QOpenGLContext :: hasExtensionïŒïŒã¡ãœããã䜿çšããå¿
èŠããããŸãã ããã«ããµããŒããããŠããæ¡åŒµæ©èœã®å®å
šãªãªã¹ããååŸããã«ã¯ã
OpenGLContext :: extensionsïŒïŒã䜿çšã§ããŸãã
ã¹ããŒãž2ïŒ
2çªç®ã®æ®µéã§ã¯ãå€ãå人ã§ãã
QOpenGLContext :: GetProcAddressïŒïŒã¡ãœããã䜿çšããå¿
èŠããããŸãã Qt 5.1ã§ã¯ã
QtOpenGLExtensionsã¢ãžã¥ãŒã«ããããæ
åœããŸãã ãã®ã¢ãžã¥ãŒã«ã¯éçã©ã€ãã©ãªã§ããã
Khronosã¬ãžã¹ããªã® OpenGLæ¡åŒµïŒæ°ããAPIãå°å
¥ïŒããšã«ã¯ã©ã¹ãå«ãŸããŠã
ãŸã ã OpenGLæ¡åŒµæ©èœã䜿çšããã«ã¯ã次ã®ãããªã³ãŒãã䜿çšããŸãã
ã³ã¢OpenGLæ©èœãšåæ§ã«ãæ¡åŒµæ©èœã®ã³ãŒããçæããããããå°æ¥ã®æŽæ°ã容æã§ãã
ããŒã2
é ç¹é
åãªããžã§ã¯ã
Qtã«ã¯ã
é ç¹ããšã®å±æ§ããŒã¿ã
èŠçŽ ã€ã³ããã¯ã¹ãããã¡ãŒãªã©ãããŸããŸãªã¿ã€ãã®OpenGLãããã¡ãŒãªããžã§ã¯ãã®ç®¡çã«åœ¹ç«ã€
QOpenGLBuffer ïŒä»¥åã¯
QGLBuffer ïŒããã
ãŸã ã OpenGLã«ã¯ã
é ç¹ãããã¡ãŒãªããžã§ã¯ãïŒVBOïŒã»ãããæ¯æŽãã
ãªããžã§ã¯ãé ç¹é
åïŒVAOïŒãšåŒã°ããã¿ã€ãã®ç¹å¥ãªã³ã³ãããŒããããŸãã
KDABã¯ã
QOpenGLVertexArrayObjectã¯ã©ã¹ã§è€æ°ã®VAOãã«ãã»ã«åããQt 5.1ã®ã³ãŒãã远å ããŸããã ãã®ã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ããã€ã³ããããšãåŸã§èšå®ããé ç¹ä»æ§ã®ç¶æ
ããèšæ¶ãããããOpenGLã«æç€ºããŸãã VAOèªäœã忥ç¶ããã ãã§ãåŸã§å¿
èŠãªç¶æ
仿§ãéåžžã«è¿
éã«åŸ©å
ã§ããŸãã ããã«ãããã¬ã³ããªã³ã°é¢æ°ã§ã¬ã³ããªã³ã°ãããããªããžã§ã¯ããã®é ç¹ç¶æ
ãéåžžã«ãã°ããåãæ¿ããããšãã§ããŸãã
翻蚳è
ã®ã¡ã¢ç§ã®æèŠã§ã¯ãããã€ã³ããã®ä»£ããã«ããããããéçºè
ãã«ãšã£ãŠãã銎æã¿ã®ããããã·ã¢èªãåè©ããã€ã³ããã䜿çšããæ¹ãé©åã§ãã
void Scene::initialize() {
翻蚳è
ã®ã¡ã¢ãããããšç¹°ãè¿ããã¯ãæç€ºãç¹°ãè¿ãããã®ç®èãªã¡ã¿ãã¡ãŒã§ãã ããã¯ãã»ãšãã©ã®ãã©ã³ãã®ã·ã£ã³ããŒã®ããã±ãŒãžã«ç€ºãããŠãããã¬ãŒãºãwashãããããç¹°ãè¿ããã«ç±æ¥ããŠããŸãã
VAOã¯OpenGL 3ããå°å
¥ãããŸããããCore Profileãåãã3.1ããå€ãOpenGLããŒãžã§ã³ã«ã¯å¿
é ã§ãã ããã«ãVAOã¯ããããã
GL_ARB_vertex_array_objectãŸãã¯
GL_OES_vertex_array_objectæ¡åŒµãšããŠOpenGL 2ããã³OpenGL ES 2ã§å©çšã§ããŸãã QOpenGLVertexArrayObjectã¯ã©ã¹ã¯ãå¿
èŠã«å¿ããŠäž»ãªæ©èœã䜿çšããïŒå¯èœãªå ŽåïŒããæ¡åŒµæ©èœïŒããå ŽåïŒãåç
§ããŸãã
VAOã䜿çšãããšãèŠèŠåã³ãŒãã倧å¹
ã«ç°¡çŽ åãããçç£æ§ãåäžããŸãã OpenGLãã©ã€ããŒã¯ãããå€ãã®ãããã¡ãŒæäœãå®è¡ããå Žåãããæ€èšŒãã§ãã¯ãå°ãªãããŸãã
ããŒã3,4,5è¿æ¥å
¬é... PSïŒå€§ããªãªã¯ãšã¹ãããã¹ãŠã®æäœçããã³ææ³çãªèª€ããããã³ç¿»èš³ã®äžæ£ç¢ºãã¯ãLANçµç±ã§å ±åããå¿
èŠããããŸãã ããããå©çšå¯èœã«ãªã£ããããã¹ãŠãæ¯é
ããŸãã