Hello tout le monde! Alors voilà, j'étais en train de faire un projet OpenGL, où je fais mon rendu dans un contexte opengl. Mais voilà; j'aimerai rajouter une interface graphique à tout ce tsointsoin, et j'ai bien envie de le faire avec Qt (j'ai cru lire qu'il était assez facile de faire le lien entre les 2) (je ne suis un expert ni en Qt, ni en OpenGL, je précise). Actuellement, tous les tutoriels que j'ai pu lire c'est pour dessiner des trucs sur une fenetre avec des QPainter.
Ma question serait : Comment je fais pour faire un rendu opengl dans une fenêtre Qt?
Par exemple, dans mon main actuel je fais à un moment :
inlierShader.use();
inlierShader.setMat4("viewproj", viewProj);
model = glm::mat4();
inlierShader.setMat4("model", model);
glBindVertexArray(GLOBAL::VAOp);
glDrawArrays(GL_POINTS, 0, (GLsizei)GLOBAL::reconstruction3D.size());
if (GLOBAL::print_Other)
glDrawArrays(GL_POINTS, (GLsizei)GLOBAL::reconstruction3D.size(), (GLsizei)GLOBAL::loaded_points.size());
Comment je peux faire pour que mon Drawarray draw dans un QWidget plutôt que dans ma window opengl?
Désolé si la réponse est trivial, j'ai cherché, mais peut-être que je n'arrive pas a exprimer ma pensée dans un anglais suffisamment correct pour trouver une réponse sur internet :/ Si il y a une classe Qt qui fait ça, je suis pas tombé dessus :/
Merci beaucoup!
« Je n’ai pas besoin de preuve. Les lois de la nature, contrairement aux lois de la grammaire, ne permettent aucune exception. » D. Mendeleïev
Je profite de ce post pour poser une autre question ...
J'ai donc une classe qui dérive de QOpenGLWidget, dans laquelle j'ai override les fonctions initializeGL(), paintGL(), et resizeGL(). J'ai crée un tableau avec des positions, et un tableau avec des couleurs comme ceci :
. et comme shader j'utilise quelque chose de très simple :
vertex Shader:
#version 330 core
layout(location = 0) in vec3 position;
layout(location = 1) in vec3 color;
out vec4 vColor;
void main()
{
gl_Position = vec4(position, 1.0);
vColor = vec4(color, 1.0f);
}
et fragment Shader :
#version 330 core
in vec4 vColor;
out vec4 fColor;
void main()
{
fColor = vec3(1.0f, 0.0f, 0.0f, 0.0f );//vColor;
}
Le problème que j'ai, c'est que quand j'affiche mon triangle, la couleur n'est pas prise en compte. C'est à dire que j'obtiens un fond rouge (j'ai clearcolor en rouge) avec un triangle noir à l'interieur.
Le code pour InitializeGL :
void Painter::initializeGL()
{
QOpenGLFunctions::initializeOpenGLFunctions();
//connect(context(), SIGNAL(aboutToBeDestroyed()), this, SLOT(teardownGL()), Qt::DirectConnection);
{
glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
// Create Shader (Do not release until VAO is created)
m_shaderProg = new QOpenGLShaderProgram();
m_shaderProg->addShaderFromSourceFile(QOpenGLShader::Vertex, ":/shaders/simple.vert");
m_shaderProg->addShaderFromSourceFile(QOpenGLShader::Fragment, ":/shaders/simple.frag");
//J'en profite pour dire que mes shaders sont bien dans un sous-dossier nommé "shaders" m_shaderProg->link();
m_shaderProg->bind();
// Create Vertex Array Object
m_VAO.create();
m_VAO.bind();
// Create Buffer (Do not release until VAO is created)
m_VBOs.resize(2);
m_VBOs[0].create();
m_VBOs[0].bind();
m_VBOs[0].setUsagePattern(QOpenGLBuffer::StaticDraw);
m_VBOs[0].allocate(positions, 3 * 3 * sizeof(float));
m_shaderProg->enableAttributeArray(0);
m_shaderProg->setAttributeBuffer(0, GL_FLOAT, 0, 3);
m_VBOs[1].create();
m_VBOs[1].bind();
m_VBOs[1].setUsagePattern(QOpenGLBuffer::StaticDraw);
m_VBOs[1].allocate(colors, 3 * 3 * sizeof(float));
m_shaderProg->enableAttributeArray(1);
m_shaderProg->setAttributeBuffer(1, GL_FLOAT, 0, 3);
// Release (unbind) all
for (auto& m_VBO : m_VBOs)
m_VBO.release();
m_VAO.release();
m_shaderProg->release();
}
}
J'ai donc l'impression que ma couleur n'est pas prise en compte dans initializeGL(). Mais je comprends pas pourquoi j'arrive quand même a dessiner le triangle ...
Est-ce que quelqu'un peut m'aider? :/
- Edité par KirbXCoucou 28 mars 2019 à 8:59:58
« Je n’ai pas besoin de preuve. Les lois de la nature, contrairement aux lois de la grammaire, ne permettent aucune exception. » D. Mendeleïev
La fonction addShaderFromSourceFile retourne un booléen pour savoir si la compilation des shaders s'est bien passée. Normmalement la ligne 12 de initializeGL doit retourner false parceque dans ton fs, tu initialises un vec3 avec 4 valeurs...
Sinon c'est pas trés interressant de dessiner un objet rouge sur un fond rouge...
Ouais! J'ai trouvé mon erreur finalement! ... Enfait, je dessinais un objet rouge sur un fond rouge parceque l'objet était noir justement, et que je voulais voir si j'arrivais à le rendre rouge, Mais mon erreur venais du chemin d'acces à mes shaders... je suis stupide! merci de l'aide en tout cas!
« Je n’ai pas besoin de preuve. Les lois de la nature, contrairement aux lois de la grammaire, ne permettent aucune exception. » D. Mendeleïev
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
« Je n’ai pas besoin de preuve. Les lois de la nature, contrairement aux lois de la grammaire, ne permettent aucune exception. »
D. Mendeleïev
Discord NaN. Mon site.
« Je n’ai pas besoin de preuve. Les lois de la nature, contrairement aux lois de la grammaire, ne permettent aucune exception. »
D. Mendeleïev
« Je n’ai pas besoin de preuve. Les lois de la nature, contrairement aux lois de la grammaire, ne permettent aucune exception. »
D. Mendeleïev
Eug
« Je n’ai pas besoin de preuve. Les lois de la nature, contrairement aux lois de la grammaire, ne permettent aucune exception. »
D. Mendeleïev