簡體   English   中英

使用多個QGLWidgets(QT)來顯示(相同)3D紋理?

[英]Using multiple QGLWidgets (QT) to display (same) 3D Texture?

我對OpenGL和Qt有疑問。 到目前為止,我還沒有使用OpenGL,而是從別人那里獲得了代碼。 不幸的是我不能問他。

我創建了多個CTAGLWidgets(構造函數),以從不同的角度(矢狀,軸向,冠狀)顯示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調用。

查看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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM