繁体   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