簡體   English   中英

Qt OpengGL Shader程序失敗

[英]Qt OpengGL Shader Program fails

我正在嘗試使用Qt SDK編寫現代OpenGL(可編程管線)程序.Qt OpenGL示例僅顯示固定管線實現。有關如何初始化Shader Program的文檔非常少,這是有關如何設置着色器的最佳示例他們擁有的程序和負載着色器:http://doc.trolltech.com/4.6/qglshaderprogram.html#details正如人們所看到的那樣,這不是很描述。 我試圖遵循此文檔並且無法使Shader程序正常工作。當該程序嘗試為着色器分配屬性時出現分段錯誤。我認為問題是我以錯誤的方式訪問了上下文,但是我無法找到有關如何設置或檢索渲染上下文的任何參考。我的代碼如下所示:

static GLfloat const triangleVertices[] = {
    60.0f,  10.0f,  0.0f,
    110.0f, 110.0f, 0.0f,
    10.0f,  110.0f, 0.0f
};

QColor color(0, 255, 0, 255);
int vertexLocation =0;
int matrixLocation =0;
int colorLocation =0;
QGLShaderProgram *pprogram=0;
void OpenGLWrapper::initShaderProgram(){
    QGLContext context(QGLFormat::defaultFormat());

    QGLShaderProgram program(context.currentContext());
    pprogram=&program;
    program.addShaderFromSourceCode(QGLShader::Vertex,
     "attribute highp vec4 vertex;\n"
     "attribute mediump mat4 matrix;\n"
     "void main(void)\n"
     "{\n"
     "   gl_Position = matrix * vertex;\n"
     "}");
     program.addShaderFromSourceCode(QGLShader::Fragment,
     "uniform mediump vec4 color;\n"
     "void main(void)\n"
     "{\n"
     "   gl_FragColor = color;\n"
     "}");
     program.link();
     program.bind();

vertexLocation= pprogram->attributeLocation("vertex");
matrixLocation= pprogram->attributeLocation("matrix");
colorLocation=  pprogram->uniformLocation("color");
}

這是渲染循環:

void OpenGLWrapper::paintGL()
{
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);


     QMatrix4x4 pmvMatrix;
     pmvMatrix.ortho(rect());

    pprogram->enableAttributeArray(vertexLocation);
    pprogram->setAttributeArray(vertexLocation, triangleVertices, 3);
    pprogram->setUniformValue(matrixLocation, pmvMatrix);
    pprogram->setUniformValue(colorLocation, color);

    glDrawArrays(GL_TRIANGLES, 0, 3);

    pprogram->disableAttributeArray(vertexLocation);
}

有人可以幫助您進行此設置嗎? 非常感謝 。

您創建一個本地program變量,並讓您的pprogram指針指向其地址。 但是,當initShaderProgram返回時,本地program的生命周期結束,您pprogram指向垃圾,因此嘗試使用它時會出現段錯誤。 您應該寧願動態創建程序,並讓Qt處理內存管理:

pprogram = new QGLShaderProgram(context.currentContext(), this);

這假設OpenGLWrapperQObject派生了一些東西,如果不是,那么您需要手動刪除其析構函數中的程序(或使用一些智能指針,或其他方法)。

否則,您的初始化代碼看起來很合理。 您的矩陣變量應該是統一的,而不是屬性,但是我願意將其歸類為錯字。 您也不應該在整個生命周期中都bind該程序,因為這等效於對glUseProgram的調用。 您應該在渲染例程中使用bind (和release ,它執行glUseProgram(0) )。

以我的經驗,用於OpenGL對象的Qt包裝器相當差且受限制,我只是為直接的OpenGL對象制作了薄包裝紙(通過GLEW制作了跨平台的文件並很容易),並在QGLWidget中進行了通常的OpenGL調用。 在與Qt的同類產品苦苦掙扎了一段時間后,它沒有任何問題。

暫無
暫無

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

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