Bonjour à tous !
Alors, j'ai fait un moteur de rendu en OpenGL es que j'ai peaufiné avec une application iOS. J'aimerai pour qu'on puisse bosser dessus depuis n'importe quelle plateforme, faire une appli Qt qui appelle exactement le même moteur de rendu.
J'avais commencé sous Qt4.8.2 dans un QGLWidget avec QGLFunctions, mais maintenant j'ai tout porté en 5.0.0 avec juste une QWindow et le nouveau QOpenGLFunctions.
Tout fonctionne presque mais j'ai encore des problèmes avec les shaders. Pour que ceux ci compilent sans erreur j'ai dû ajouter un ifdef qui précise «version 120». Donc ça compile, ça tourne presque bien mais mes sprites ne s'affichent pas à la bonne taille. Le problèmes vient je pense , de la version de glsl qui est donc 1.20 et qui ne semble pas prendre en compte des attributs comme gl_PointSize. Je sais que la version glsl de es2 dérive de la 1.20 mais je ne sais pas en quoi elles diffèrent.
Quelqu'un sait comment configurer Qt pour fonctionner exactement comme OpenGL ES 2 sur tablette, y compris GLSL ?
Pour info mon code demande à l'application Qt de lui renvoyer l'id du Shader Program compilé comme ça :
Mes codes de shader, qui fonctionnent pour les Qt et iOS à l'exception de la taille des sprites prêt (enfin c'est tellement petit que je ne sais pas si ce sont les bonnes textures aussi ):
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 QOpenGLShaderProgram program; program.addShaderFromSourceCode(QOpenGLShader::Vertex, vertexShaderSource); program.addShaderFromSourceCode(QOpenGLShader::Fragment, fragmentShaderSource); if (!program.link()) QString error = program.log(); if (!program.bind()) QString error = program.log(); return program.programId();
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 const GLchar vShaderStr[] = #ifdef __BUILD_DESKTOP__ "#version 120\n" // necessary for Qt to compile shaders #endif //__BUILD_DESKTOP__ "attribute lowp vec4 Position;\n" "attribute mediump vec2 TextureCoord;\n" "attribute lowp float Weight;\n" "uniform mat4 MVP;\n" "varying mediump vec2 TextureCoordOut;\n" "void main(void)\n" "{\n" " gl_Position = MVP * Position;\n" " TextureCoordOut = TextureCoord;\n" " gl_PointSize = Weight;\n" "}\n"; const GLchar fShaderStr[] = #ifdef __BUILD_DESKTOP__ "#version 120\n" // necessary for Qt to compile shaders #endif //__BUILD_DESKTOP__ "varying mediump vec2 TextureCoordOut;\n" "uniform sampler2D Sampler;\n" "uniform bool IsSprite;\n" "uniform lowp vec3 TextureColor;\n" "uniform lowp float Opacity;\n" "void main(void)\n" "{\n" " lowp vec4 textureColorResult;\n" " textureColorResult = texture2D(Sampler, IsSprite ? gl_PointCoord : TextureCoordOut);\n" " gl_FragColor = IsSprite ? vec4(mix(textureColorResult.rgb,TextureColor, 1.0),\n" " textureColorResult.a * Opacity) : textureColorResult;\n" "}\n";
Pour info j'avais déjà posé la question sur SO et le forum de qt.
Mais pas de réponses... et j'espère trouver ici une expertise glsl que je n'ai pas du tout. Si vous avez des idées d'où chercher sur le net la solution, je prends aussi volontiers mais pour l'instant malgré que le support d'es2 soit la grosse pub de Qt je ne trouve pas trop d'infos.
Si vous voulez des tutos sur quelque chose qui s'approche de ce que j'ai fait, n'hésitez pas non plus à demander
Partager