我有一個關於OpenGL和Qt的問題。我到目前爲止還沒有使用過OpenGL,並從其他人處獲得了代碼。不幸的是我不能問他。使用多個QGLWidgets(QT)顯示(相同)3D紋理?
我創建了多個CTAGLWidgets(ref。Constructor)來顯示來自不同視角(矢狀,軸向,冠狀)的CT圖像數據。因此,我希望所有OpenGL小部件加載創建的3D紋理(請參閱源代碼的最後部分)。到目前爲止,只有最後一個小部件會加載紋理,而其他小部件會一直顯示黑屏。
(如有必要,着色器,...),但我想我添加了所有相關的部分我可以提供額外的代碼。
我需要改變什麼?或者你能提供一個可以幫助我解決問題的鏈接嗎?任何事情都會有幫助! .cpp文件的
代碼片段:
CTAGLWidget::CTAGLWidget(QWidget* parent) : QGLWidget (parent) {
}
void CTAGLWidget::initShaders() {
setlocale(LC_NUMERIC, "C");
if (!program.addShaderFromSourceFile(QGLShader::Vertex, ":/vshader.glsl"))
close();
if (!program.addShaderFromSourceFile(QGLShader::Fragment, ":/fshader.glsl"))
close();
if (!program.link())
close();
if (!program.bind())
close();
setlocale(LC_ALL, "");
}
void CTAGLWidget::initializeGL() {
initializeGLFunctions();
initShaders();
qglClearColor(Qt::black);
zoom = 1.0;
qNow = QQuaternion(1,0,0,0);
min = QVector3D(1.0, 1.0, 1.0);
max = QVector3D(-1.0,-1.0,-1.0);
center = QVector3D(0,0,0);
glGenBuffers(1,&vboQuadId);
std::vector<QVector3D> vertex;
vertex.push_back(QVector3D(-2,-2, 0));
vertex.push_back(QVector3D(0, 0, 0));
vertex.push_back(QVector3D(2,-2, 0));
vertex.push_back(QVector3D(1, 0, 0));
vertex.push_back(QVector3D(2, 2, 0));
vertex.push_back(QVector3D(1, 1, 0));
vertex.push_back(QVector3D(-2, 2, 0));
vertex.push_back(QVector3D(0, 1, 0));
glBindBuffer(GL_ARRAY_BUFFER,vboQuadId);
glBufferData(GL_ARRAY_BUFFER,vertex.size()*sizeof(QVector3D),vertex.data(),GL_STATIC_DRAW);
}
void CTAGLWidget::paintGL() {
glClear(GL_COLOR_BUFFER_BIT);
QMatrix4x4 P(projection);
P.scale(zoom,zoom,zoom);
modelView.setToIdentity();
modelView.rotate(qNow.conjugate());
modelView.translate(-center);
program.bind();
program.setUniformValue("uPMat", P);
program.setUniformValue("uMVMat", modelView);
program.setUniformValue("uColor", QVector4D(1.0,0.0,0.0,1.0));
glBindBuffer(GL_ARRAY_BUFFER, vboQuadId);
int vertexLocation = program.attributeLocation("a_position");
program.enableAttributeArray(vertexLocation);
glVertexAttribPointer(vertexLocation, 3, GL_FLOAT, GL_FALSE,
2*sizeof(QVector3D), 0);
int texAttribLoc = program.attributeLocation("aTexCoord");
program.enableAttributeArray(texAttribLoc);
glVertexAttribPointer(texAttribLoc, 3, GL_FLOAT, GL_FALSE,
2*sizeof(QVector3D), (const void*) sizeof(QVector3D));
glDrawArrays(GL_QUADS,0,4);
}
這裏的3D紋理從QByteArray中 「紋理」 創建:
void CTScanMain::setTexture() {
...
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexImage3D(GL_TEXTURE_3D, 0, GL_RGB8,
ctAnalyser->x(), ctAnalyser->y(), ctAnalyser->z(),
0, GL_RGB, GL_UNSIGNED_BYTE, texture);
...
}
有程序中沒有進一步的OpenGL調用。