目录
Qt如何创建OpenGL的渲染窗口?
类比GLFW库,Qt提供了OpenGL的渲染窗口类QOpenGLWidget:
1、重写initializeGL()和resizeGL()函数来设置OpenGL状态并提供透视图转换。
2、重写paintGL()来绘制3D场景,只调用OpenGL函数。
3、还可以使用QPainter将2D图形绘制到QOpenGLWidget子类上。在paintGL()中,不是发出OpenGL命令,而是构建一个用于部件的QPainter对象(注意QPainter没调用OpenGL渲染)。
Qt如何实现OpenGL函数绑定?
类比GLAD库,Qt不直接调用OpenGL函数,而是通过QOpenGLFunctions这一实例来进行函数调用,这种调用方法主要有以下两种:
1、直接从OpenGLContext::functions()中获取
QOpenGLFunctions *f = QOpenGLContext::currentContext()->functions();
f->glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
2、继承QOpenGLFunctions
class MyGLWidget : public QOpenGLWidget, protected QOpenGLFunctions
{
...
void initializeGL() override
{
initializeOpenGLFunctions();
glClearColor(...);
...
}
...
};
什么是图形管线?
图形管线,也称为渲染管线,是将渲染数据(如模型、材质、贴图等)进行整合、运算并最终显示到屏幕的流程。这一流程可以视为一个流水线,其中每个阶段都依赖上一个阶段的计算结果,逐步将原始数据转化为最终的图像。图形管线大致可以分为以下几个主要阶段:
1、程序阶段(应用阶段)
概述:此阶段主要由CPU负责完成,处理待渲染的数据,包括加载资源、物理计算、计算相机、光源、场景模型以及人物等对象的位置与动画帧等。
任务:剔除冗余的渲染数据(可能使用动态加载、遮挡剔除及可见性剔除等技术),并将这些数据整理成GPU可理解的形式(如位置、法线、UV坐标、切线及颜色值等),提交给GPU进行下一阶段的计算。
2、几何阶段
顶点处理:包括顶点着色器(Vertex Shader)的执行,负责将顶点的位置从局部空间转换到齐次剪切空间(Homogeneous Clipping Space),并可能操作顶点相关的属性(如颜色、法线、纹理坐标等)。顶点着色器还进行逐顶点的光照计算等操作。
变换:包括模型变换(Model Transformation)、视图变换(View Transformation)和投影变换(Projection Transformationÿ