initializeGL函数由于是初始化,所以只调用一次
而resizeGL和paintGL会多次调用
resizeGL在正常的情况下,触发的条件是,窗口大小发生变化时,resizeGL被调用,之后会触发paint事件,从而调用paintGL()事件处理器。
paintGL在正常的情况下,只要你移动窗口的位置,就会马上触发paint事件,从而调用paintGL事件处理器。当然,还有窗口在隐藏和显示之间变换时,也会触发paint事件,从而调用paintGL事件处理器。
1:initializeGL()函数只在程序开始时运行一次,之后不会再运行
2:resizeGL()只在在窗口尺寸发生变化时,会自动运行,然后触发paint事件,从而调用paintGL()事件处理函数
3:paintGL()会在窗口位置移动时被调用,或是窗口在隐藏和显示之间变换时,被调用
4.
updateGL()功能是触发
paintGL()
initializeGL函数由于是初始化,所以只调用一次而resizeGL和paintGL会多次调用resizeGL在正常的情况下,触发的条件是,窗口大小发生变化时,resizeGL被调用,之后会触发paint事件,从而调用paintGL()事件处理器。paintGL在正常的情况下,只要你移动窗口的位置,就会马上触发paint事件,从而调用paintGL事件处理器。当然,还有窗口在隐藏和...
在
paint
GL
()函数 如果在函数
中
有循环,例如,循环
中
每次对模型进行角度控制,那么此时模型不会像预期的那样,循环
中
的每次对模型进行改变,实际上,而是整个个函数仅仅是最终的角度变化。
如果要想实现
paint
GL
()函数
中
的对角度的循环控制,可以把角度控制放在一个槽函数
中
,这个槽函数一方面处理角度的变化,另一方面又会去处理
paint
GL
()的更新--采用u
pdate
GL
()...
void MainWidget::
paint
GL
()
QMetaObject::invokeMethod(this,"u
pdate
",
Qt
::QueuedConnection);
其他定时触发:
QT
imer::sin
gl
eShot(10, this,SLOT(eventOperation()));单sing...
Qt
Creator
中
的3D绘图及动画教程(参照NeHe)
刚刚学习了
Qt
Creator,发现
Qt
提供了
Qt
OpenGL
模块,对
OpenGL
做了不错的封装,这使得我们可以很轻松地在
Qt
程序
中
使用
OpenGL
进行绘图渲染。虽然里面还是由不少专业的解释照搬原文的,但还是加入了大量自己的分析。而且
Qt
中
写
OpenGL
框架上比VC简单太多了,有不少东西都封装优化好了,代码上还是由有很多区别的。当然,其
中
原教程没解释好的问题我都作了深入的解释,以及一些多余部分解释、代码都被我删掉简化了。
这份
Qt
OpenGL
的3
Opengl
学习笔记(1)
没学
opengl
的时候我以为
opengl
就是一个类库,我只需要
调用
里面的api就可以轻松的完成任务,简简单单的画出好看的图形,但是当我真正开始学的时候才发现这玩意和ugui完全就不是一个量级的,这玩意好像有一点太过底层了,而且虽然还是掉api,但是这其
中
的api又异常复杂,但既然我开始写总结了,那我应该算勉强看懂了,我就用我自己的话稍微总结一下。虽然
opengl
本身不是一个api,它仅仅是个规范,但是我们用的时候就当api用就完事了。
二.
Opengl
介绍
1.渲染模式
首先清楚
OpenGL
中
的常用几个函数作用:
(1)
init
ializ
eGL
() 初始化
OpenGL
函数
(2)
resize
GL
(int w, int h)调整窗口大小函数
(3)
paint
GL
()绘制图像函数
1、
paint
GL
()函数作调整
先定义模型、观察、投影3个矩阵。
//1、定义的4*4的矩阵 模型 观察 投影矩阵
QMatrix4x4 model;
QMatrix4x4 view;
QMatrix4x4 projection;
/*----------按照
unsigned int captureFBO;
gl
GenFramebuffers(1, &captureFBO);
gl
BindFramebuffer(
GL
_FRAMEBUFFER, captureFBO);
unsigned int captureRBO;
gl
GenRenderbuffers(1, &captureRBO);
这是一个使用
Qt
和
OpenGL
绘制滚动图片的程序。它使用Q
OpenGL
Widget类来创建一个
OpenGL
上下文,然后使用
OpenGL
函数来绘制图像,并在每个帧之间使用
QT
imer类来更新图像的位置。
#include <
Qt
Widgets/QApplication>
#include <
Qt
Widgets/Q
OpenGL
Widget>
#include <
Qt
Core/
QT
imer>
#include <
Qt
Gui/QImage>
#include <
Qt
Gui/Q
Paint
er>
class ScrollImage : public Q
OpenGL
Widget {
public:
ScrollImage(QWidget* parent = nullptr)
: Q
OpenGL
Widget(parent)
QT
imer* timer = new
QT
imer(this);
connect(timer, &
QT
imer::timeout, this, &ScrollImage::u
pdate
Position);
timer->start(16);
void setImage(const QImage& image)
m_image = image;
u
pdate
();
protected:
void
init
ializ
eGL
() override
gl
ClearColor(1.0f, 1.0f, 1.0f, 1.0f);
gl
Enable(
GL
_TEXTURE_2D);
gl
GenTextures(1, &m_textureId);
gl
BindTexture(
GL
_TEXTURE_2D, m_textureId);
gl
TexParameteri(
GL
_TEXTURE_2D,
GL
_TEXTURE_MIN_FILTER,
GL
_LINEAR);
gl
TexParameteri(
GL
_TEXTURE_2D,
GL
_TEXTURE_MAG_FILTER,
GL
_LINEAR);
gl
TexParameteri(
GL
_TEXTURE_2D,
GL
_TEXTURE_WRAP_S,
GL
_REPEAT);
gl
TexParameteri(
GL
_TEXTURE_2D,
GL
_TEXTURE_WRAP_T,
GL
_REPEAT);
void
paint
GL
() override
gl
Clear(
GL
_COLOR_BUFFER_BIT);
if (!m_image.isNull()) {
QImage image = m_image.mirrored(false, true); // Flip the image vertically
gl
BindTexture(
GL
_TEXTURE_2D, m_textureId);
gl
TexImage2D(
GL
_TEXTURE_2D, 0,
GL
_RGBA, image.width(), image.height(), 0,
GL
_RGBA,
GL
_UNSIGNED_BYTE, image.bits());
gl
Begin(
GL
_QUADS);
gl
TexCoord2f(0.0f, m_position);
gl
Vertex2f(-1.0f, 1.0f);
gl
TexCoord2f(1.0f, m_position);
gl
Vertex2f(1.0f, 1.0f);
gl
TexCoord2f(1.0f, m_position - 1.0f);
gl
Vertex2f(1.0f, -1.0f);
gl
TexCoord2f(0.0f, m_position - 1.0f);
gl
Vertex2f(-1.0f, -1.0f);
gl
End();
void
resize
GL
(int width, int height) override
gl
Viewport(0, 0, width, height);
private:
void u
pdate
Position()
m_position += 0.02f;
if (m_position > 1.0f) {
m_position = 0.0f;
u
pdate
();
QImage m_image;
GL
uint m_textureId = 0;
float m_position = 0.0f;
int main(int argc, char *argv[])
QApplication a(argc, argv);
QImage image(":/image.jpg");
if (image.isNull()) {
qCritical() << "Failed to load image";
return -1;
ScrollImage w;
w.setGeometry(100, 100, image.width(), image.height());
w.setWindowTitle("Scroll Image");
w.setImage(image);
w.show();
return a.exec();
要运行此程序,您需要将一张名为“image.jpg”的图像添加到您的项目
中
,并将其路径添加到QImage构造函数
中
。运行程序后,您将看到图像从上到下滚动。每秒大约更新60次,因为定时器更新率为每16毫秒一次。您可以通过调整计时器时间来更改更新率。