[英]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);
這假設OpenGLWrapper
從QObject
派生了一些東西,如果不是,那么您需要手動刪除其析構函數中的程序(或使用一些智能指針,或其他方法)。
否則,您的初始化代碼看起來很合理。 您的矩陣變量應該是統一的,而不是屬性,但是我願意將其歸類為錯字。 您也不應該在整個生命周期中都bind
該程序,因為這等效於對glUseProgram
的調用。 您應該在渲染例程中使用bind
(和release
,它執行glUseProgram(0)
)。
以我的經驗,用於OpenGL對象的Qt包裝器相當差且受限制,我只是為直接的OpenGL對象制作了薄包裝紙(通過GLEW制作了跨平台的文件並很容易),並在QGLWidget中進行了通常的OpenGL調用。 在與Qt的同類產品苦苦掙扎了一段時間后,它沒有任何問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.