ãã®æçš¿ã§ã¯ã宣èšåQMLèšèªã®èŠçŽ ã§OpenGLã·ã§ãŒããŒã䜿çšããæ¹æ³ã«ã€ããŠèª¬æããŸãã QML 2.0ã®å°æ¥ã®ããŒãžã§ã³ã§ã¯ãã°ã©ãã£ã«ã«ã€ã³ã¿ãŒãã§ã€ã¹èŠçŽ ãã¬ã³ããªã³ã°ããããã®ããã¯ãšã³ããšããŠOpenGLãåºã䜿çšããäºå®ã§ããããããã®ãããã¯ã¯é¢é£æ§ããããŸãã ã·ã§ãŒããŒã®äœæã¯ç°¡åãªãããã¯ã§ã¯ãããŸããããã®æçš¿ã®ç®çã¯ããŸããèªãã åŸãããã«èªåèªèº«ã®ããã«äœãé¢çœãããšãããŠãå®éšããŠãããšãã°æ¬¡ã®äŸãååŸã§ããããã«ããããšã§ãã

æåŸã«ããã®ãããã¯ãããã«æ·±ãç 究ããããã®è³æãèŠãããšãã§ãã䟿å©ãªãªã³ã¯ãæäŸããŸãããã¡ããèå³ãããå Žåã¯ãããã«èå³æ·±ãã·ã§ãŒããŒãå®è£ ããããããQMLèšèªã®èŠçŽ ãšäžç·ã«äœ¿çšããŸãã ShaderEffectItem ãOpenGLãªã©ã䜿çšããå€ãã®Qt3Dã¯ã©ã¹ãªã©ãã·ã§ãŒããŒã®æäœã¯ãããŸããŸãªQMLèŠçŽ ãäŸãšããŠäœ¿çšããããšãæ€èšã§ããŸãã ãã®æçš¿ã§ã¯ã
ShaderEffectItem
èŠçŽ ãš
ShaderEffectItem
ã䜿çšããããã€ãã®äŸã瀺ããŸãã
以äžã¯ããã®èšäºå šäœã®æŠèŠã§ãã
ShaderEffectItemãšShaderEffectSourceã®èšå®
å°ãã·ã§ãŒããŒçè«
QMLèŠçŽ ãšã·ã§ãŒããŒã®é¢é£ä»ã
äŸ1.ã·ã§ãŒããŒã䜿çšããŠã°ã©ããŒã·ã§ã³ãå®è£ ãã
äŸ2.1æãåçŽãªã¢ãã¡ãŒã·ã§ã³
äŸ2.2ãã¢ãã¡ãŒã·ã§ã³ã䜿çšããã¡ãã¥ãŒã®äœæ
äŸ3.ããŠã¹ãã€ã³ã¿ãŒã«å¿ããŠãã¯ã¹ãã£é åãéžæãã
äŸ4. 2ã€ã®ç»åã®æ··å
ãããã«
䟿å©ãªãªã³ã¯
å¿ èŠãªèŠçŽ ãã€ã³ã¹ããŒã«ããããšããå§ããŸãããã
å¿ èŠãªãã©ã°ã€ã³ãã€ã³ã¹ããŒã«ãã
æåã«ãOpenGLã®ãã¹ãŠã®ã³ã³ããŒãã³ããã€ã³ã¹ããŒã«ãããã©ããã確èªããå¿ èŠããããŸãã
1ïŒ ãªã³ã¯ããã©ããšãshaderspluginãããgitãªããžããªå ã®ã¢ãã¬ã¹ã衚瀺ãããŸãã äœãå€ãã£ãŠããªãå Žåã圌ã¯æ¬¡ã®ããã«ãªã£ãŠããŸãã
git://gitorious.org/qt-labs/qml1-shadersplugin.git
2ïŒ
git clone git://gitorious.org/qt-labs/qml1-shadersplugin.git
3ïŒãã©ã«ããŒã«ç§»åããŠãã€ã³ã¹ããŒã«ãè¡ããŸãïŒããã¯Linuxã§è¡ãæ¹æ³ã§ããOSã§åæ§ã®èŠçŽ ãã©ã®ããã«ã€ã³ã¹ããŒã«ããããã確èªããŠãã ããïŒã OpenGLã³ã³ããŒãã³ãããªãå Žåãã€ã³ã¹ããŒã«ã«åé¡ããããŸãã ãã®ãã§ãã¯ãé£ããå Žåã¯ã空ã®Qtã¢ããªã±ãŒã·ã§ã³ãäœæãã次ã®è¡ãè¿œå ããŠãã ããïŒ
QT += declarative opengl
ãããžã§ã¯ããã¡ã€ã«ïŒ* .proïŒã«è¿œå ããŸãã ãã¹ãŠãã³ã³ãã€ã«ãããã°ãã€ã³ã¹ããŒã«äžã«åé¡ã¯ãªãã¯ãã§ãã
å°ãã·ã§ãŒããŒçè«
ã·ã§ãŒããŒã®æŠå¿µã«ç²ŸéããŠããå Žåã¯ããã®å°ããªç« ãã¹ãããã§ããŸãã ãã®äžã§ããã®ãããã¯ã®ç°¡åãªæŠèŠã説æããŸãã ã·ã§ãŒããŒãå¿ èŠãªçç± ç°¡åã«èšãã°ãã·ã§ãŒããŒã䜿çšãããšãããã°ã©ããŒã¯ããªããã£ããã¬ã³ããªã³ã°ããããã»ã¹ã«ãä»å ¥ãã§ããŸãã å®éã®ã³ãŒããèšè¿°ããŠãã³ã³ãã¢ã®ã¹ããŒãžïŒä»¥äžã§èª¬æããŸãïŒãå€æŽããŸãã ã·ã§ãŒããŒãäœæããããã«ãOpenGLå§å¡äŒã«ãã£ãŠäœæãããGLSLïŒOpenGL Shading LanguageïŒããããŸãã ãã®æ§æã¯ããã°ã©ãã³ã°èšèªCã«åºã¥ããŠããŸããGLSLã¯ãããã°ã©ããOpenGLãã€ãã©ã€ã³ã®ããã°ã©ã å¯èœãªãã€ã³ããå¶åŸ¡ã§ããããã«ç¹å¥ã«èšèšãããŸããã 次ã®å³ã«ããªãã·ã§ã³ã³ã³ãã€ãŒã®1ã€ã瀺ããŸãã

ãªããžã§ã¯ãã®å é ã¯ãã€ãã©ã€ã³ã«æž¡ãããŸãã æåã«ã座æšå€æïŒé ç¹å€æïŒãå®è¡ãããŸã-å ¥ã£ãŠããé ç¹ã®ã¯ãŒã«ãããã¥ãŒãããã³æ圱ãããªãã¯ã¹ã®é©çšã ããã¯é ç¹ã·ã§ãŒããŒã«é©çšãããŸãã ãããã®æäœãå®è¡ããåŸãããªããã£ãã®ã¢ã»ã³ããªïŒã¢ã»ã³ããªïŒãéå§ãããŸãããã®æ®µéã§ã空é座æšïŒxãyãzïŒã¯æ¬¡å ïŒ4 x 4ïŒã®ãããªãã¯ã¹ã䜿çšããŠå€æãããŸãã äž»ãªã¿ã¹ã¯ã¯ã3次å ïŒäžçïŒåº§æšããç»é¢ã®2次å 座æšãååŸããããšã§ãã ãã€ãã©ã€ã³ã®ãã®éšåã§ã¯ãé ç¹ãäžè§åœ¢ã«ã°ã«ãŒãåãããã©ã¹ã¿ã©ã€ãºïŒã©ã¹ã¿ã©ã€ãºïŒã«éãããŸãã ã©ã¹ã¿ã©ã€ã¶ã¯ãäžè§åœ¢ããã©ã°ã¡ã³ãïŒãã¯ã»ã«ïŒã«åå²ãããã¯ã¹ãã£åº§æšãšè²ãè£éãããŸãã 次ã«ããã©ã°ã¡ã³ãã·ã§ãŒããŒã®æ©èœããããŸãã 圌ã¯ãã¹ã¯ãªãŒã³ã«æ圱ãããè¡šé¢ã®èŒªéã«å²ãŸããé åå ã§ãã¹ã¯ãªãŒã³ã®åãã¯ã»ã«ã®è²ã決å®ãã責任ããããŸãã ãããã®ãã¹ãŠã®ã¡ãœãããåŠçããåŸãçµæã®ãã©ã°ã¡ã³ãã¯ãã¬ãŒã ãããã¡ã«é 眮ããããã®åŸç»é¢ã«è¡šç€ºãããŸãïŒãã¯ã»ã«ã®æŽæ°ïŒã
æ¢ã«ç解ããããã«ãã·ã§ãŒããŒã«ã¯2ã€ã®ã¿ã€ãããããŸããé ç¹ãšãã©ã°ã¡ã³ãïŒãŸãã¯ãã¯ã»ã«ãšãåŒã°ããŸãïŒã§ãã é ç¹ã·ã§ãŒããŒã¯ä»¥åã«å®è¡ãããåé ç¹ãåŠçããŸããããã©ã°ã¡ã³ãã·ã§ãŒããŒã¯ãã¯ã»ã«ããšã«å®è¡ãããŸãããã©ã°ã¡ã³ãã·ã§ãŒããŒã«ã¯ãè²ïŒ
.r, .g, .b, .a
ïŒã深床ã ãã¯ã¹ãã£åº§æš ïŒ
.x, .y, .z, .w
ãïŒãªã©ã®ç¹å®ã®å±æ§ã»ãããå²ãåœãŠãã
.x, .y, .z, .w
ãŸãã¯
.s, .t, .p, .q
ïŒã ã·ã§ãŒããŒãžã®ãšã³ããªãã€ã³ãã¯ã
void main()
é¢æ°ã§ãã ããã°ã©ã ãäž¡æ¹ã®ã¿ã€ãã®ã·ã§ãŒããŒã䜿çšããå Žåã2ã€ã®äž»èŠãªãšã³ããªãã€ã³ãããããŸãã
main
é¢æ°ã«å ¥ãåã«ãã°ããŒãã«å€æ°ãåæåãããŸãã GLSLã¯ç¹å¥ãªã¿ã€ãã®å€æ°ãå®çŸ©ããŸãïŒ
uniform-ã·ã§ãŒããŒãšå€éšããŒã¿ã®æ¥ç¶ïŒQMLã®å Žåã¯èŠçŽ ã®ããããã£ã«ãªããŸãïŒ;ãã®ã¿ã€ãã®å€æ°ã¯èªã¿åãå°çšã§ããããšã«æ³šæããŠãã ããã
varying
-ãã®ã¿ã€ãã®å€æ°ã¯ããã©ã°ã¡ã³ãã·ã§ãŒããŒãé ç¹ã·ã§ãŒããŒã«æ¥ç¶ãããããã€ãŸããé ç¹ã·ã§ãŒããŒãããã©ã°ã¡ã³ãã·ã§ãŒããŒã«ããŒã¿ã転éããããã«å¿ èŠã§ãã é ç¹ã·ã§ãŒããŒã§ã¯å€æŽã§ããŸããããã©ã°ã¡ã³ãã·ã§ãŒããŒã§ã¯èªã¿åãå°çšã§ãã
attribute
-ã°ããŒãã«ã¹ã³ãŒãå€æ°ã
ãŸããGLSLèšèªã®ããã€ãã®èŠçŽ ã«èšåããå¿ èŠããããŸãããããã®èŠçŽ ã¯ã以äžã®äŸã«ãããŸãã
sampler2D
ãã¯ã¹ãã£ãè¡šãGLSLèšèªã®ã¿ã€ãã®1ã€ïŒsampler1Dãsampler3DãsamplerCubeãsampler1Dshadowãsampler2DshadowããããŸãïŒã
vec4 texture2D(sampler2D s, vec2 coord)
-ãã¯ã¹ãã£åº§æš
coord
䜿çšããŠããã¯ã¹ãã£
s
ãããã¯ã»ã«ãèªã¿åãããã«äœ¿çšãããé¢æ°ã
gl_FrontColor
ã¯ãæçµçãªã«ã©ãŒãã¯ã¹ãã£ããŒã¿ãæžã蟌ãŸãããã©ã°ã¡ã³ãã·ã§ãŒããŒã§ã®ã¿äœ¿çšå¯èœãªãã¯ãã«ã§ãã
ãŸããGLSLã¯ãç¹ã«ãã¯ãã«ãšè¡åãæäœããããã®ãèšç®æåã®å€ãã®çµã¿èŸŒã¿é¢æ°ãå®çŸ©ããŠããããšã«ã泚æããŠãã ããã 以äžã®äŸã®åæã®éçšã§ãããã€ãã®æ©èœã«ã€ããŠèª¬æããŸãã
QMLèŠçŽ ãšã·ã§ãŒããŒã®é¢é£ä»ã
ã·ã§ãŒããŒãQMLèŠçŽ ãšé£æºããããã®å¿ é èŠä»¶ã¯ã QDeclarativeViewã¯ã©ã¹ã®ãªããžã§ã¯ãã«ã¬ã³ããªã³ã°ããããã«OpenGLãã€ã³ã¹ããŒã«ããããšã§ãã
QmlApplicationViewer viewer; ... QGLWidget* glWidget = new QGLWidget(format); ... viewer.setViewport(glWidget); ...
ãã®ã³ãŒãã¯ãQtCreatorã§ïŒQt Quickã¢ããªã±ãŒã·ã§ã³ãŠã£ã¶ãŒãã«ãã£ãŠïŒçæãããã¢ããªã±ãŒã·ã§ã³ã®ã¡ã€ã³é¢æ°
main
ãã
QDeclarativeView
ãŸã
QDeclarativeView
QmlApplicationViewer
ã
QmlApplicationViewer
ã¯ã©ã¹
QmlApplicationViewer
QDeclarativeView
ããç¶æ¿ãã
QDeclarativeView
ã åäŸã®åŸãå®å šãªãœãŒã¹ã³ãŒããžã®ãªã³ã¯ãæäŸããŸãã
äžèšã®ããã«ãOpenGLã·ã§ãŒããŒã§ã®äœæ¥ã瀺ãããã«ã
ShaderEffectItem
èŠçŽ ã䜿çšãããŸããããã«ãããOpenGLã¡ã«ããºã ã䜿çšããŠç»é¢äžã®ããŸããŸãªQMLèŠçŽ ã®è¡šç€ºãå€æŽã§ããŸãã
Qt.labs.shaders 1.0
ã¢ãžã¥ãŒã«ã§å©çšã§ããŸãïŒéçºäžã§ãïŒããä»ã§ã¯äœ¿çšããããšãã§ããŸãã é ç¹ã·ã§ãŒããŒã³ãŒããšãã©ã°ã¡ã³ãã·ã§ãŒããŒã³ãŒããèšè¿°ããããã«ãïŒ
string
åã®ïŒããããã£fragmentShaderãšvertexShaderãããããå®çŸ©ãããŸãã
ShaderEffectSource
ãã·ã§ãŒããŒã§äœ¿çšã§ããQMLã³ã³ããŒãã³ããæå®ããããã«å¿ èŠã§ãã äž»ã«sourceItemããããã£ãšhideSourceããããã£ã䜿çšããŸã ã 1ã€ç®ã¯ãã·ã§ãŒããŒã«ãã£ãŠã圱é¿ãåãããç¹å®ã®QMLèŠçŽ ïŒãã®èå¥åïŒã瀺ãã
hideSource
ã¯ãã·ã§ãŒããŒå¹æãé©çšããããšãã«å ã®èŠçŽ ãé衚瀺ã«ãªãããšããèšããŸããã
1ã€ä»¥äžã®
ShaderEffectItems
ãå¥ã®
ShaderEffectItems
ã®ãœãŒã¹ãšããŠå®çŸ©ã§ããŸããã
ShaderEffectItems
ã
source
ã§å®çŸ©ãããèŠçŽ ã®åãšããŠå®£èšããªãã§ãã ãããããã¯åæç»ã«ãŒãã«ã€ãªããå¯èœæ§ãé«ãããã§ãã
QMLã«ã¯ïŒ
property
ã䜿çšããŠïŒèŠçŽ ã®ç¬èªã®ããããã£ãå®çŸ©ããæ©èœããããã·ã§ãŒããŒããã°ã©ã ã®å€æ°ãšããŠã䜿çšã§ããŸãã ããã¯ãååãäžèŽããã·ã§ãŒããŒå ã®å€æ°ãæ¢ã«èšåãããŠãã
uniform
æå®åããããããã€ã³ãã£ã³ã°ã§å®£èšãããŠããå Žåã«èªåçã«çºçããŸãã äŸãèŠããšããã®ç¬éã¯ããã«æããã«ãªããŸãã
ããã»ã¹å šäœãå¯èœãªéãæœè±¡çã«èãããšãQMLèŠçŽ ã®ã°ã©ãã£ãã¯è¡šçŸããã¯ã¹ãã£ã«ãã£ãŠé ç¹ã·ã§ãŒããŒãšãã©ã°ã¡ã³ãã·ã§ãŒããŒã«éä¿¡ãããæçµçµæã衚瀺ãããç»é¢ã«è¡šç€ºãããŸãã ãããã£ãŠãã·ã§ãŒããŒããã°ã©ã ã§ãã®ãã¯ã¹ãã£ã®ã¬ã³ããªã³ã°ãå€æŽã§ããŸãïŒããããã·ã§ãŒããŒãå¿ èŠãªçç±ã«æ»ããŸãïŒã
次ã«ãããã€ãã®äŸãæ€èšããããã€ãã®èª¬æãããŸãã ãããªã¢ã«ãè€éã«ããªãããã«ãã©ãã§ããã©ã°ã¡ã³ãã·ã§ãŒããŒã®äœæäŸã®äœæ¥ã瀺ããŸããã€ãŸãããã¯ã»ã«ã䜿çšããŸãã
äŸ1.ã·ã§ãŒããŒã䜿çšããŠã°ã©ããŒã·ã§ã³ãå®è£ ãã
éåžžã«ç°¡åãªäŸããå§ããŸãããã QMLã«ã¯ããªãäžè¬çãªRectangleèŠçŽ ãããã
gradient
ããããã£ããããŸãã 以äžã®äŸã§ã¯ãã·ã§ãŒããŒã¡ã«ããºã ã䜿çšããŠã°ã©ããŒã·ã§ã³ãå®çŸããæ¹æ³ã瀺ããŸãã ãããã£ãŠã360
ShaderEffectItem
360ã®
Rectangle
èŠçŽ ãäœæããã
ShaderEffectItem
èŠçŽ ã
Rectangle
åãšããŠè¿œå ãã
parent
å€ãæå®ãã
anchors.fill
ããããã£ãè¿œå ããå¿ èŠããããŸãã ãããã£ãŠãã·ã§ãŒããŒã¯èŠªèŠçŽ å šäœããã«ããŒããããšèšããŸãã ã³ãŒãã¯æ¬¡ã®ãšããã§ãã
import QtQuick 1.0 import Qt.labs.shaders 1.0 Rectangle { width: 360 height: 360 ShaderEffectItem { anchors.fill: parent fragmentShader: " varying highp vec2 qt_TexCoord0; void main(void) { lowp vec4 c0 = vec4( 1.0, 1.0, 1.0, 1.0 ); lowp vec4 c1 = vec4( 1.0, 0.0, 0.0, 1.0 ); gl_FragColor = mix( c0, c1, qt_TexCoord0.y ); } " } }
次ã«ã
fragmentShader
ããããã£ã«æ³šç®ããŸããããããã«ã¯ããã©ã°ã¡ã³ãã·ã§ãŒããŒããã°ã©ã ã®ããã¹ããå«ãŸããŠããŸãã ãŸããé ç¹ã·ã§ãŒããŒããååŸããå¯å€
varying highp vec2 qt_TexCoord0
ãå®çŸ©ããŸããããã¯å®çŸ©ãããŠããŸããããããã©ã«ãã®å®è£ ããããããããããŒã¿ãååŸã§ããŸãã
qt_TexCoord0
ã¯ãç§ãç解ããŠããããã«ãã·ãŒã³å šäœã®ãã¯ã¹ãã£åº§æšã決å®ããŸãïŒèª°ããç§ã
qt_TexCoord0
ãã³ã³ãã¥ãŒã¿ã°ã©ãã£ãã¯ã¹ã®èŠ³ç¹ãããããæ£ããåŒã³åºããããšèšã£ããå¬ããã§ãïŒã ããã§ã¯ã
main
é¢æ°ãèŠãŠã¿ãŸãããã ãã®äžã«çœïŒè²ã¯rgbaã§è¡šãããïŒãšc1-èµ€ãå«ã2ã€ã®ãã¯ãã«ãå®çŸ©ãã2ã€ã®å€ã®éã®ç·åœ¢è£éé¢æ°ã§ãã
mix
é¢æ°ã䜿çšããŠåãã¯ã»ã«ã«å¯ŸããŠååŸããå€ãåºåãã¯ãã«
gl_FragColor
ãŸãã
mix (vec4 x, vec4 y, float a)
-次ã®åŒã§è¡šãããŸãïŒ
x * ( 1.0 - a )+y * a
ããã§ã®å€æ°ãã©ã¡ãŒã¿
a
ã¯ãy軞ã«æ²¿ã£ããã¯ãã«åº§æšã«å¯Ÿå¿ãããã¯ã¹ãã£ãã¯ãã«ã®å€
.y
ãŸãã ãããã£ãŠãå®è¡ã®çµæã¯æ¬¡ã®ããã«ãªããŸãã

qt_TexCoord0.y
ã¯
y
軞ã«æ²¿ã£ããã¯ãã«åº§æšãè¡šããããããšãã°ãå·Šããå³ãžã®ã°ã©ããŒã·ã§ã³ãå¿ èŠãªå Žåã¯ãäžããäžãžã®ã°ã©ããŒã·ã§ã³ã«ãªãã次ã®è¡ã眮ãæããŸãã
gl_FragColor = mix( c0, c1, qt_TexCoord0.y );
ã«
gl_FragColor = mix( c0, c1, qt_TexCoord0.x );
.x
ã¯ã
x
沿ã£ããã¯ãã«åº§æšãæå³ããŸãã ãããŠãã°ã©ããŒã·ã§ã³ãªãã§ãã¹ãŠãèµ€ã§ãã€ã³ããããå Žåããã®ãããªã³ãŒãããããŸãïŒããã§ã¯çµ¶å¯Ÿã«ãã¹ãŠã®ãã¯ã»ã«ãèµ€ã§ãã€ã³ããããŸãïŒïŒ
void main(void) { gl_FragColor = vec4 ( 1.0, 0.0, 0.0, 1.0 ); }
ãã¯ãã«åº§æš
x
ãš
y
代ããã«
t
ãããããã¯ã¹ãã£
s
ãš
t
䜿çšã§ããŸãã çµæã¯åæ§ã§ãã ãœãŒã¹ã³ãŒãã¯ãã¡ãããå ¥æã§ããŸãã
ã·ã§ãŒããŒã¡ã«ããºã ã䜿çšããŠãããçš®ã®ã¢ãã¡ãŒã·ã§ã³ãå®è¡ããŠã¿ãŸãããã
äŸ2.1æãåçŽãªã¢ãã¡ãŒã·ã§ã³
ã·ã§ãŒããŒã䜿çšããŠãææã®ç»åãæäœããŠã¿ãŸãããã
å°ã銬鹿ããå¹æã§ãããããã§ã...ææãå¿èã®ããã«éŒåãããã®ããã«è¡ããŸãã ãŸãã
ShaderEffectSource
ã䜿çšããŠãããšãã°
source
ãšåŒã°ãã
Item
èŠçŽ ã®ããããã£ãå®çŸ©ããå¿ èŠããããŸãã ã·ã§ãŒããŒèªäœã§ã
uniform lowp sampler2D source;
æå®ããŸã
uniform lowp sampler2D source;
ããã«ãããã·ã§ãŒããŒã³ãŒãã䜿çšããŠãã¯ã¹ãã£ïŒææç»åïŒããã€ã³ãããã¬ã³ããªã³ã°ãå€æŽããããšãã§ããŸãã ã¢ãã¡ãŒã·ã§ã³ãäœæããã«ã¯ãæéã®çµéãšãšãã«ããã€ãã®ããŒã¿ãå€æŽããå¿ èŠããããŸãã ãã®ããã«ãQML PropertyAnimationèŠçŽ ã䜿çšããŸãã ãããŠãã©ã®ããŒã¿ãå€æŽããå¿ èŠããããŸããïŒ ããã§ã¯ããããã¯ã»ã«ã®ããŒã¿ã®ä»£ããã«ãå¥ã®ãã¯ã»ã«ã®ããŒã¿ã眮ãæããŠãã¢ãã¡ãŒã·ã§ã³ã®å¹æãåŸãæ¹æ³ã®äŸã瀺ããŸãã ã€ãŸã ããšãã°ããã¯ã¹ãã£åº§æšxãyïŒããã³ã«ã©ãŒããŒã¿ïŒãæã€ãã¯ã»ã«ãããããã®ä»£ããã«ãããã€ãã®é£æ¥ãããã¯ã»ã«ãïŒç¬èªã®ã«ã©ãŒããŒã¿ã§ïŒçœ®æããé¢æ°ãããã
sin
é¢æ°ãšããã ãããã£ãŠãå¯å€ããŒã¿ãšããŠã0ã360床ã®è§åºŠãæãŸããã ãããã£ãŠã
PropertyAnimation
以äžã®ã³ãŒããèŠã
PropertyAnimation
angleããããã£ã¯
0.0
ãã
360.0
ã«å€æŽããããã«èšå®ãããŠããŸãã
import QtQuick 1.0 import Qt.labs.shaders 1.0 Item { width: img.width height: img.height Image { id: img source: "images/space.jpg" } ShaderEffectItem { property variant source: ShaderEffectSource { sourceItem: img; hideSource: true } anchors.fill: img fragmentShader: " varying highp vec2 qt_TexCoord0; uniform lowp sampler2D source; uniform highp float angle; void main() { highp float wave = 0.01; highp float wave_x = qt_TexCoord0.x + wave * sin( radians( angle + qt_TexCoord0.x * 360.0 ) ); highp float wave_y = qt_TexCoord0.y + wave * sin( radians( angle + qt_TexCoord0.y * 360.0 ) ); highp vec4 texpixel = texture2D( source, vec2( wave_x, wave_y ) ); gl_FragColor = texpixel; }" property real angle : 0.0 PropertyAnimation on angle { to: 360.0 duration: 800 loops: Animation.Infinite } } }
highp float wave = 0.01
ã䜿çšããŠæ¯åæ¯å¹ ãèšå®ããŸãã
radians
é¢æ°ãå¿ èŠãªã®ã¯ãªãã§ããã説æããå¿ èŠã¯ãªããšæããŸãã ããããåã«è§åºŠ
angle
å€ãä»£å ¥ãããšãç»åã¯åã«ç°ãªãåŽé¢ã移åããŸããããã£ãšå£®èŠ³ãªãã®
angle
ãããŒãããŒãããå¿ èŠã«ãªããŸãã ãã¯ã¹ãã£åº§æšã¯ãããã0ãã1ãŸã§å€åããŸãããã¯ã»ã«ããšã«ãç¬èªã®ãsiné¢æ°ã«360床ã®ä¹ç®ãããããŸãã
wave_x
ãš
wave_y
y
ãããã
x
軞ãš
y
軞
y
沿ã£ãŠåããããããã€ãã®é£æ¥ããè¿é£ããã®ãã¯ã»ã«ã®åº§æšãèšé²ããŸãã
texture2D( source, vec2( wave_x, wave_y ) );
䜿çš
texture2D( source, vec2( wave_x, wave_y ) );
ãã®æ°ãããã¯ã»ã«ã®å€ãååŸãããããã
gl_FragColor
æžã蟌ã¿ãŸãã
ææã®åçã«ãã®ãããªãã©ã°ã¡ã³ãã·ã§ãŒããŒã䜿çšããçµæã®ãããªã次ã«ç€ºããŸãã
ãœãŒã¹ã³ãŒãã¯ãã¡ãããå ¥æã§ããŸãã
äŸ2.2ãã¢ãã¡ãŒã·ã§ã³ã䜿çšããã¡ãã¥ãŒã®äœæ
ååã«èŠããã®ã§ãã¡ãã¥ãŒãã¿ã³ã«åãå¹æãé©çšããããšã«ããŸããã ãã®ããããã¿ã³ã®äžã«ããŠã¹ã移åãããšãææãšåæ§ã®å¹æããããŸãã ãã®èª¬æã§ã¯ã ãã®ã¬ã€ãããQMLã§ã¡ãã¥ãŒãäœæããäŸã瀺ããŸãã åãã¿ã³ã¯
Button.qml
ã§èª¬æãããŠã
Button.qml
ã ã·ã§ãŒããŒã®æäœã«é¢ãã圌女ã®èª¬æã«å°ãè¿œå ããŸããã ãã©ã°ã¡ã³ãã·ã§ãŒããŒã³ãŒãã¯äžèšã®äŸãšã»ãšãã©å€ããããæ¯åæ¯å¹
wave = 0.02
ããããã«
wave = 0.02
å¢å ãããã ãã§ãã
Button.qmlãã¡ã€ã«ïŒ
import QtQuick 1.0 import Qt.labs.shaders 1.0 Item { width: but.width height: but.height property alias text: textItem.text Rectangle { id: but width: 130; height: 40 border.width: 1 radius: 5 smooth: true gradient: Gradient { GradientStop { position: 0.0; color: "darkGray" } GradientStop { position: 0.5; color: "black" } GradientStop { position: 1.0; color: "darkGray" } } Text { id: textItem anchors.centerIn: parent font.pointSize: 20 color: "white" } MouseArea { property bool ent: false id: moousearea anchors.fill: parent onEntered: { ent = true } onExited: { ent = false effect.angle = 0.0 } hoverEnabled: true } } ShaderEffectItem { id: effect property variant source: ShaderEffectSource { sourceItem: but; hideSource: true } anchors.fill: but property real angle : 0.0 PropertyAnimation on angle { id: prop1 to: 360.0 duration: 800 loops: Animation.Infinite running: moousearea.ent } fragmentShader: " varying highp vec2 qt_TexCoord0; uniform lowp sampler2D source; uniform highp float angle; void main() { highp float wave = 0.02; highp float wave_x = qt_TexCoord0.x + wave * sin( radians( angle + qt_TexCoord0.x * 360.0 ) ); highp float wave_y = qt_TexCoord0.y + wave * sin( radians( angle + qt_TexCoord0.y * 360.0 ) ); highp vec4 texpixel = texture2D( source, vec2( wave_x, wave_y ) ); gl_FragColor = texpixel; }" } }
ãŸããmenu.qmlãã¡ã€ã«èªäœ
import QtQuick 1.0 import Qt.labs.shaders 1.0 Item { width: 150 height: 190 Column { anchors.horizontalCenter: parent.horizontalCenter Button { text: "Apple" } Button { text: "Red" } Button { text: "Green" } Button { text: "Blue" } } }
onExited
ã€ãã³ã
onExited
ã
effect
èŠçŽ ã®angle
angle
ããããã£ã0.0ã«ãªã»ããããå¿ èŠ
onExited
ããããšã«æ³šæããŠãã ãããããããªããšãé£æ¥ãããã¯ã»ã«ã®èšç®ã§çœ®æãããè§åºŠã0ããã§ã¯ãªããæåŸã®å€ããèšç®ããå§ããäºæ³éãã«ãªããªãããšãããããŸãã çµæã¯ãã®å¹æã§ãïŒ
ãœãŒã¹ã³ãŒãã¯ãã¡ãããå ¥æã§ããŸãã
äŸ3.ããŠã¹ãã€ã³ã¿ãŒã«å¿ããŠãã¯ã¹ãã£é åãéžæãã
次ã«ãç»åã®ç¹å®ã®éšåã®ãã¯ã»ã«ã®è²ãå€æŽããäŸã瀺ããŸãã é åã¯ãããŠã¹ãã€ã³ã¿ãŒã®äœçœ®ã«ãã£ãŠæ±ºãŸããŸããããŠã¹ãã€ã³ã¿ãŒã¯ãååŸ50ãã¯ã»ã«ã®åã®äžå¿ã«ãªããŸãã ãããŠããã®åã¯å ã®ãã®ãšã¯ç°ãªããã¯ã»ã«è²ãæã¡ãŸãã
ãŸãããã®äŸã§ã¯ã
ShaderEffectItem
èŠçŽ ã§3ã€ã®ããããã£ãå®çŸ©ããå¿ èŠããããŸãã
property real xPos: 65.0
property real yPos: 65.0
property real radius: 50
ãããã¯ãããããã·ã§ãŒããŒã³ãŒãã«è»¢éãããããŠã¹ã®åº§æšãšåã®ååŸã決å®ããŸãã ããŠã¹ã®åãã远跡ããããã«ã
MouseArea
èŠçŽ ãš
onPositionChanged
ã€ãã³ãã®åŠçã
onPositionChanged
ãŸãã 以äžã«ãœãŒã¹ã³ãŒãã瀺ããããã«èª¬æããŸãã
Rectangle { width: img.width height: img.height Image { id: img source: "images/nature.jpg" } ShaderEffectItem { id: effect anchors.fill: parent MouseArea { id: coords anchors.fill: parent onPositionChanged: { effect.xPos = mouse.x effect.yPos = coords.height - mouse.y } } property real xPos: 65.0 property real yPos: 65.0 property real radius: 50 property int widthImage: img.width property int heightImage: img.height property variant source: ShaderEffectSource { sourceItem: img; hideSource: true } fragmentShader: "varying highp vec2 qt_TexCoord0; uniform highp float xPos; uniform highp float yPos; uniform highp float radius; uniform highp int widthImage; uniform highp int heightImage; highp vec2 pixcoords = qt_TexCoord0.st * vec2( widthImage, heightImage ); uniform sampler2D source; void main(void) { lowp vec4 texColor = texture2D(source, qt_TexCoord0.st); lowp float gray = dot( texColor, vec4( 0.6, 0.5, 0.1, 0.0 ) ); if ( ( pow( ( xPos - pixcoords.x ), 2 ) + pow( ( yPos - pixcoords.y ), 2 ) ) < pow( radius, 2 ) ) { gl_FragColor = vec4( gray, gray, gray, texColor.a) ; } else { gl_FragColor = texture2D( source, qt_TexCoord0 ); } }" } }
座æšïŒ
pixcoords.x; pixcoords.y
ïŒãæã€ç¹å®ã®ãã¯ã»ã«ã®ãã€ã³ããåã«
pixcoords.x; pixcoords.y
ãããã©ãããå€æããããã«
pixcoords.x; pixcoords.y
é¢æ°ãé©çšãããŠããããšã«æ°ä»ãããšãã§ããŸãïŒæ°åŠã©ã€ãã©ãªã®C / C ++ã®åãååã®é¢æ°ãšåæ§ã«æ©èœããŸãïŒ
xPos
ããã³
yPos
ããã³radius
radius
äžå¿ã
ãããã£ãŠããã¯ã»ã«åº§æšãåã«è©²åœããå Žåãçµæã¯ãã°ã¬ãŒè²ãå®çŸ©ãããã¯ãã«ãã¹ã«ã©ãŒçã«ä¹ç®ãããã¯ã»ã«ã«ãªããŸãïŒ
dot
é¢æ°ã¯ã¹ã«ã©ãŒç©ãå®è¡ããŸãïŒã ããã§ãªãå Žåãç¹å®ã®ãã¯ã»ã«ã¯ãŸã£ããå€åããŸããã ç¹°ãè¿ããŸãããå€æ°QMLèŠçŽ ãã·ã§ãŒããŒå€æ°ã«é¢é£ä»ããããŠããããšã«æ°ä»ãããšãã§ããŸã-ãããã¯åãååãšåçã®åãæã¡ãŸãïŒ
real
highp float
real
åçã§ãã
å®è¡ã®çµæã¯æ¬¡ã®ãšããã§ãã
ããã§ã¯ãGLSLã§äœ¿çšå¯èœãªæ¡ä»¶æŒç®åïŒCãšãŸã£ããåãïŒã䜿çšããŠããããšã«æ³šæããŠãã ããã
ãœãŒã¹ã³ãŒãã¯ãã¡ãããå ¥æã§ããŸãã
äŸ4. 2ã€ã®ç»åïŒãã¯ã¹ãã£ïŒã®æ··å
2ã€ã®åçãçšæããŸãã
ã³ãŒããŒãã°

ã³ãŒããŒè±ïŒ

ã³ãŒããŒè±ãšã³ãŒããŒãã°ã®åœ¢ã§èæ¯ãäœãããã§ãã ãã®åé¡ã解決ããã«ã¯ãåã³ãã¯ã¹ãã£åº§æšãæäœããå¿ èŠããããŸãã 2ã€ã®ç»å
texture0
ãš
ShaderEffectItem
ã¯ã
texture1
èŠçŽ ãšããŠ
texture1
ã§å®çŸ©ãããŸãã ãã©ã°ã¡ã³ãã·ã§ãŒããŒã³ãŒãã§ã¯ããããã®2ã€ã®ç»åã¯ã
uniform sampler2D texture0
ãš
uniform sampler2D texture1
uniform sampler2D texture0
2ã€ã®ãã¯ã¹ãã£ãšããŠä¿åãããŸããå€æ°
s1
ã§
s2
ã¯ã次ã®ã³ãŒãã«ç€ºãããã«ãæåã®ç»åãš2çªç®ã®ç»åã®åãã¯ã»ã«ã®ãã¯ã¹ãã£åº§æšãããããååŸããŸãã
import QtQuick 1.0 import Qt.labs.shaders 1.0 Rectangle { width: coffee.width height: coffee.height Image { id: coffee source: "images/coffee.jpg" } Image { id: granules source: "images/granules.jpg" } ShaderEffectItem { anchors.fill: parent id: effect property variant texture0: ShaderEffectSource { sourceItem: coffee; hideSource: true } property variant texture1: ShaderEffectSource { sourceItem: granules; hideSource: true } fragmentShader: " varying highp vec2 qt_TexCoord0; uniform sampler2D texture0; uniform sampler2D texture1; void main(void) { vec4 s1 = texture2D( texture0, qt_TexCoord0.st ); vec4 s2 = texture2D( texture1, qt_TexCoord0.st ) ; gl_FragColor = mix( vec4( s1.r, s1.g, s1.b, 1.0 ), vec4( s2.r * 0.6, s2.g * 0.6, s2.b * 0.6, 0.4 ), 0.35 ); }" } }
gl_FrontColor
ãã¯ã»ã«ã«ã©ãŒãã©ã¡ãŒã¿ãå«ã2ã€ã®ãã¯ãã«ã®ç·åœ¢è£éã®çµæã¯ãçµæã®ãã¯ãã«ã«æžã蟌ãŸããŸããããã¯ãæ¢ã«æ £ã芪ããã§ããŸãïŒã°ã©ããŒã·ã§ã³ã®äœæäžïŒãããã«ãs2ãã¯ã¹ãã£ã®åã«ã©ãŒãã£ãã«ïŒã³ãŒããŒè±ã¯èæ¯ãšããŠå¿ èŠãªã®ã§ã0.6åãããŸãïŒããã®çµæããã®å®è¡çµæãåŸãã

ãŸãïŒããã¯ã¹é¢æ°ã®ãã©ã¡ãŒã¿ãŒãšãã¯ãã«ã®å€ïŒããšãã°ãéææ§ãæ åœãããã¯ã¿ãŒã®4çªç®ã®èŠçŽ ãäžèšã®äŸã§ã¯1.0ãš0.4ïŒã䜿çšããŠãããŸããŸãªèå³æ·±ããã¯ã¹ãã£ãåŸãããšãã§ããŸãã
ãœãŒã¹ã³ãŒãã¯ãã¡ãããå ¥æã§ããŸãã
çµè«ãšããŠãäžèšã®äŸã¯éåžžã«åçŽã§äºçŽ°ãªãã®ã§ãããšæããŸãããäžæ¹ã§ããã®ãããã¯ã«ãŸã£ãã粟éããŠããããåæ§ã®ããšãè¡ãããšãã人ã«ãšã£ãŠæçšãªå ŽåããããŸãã
ãããã«
èŠçŽãããšãã·ã§ãŒããŒããã°ã©ã ãäœæããå¯èœæ§ããããããQMLèŠçŽ ãã¬ã³ããªã³ã°ãããšãã«OpenGLã°ã©ãã£ãã¯ã¹ãåŠçããæãéèŠãªæ®µéã§äœæ¥ããããã®éåžžã«æè»ãªã¡ã«ããºã ãåŸããããšèšããŸããæ¢ã«è¿°ã¹ãããã«ãGLSLèšèªã¯Cã«éåžžã«äŒŒãŠããããå ¬åŒä»æ§ã§è¿°ã¹ãããŠããããã«éããããããšã«ã泚æãã䟡å€ããããŸããããšãã°ããã€ã³ã¿ãŒã¯ãªãïŒå€ã«ãã£ãŠããŒã¿ãé¢æ°ã«æž¡ãããŸãïŒãååž°ãªã©ã䜿çšã§ããŸãããäžååãŸãã¯èª€ã£ãŠèšè¿°ãããã·ã§ãŒããŒããã°ã©ã ã¯ãããã©ãŒãã³ã¹ã«å€§ãã圱é¿ããå¯èœæ§ãããããšã«æ³šæããŠãã ããããããã®ãã©ã°ã€ã³ã®åäœã¯ãSymbian ^ 3ãMaemo 5ãMac OS XãWindows 7ããã³Ubuntuã§ãã¹ããããŠããŸãããã©ãããã©ãŒã èŠä»¶èªäœã¯ãQt SDK 4.7.xããŒãžã§ã³ãšQtOpenGLãµããŒãã§ããQMLã®å°æ¥ããŒãžã§ã³-Scene Graphã®QML2ã¯ãGL / GLESã·ã§ãŒããŒãšQMLã³ãŒããçµã¿åãããAPIããµããŒãããŸãã Qt 5.0ã®èŠçŽ ãæ€èšã§ããŸãShaderEffectãç§ããããæ£ããç解ããŠããã°ãäžã§æžããããšã«ãããã䌌ãŠããããšããããŸãã
䟿å©ãªãªã³ã¯
- OpenGL ESã®å ¬åŒä»æ§ãããç解ããããšããå§ãããŸãã
- QGraphicsViewã®QML ShaderEffectItem-ãããªã®äŸãNokia N8ã®ã·ã§ãŒããŒã®åäœã確èªã§ããŸãã
- ã·ã§ãŒããŒã®åäœã®çè«ã§ããGLSLããã¥ã¢ã«ã¯ãéåžžã«ãã説æãããŠããŸãïŒæã«ã¯Webãµã€ããããã®ã§ãæãããªãã§ãã ãã:)ïŒ
- 6ã€ã®èå³æ·±ãã·ã§ãŒããŒå®è£
- Qt Quick 2 QML Scene Graph GLSLãã©ã°ã¡ã³ãã·ã§ãŒããŒãã¥ãŒããªã¢ã«