Tôi muốn vẽ một mục trong cảnh QtQuick bằng cách sử dụng các cuộc gọi OpenGL thô. Tôi đã quyết định tiếp cận đề xuất trong this question.Sự cố khi vẽ Mục Qml với các cuộc gọi OpenGL thô
tôi đã tạo ra một Qt mục nhanh bắt nguồn từ QQuickFramebufferObject
và tiếp xúc với nó để QML như Renderer
: (mã dựa trên ví dụ Qt: Scene Graph - Rendering FBOs)
class FboInSGRenderer : public QQuickFramebufferObject {
Q_OBJECT
public:
Renderer *createRenderer() const;
};
nguồn file:
class LogoInFboRenderer : public QQuickFramebufferObject::Renderer {
public:
LogoInFboRenderer() { }
void render() {
int width = 1, height = 1;
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glColor4f(0.0, 1.0, 0.0, 0.8);
glBegin(GL_QUADS);
glVertex2f(0, 0);
glVertex2f(width, 0);
glVertex2f(width, height);
glVertex2f(0, height);
glEnd();
glLineWidth(2.5);
glColor4f(0.0, 0.0, 0.0, 1.0);
glBegin(GL_LINES);
glVertex2f(0, 0);
glVertex2f(width, height);
glVertex2f(width, 0);
glVertex2f(0, height);
glEnd();
update();
}
QOpenGLFramebufferObject *createFramebufferObject(const QSize &size) {
QOpenGLFramebufferObjectFormat format;
format.setAttachment(QOpenGLFramebufferObject::CombinedDepthStencil);
format.setSamples(4);
return new QOpenGLFramebufferObject(size, format);
}
};
QQuickFramebufferObject::Renderer *FboInSGRenderer::createRenderer() const {
return new LogoInFboRenderer();
}
Trong Qml Tôi sử dụng nó như sau:
import QtQuick 2.4
import SceneGraphRendering 1.0
Rectangle {
width: 400
height: 400
color: "purple"
Renderer {
id: renderer
anchors.fill: parent
}
}
Tôi wa s mong đợi để thấy rằng rendered "X" sẽ lấp đầy toàn bộ khung cảnh, nhưng thay vào đó tôi nhận được kết quả trình bày dưới đây:
thí nghiệm khác dường như xác nhận rằng đã thu hút hình có luôn đó là kích thước (chiều rộng/chiều cao) chia by 2.
Tôi cũng đã kiểm tra thông số size
trong createFramebufferObject
có giá trị chính xác.
Tìm tài liệu dẫn tôi đến thuộc tính textureFollowsItemSize
trong QQuickFramebufferObject
lớp nhưng theo mặc định được đặt thành true
.
Tôi có làm điều gì sai hoặc tôi có nên coi hành vi này là lỗi Qt không?
Tôi không biết QQuick, nhưng OpenGL và tôi không thấy rằng bạn đã đặt máy ảnh (chiếu hoặc modelview) hoặc chế độ xem. Nếu bạn sử dụng máy ảnh opengl mặc định, nó sẽ nhìn xuống trục z âm. Vì vậy, khi vẽ trong dương và x- và góc phần tư tôi sẽ mong đợi kết quả bạn hiển thị (nhớ, trong opengl y là lộn ngược). Để hiển thị một số mục 2d trong bộ đệm khung, tôi sẽ đặt máy ảnh ortho theo hướng z và glViewport có giới hạn [0,0] thành [pixel_width, pixel_height] chẳng hạn. – Thomas
Tôi đã sử dụng mã của bạn - trong trường hợp của tôi, màu xanh lá cây chỉ được hiển thị một lần. Tại sao vậy? – Pietrko