工作,我把glViewport在QOpenGLWidget :: resizeGL overwritted虛函數,它沒有被調用,並設置視口僅使用的小工具空間的一部分。但它沒有任何效果,內容仍然繪製到全尺寸的小部件。我錯過了什麼嗎?glViewport沒有對Qt5.4 QOpenGLWidget :: resizeGL
這裏是我的代碼,
mywidget.h:
class MyWidget : public QOpenGLWidget, protected QOpenGLFunctions
{
Q_OBJECT
public:
explicit MyWidget(QWidget* parent = NULL);
protected:
virtual void initializeGL();
virtual void paintGL();
virtual void resizeGL(int w, int h);
private:
QOpenGLShaderProgram program;
};
和mywidget.cpp:
MyWidget::MyWidget(QWidget* parent) : QOpenGLWidget(parent)
{
}
static const GLfloat squareVertices[] = {
-1.0f, -1.0f,
1.0f, -1.0f,
-1.0f, 1.0f
};
void MyWidget::initializeGL()
{
initializeOpenGLFunctions();
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
program.addShaderFromSourceCode(QOpenGLShader::Vertex,
"attribute highp vec4 vec;\n"
"void main(void)\n"
"{\n"
" gl_Position = vec;\n"
"}");
program.addShaderFromSourceCode(QOpenGLShader::Fragment,
"void main(void)\n"
"{\n"
" gl_FragColor = vec4(0.5, 0.5, 0.5, 1.0);\n"
"}");
program.link();
program.bind();
program.enableAttributeArray(0);
program.setAttributeArray(0, squareVertices, 2);
}
void MyWidget::paintGL()
{
glClear(GL_COLOR_BUFFER_BIT);
//glViewport(0, 0, width()/2, height()/2);
// if I put glViewport here, everything work as intended,
// but we shouldn't need to set viewport everytime render a frame
program.bind();
glDrawArrays(GL_TRIANGLE_STRIP, 0, 3);
}
void MyWidget::resizeGL(int w, int h)
{
glViewport(0, 0, w/2, h/2);
// this line didn't have any effect, opengl still draw using full widget space
}
我不認爲你可以做到這一點的方式。 glViewport僅處理從規範化設備空間到屏幕空間的仿射變換。如果只想渲染GL窗口的一部分,則必須繪製具有實際渲染紋理的四邊形。這將會非常複雜並且效率不高,所以如果你只是解釋了爲什麼你只想渲染到窗口的一部分,這將會有所幫助。也許有一個更好的解決方案,你想要做什麼!另請參閱https://www.khronos.org/opengles/sdk/docs/man/xhtml/glViewport.xml以瞭解glViewport的具體功能。 –