2015-02-10 88 views
1

我有一個關於OpenGL和Qt的問題。我到目前爲止還沒有使用過OpenGL,並從其他人處獲得了代碼。不幸的是我不能問他。使用多個QGLWidgets(QT)顯示(相同)3D紋理?

我創建了多個CTAGLWidgets(ref。Constructor)來顯示來自不同視角(矢狀,軸向,冠狀)的CT圖像數據。因此,我希望所有OpenGL小部件加載創建的3D紋理(請參閱源代碼的最後部分)。到目前爲止,只有最後一個小部件會加載紋理,而其他小部件會一直顯示黑屏。

enter image description here

(如有必要,着色器,...),但我想我添加了所有相關的部分我可以提供額外的代碼。

我需要改變什麼?或者你能提供一個可以幫助我解決問題的鏈接嗎?任何事情都會有幫助! .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調用。

回答

0

一種可能的解決方案,可以發現在看QGLWidget來繪圖的構造:

QGLWidget (QWidget * parent = 0, const QGLWidget * shareWidget = 0, Qt::WindowFlags f = 0) 

跑過第一OpenGL的控件對象爲「shareWidget」使得進一步部件共享相同的紋理。

Qt文檔: 「如果shareWidget是有效的QGLWidget,該小部件將與shareWidget共享OpenGL顯示列表和紋理對象。」

類似的問題已被詢問: http://qt-project.org/forums/viewthread/8265