पर glviewport नहीं लगाया गया है I QVpenGLWidget :: glizeGL में glViewport वर्चुअल फ़ंक्शन को ओवरराइट किया गया है, जिसे कॉल किया गया था और व्यूपोर्ट केवल विजेट स्पेस का हिस्सा उपयोग करता था। लेकिन इसका कोई प्रभाव नहीं पड़ा, सामग्री अभी भी विजेट के पूर्ण आकार में आती है। क्या मुझे कुछ याद आया?glViewport Qt5.4 QOpenGLWidget :: resizeGL
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 केवल सामान्यीकृत डिवाइस स्थान से स्क्रीन स्पेस तक एफ़िन रूपांतरण को संभालता है। यदि आप जीएल विंडो के एक हिस्से में प्रस्तुत करना चाहते हैं, तो आपको वास्तविक प्रतिपादन के बनावट के साथ एक ट्रैक्टर बनाना होगा। यह काफी जटिल और वास्तव में कुशल नहीं होगा, इसलिए यदि आप अभी समझाया गया है, तो यह आपकी मदद करेगा, आप केवल खिड़की के हिस्से में क्यों प्रस्तुत करना चाहते हैं। शायद आप जो करना चाहते हैं उसके लिए एक बेहतर समाधान है! वास्तव में glViewport क्या करता है इसके वर्णन के लिए https://www.khronos.org/opengles/sdk/docs/man/xhtml/glViewport.xml भी देखें। –