layout一共有两种绑定方法。一种是把设定好的值绑定到shader中、另一种是shader中的layout绑定到代码中。
第一种方法(注意:要在link之前绑定同时要把shader代码中的layout设置删掉)
void sunOpengl::initializeGL()
{this->initializeOpenGLFunctions();shaderProgram.addShaderFromSourceFile(QOpenGLShader::Vertex,":/shades/shapes.vert");shaderProgram.addShaderFromSourceFile(QOpenGLShader::Fragment,":/shades/shapes.frag");int posLocation=4;shaderProgram.bindAttributeLocation("aPos",posLocation);bool success=shaderProgram.link();if(!success){qDebug()<<shaderProgram.log();}glGenVertexArrays(1,&VAO);glGenBuffers(1,&VBO);glBindVertexArray(VAO);glBindBuffer(GL_ARRAY_BUFFER,VBO);//将数据传入显存glBufferData(GL_ARRAY_BUFFER,sizeof(vertices),vertices,GL_STATIC_DRAW);//显卡解析参数glVertexAttribPointer(posLocation,3,GL_FLOAT,GL_FALSE,3*sizeof(float),(GLvoid*)0);//开始VOA属性glEnableVertexAttribArray(posLocation);//EBOglGenBuffers(1,&EBO);glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,EBO);glBufferData(GL_ELEMENT_ARRAY_BUFFER,sizeof(indices),indices,GL_STATIC_DRAW);glBindVertexArray(0);glBindBuffer(GL_ARRAY_BUFFER,0);
}
第二种方法(获取shader源码中layout的值)
void sunOpengl::initializeGL()
{this->initializeOpenGLFunctions();shaderProgram.addShaderFromSourceFile(QOpenGLShader::Vertex,":/shades/shapes.vert");shaderProgram.addShaderFromSourceFile(QOpenGLShader::Fragment,":/shades/shapes.frag");bool success=shaderProgram.link();if(!success){qDebug()<<shaderProgram.log();}glGenVertexArrays(1,&VAO);glGenBuffers(1,&VBO);glBindVertexArray(VAO);glBindBuffer(GL_ARRAY_BUFFER,VBO);//将数据传入显存int posLocation=shaderProgram.attributeLocation("aPos");//获取shder代码里面layout参数shaderProgram.bindAttributeLocation("aPos",posLocation);glBufferData(GL_ARRAY_BUFFER,sizeof(vertices),vertices,GL_STATIC_DRAW);//显卡解析参数glVertexAttribPointer(posLocation,3,GL_FLOAT,GL_FALSE,3*sizeof(float),(GLvoid*)0);//开始VOA属性glEnableVertexAttribArray(posLocation);//EBOglGenBuffers(1,&EBO);glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,EBO);glBufferData(GL_ELEMENT_ARRAY_BUFFER,sizeof(indices),indices,GL_STATIC_DRAW);glBindVertexArray(0);glBindBuffer(GL_ARRAY_BUFFER,0);
}