QT OpenGL 3D

1、OPENGL 参数说明:

1.1、绘制方式和OpenGL枚举对应关系:

GL_POINTS            点
GL_LINES             线
GL_LINE_STRIP        条带线
GL_LINE_LOOP         循环线
GL_TRIANGLES         独立三角形
GL_TRIANGLE_STRIP    三角形条带
GL_TRIANGLE_FAN      三角形扇面

1.2、glGetIntegerv 函数中 pname 可以是以下值:

GL_ACCUM_ALPHA_BITS                 参数返回一个值:累积缓冲区中的 alpha 位平面数。
GL_ACCUM_BLUE_BITS                  参数返回一个值:累积缓冲区中的蓝色位平面数。
GL_ACCUM_CLEAR_VALUE                参数返回四个值:用于清除累积缓冲区的红色、绿色、蓝色和 alpha 值。 如果请求整数值,则从内部浮点表示形式线性映射,以便 1.0 返回最正的可表示整数值,-1.0 返回最负的可表示整数值。 请参阅 glClearAccum。
GL_ACCUM_GREEN_BITS                 参数返回一个值:累积缓冲区中的绿色位平面数。
GL_ACCUM_RED_BITS                   参数返回一个值:累积缓冲区中的红色位平面数。
GL_ALPHA_BIAS                       参数返回一个值:像素传输期间使用的 alpha 偏差因子。 请参阅 glPixelTransfer。
GL_ALPHA_BITS	                    参数返回一个值:每个颜色缓冲区中的 alpha 位平面数。
GL_ALPHA_SCALE	                    参数返回一个值:像素传输期间使用的 alpha 比例因子。 请参阅 glPixelTransfer。
GL_ALPHA_TEST	                    参数返回一个布尔值,该值指示是否启用片段的 alpha 测试。 请参阅 glAlphaFunc。
GL_ALPHA_TEST_FUNC	                参数返回一个值:alpha 测试函数的符号名称。 请参阅 glAlphaFunc。
GL_ALPHA_TEST_REF	                参数返回一个值:alpha 测试的引用值。 请参阅 glAlphaFunc。 如果请求整数值,则从内部浮点表示形式线性映射,以便 1.0 返回最正的可表示整数值,-1.0 返回最负的可表示整数值。
GL_ATTRIB_STACK_DEPTH	            参数返回一个值:属性堆栈的深度。 如果堆栈为空,则返回零。 请参阅 glPushAttrib。
GL_AUTO_NORMAL	                    参数返回一个布尔值,该值指示二维地图评估是否自动生成图面法线。 请参阅 glMap2。
GL_AUX_BUFFERS	                    参数返回一个值:辅助颜色缓冲区的数目。
GL_BLEND	                        参数返回一个布尔值,该值指示是否启用混合。 请参阅 glBlendFunc。
GL_BLEND_DST	                    参数返回一个值:标识目标混合函数的符号常量。 请参阅 glBlendFunc。
GL_BLEND_SRC	                    参数返回一个值:标识源混合函数的符号常量。 请参阅 glBlendFunc。
GL_BLUE_BIAS	                    参数返回一个值:像素传输期间使用的蓝色偏差因子。 请参阅 glPixelTransfer。
GL_BLUE_BITS	                    参数返回一个值:每个颜色缓冲区中的蓝色位平面数。
GL_BLUE_SCALE	                    参数返回一个值:像素传输期间使用的蓝色刻度因子。 请参阅 glPixelTransfer。
GL_CLIENT_ATTRIB_STACK_DEPTH	    参数返回一个值,该值指示属性堆栈的深度。 初始值为零。 请参阅 glPushClientAttrib。
GL_CLIP_PLANE i	                    参数返回一个布尔值,该值指示是否启用指定的剪辑平面。 请参阅 glClipPlane。
GL_COLOR_ARRAY	                    参数返回一个布尔值,该值指示是否定义了指定的颜色数组。 请参阅 glColorPointer。
GL_COLOR_ARRAY_SIZE	                参数返回一个值,即颜色数组中每个颜色的组件数。 请参阅 glColorPointer。
GL_COLOR_ARRAY_STRIDE	            参数返回一个值,即颜色数组中连续颜色之间的字节偏移量。 请参阅 glColorPointer。
GL_COLOR_ARRAY_TYPE	                参数返回一个值,即颜色数组中每个组件的数据类型。 请参阅 glColorPointer。
GL_COLOR_CLEAR_VALUE	            参数返回四个值:用于清除颜色缓冲区的红色、绿色、蓝色和 alpha 值。 如果请求整数值,则从内部浮点表示形式线性映射,以便 1.0 返回最正的可表示整数值,-1.0 返回最负的可表示整数值。 请参阅 glClearColor。
GL_COLOR_LOGIC_OP	                参数返回单个布尔值,该值指示是否使用逻辑操作将片段的 RGBA 颜色值合并到 framebuffer 中。 请参阅 glLogicOp。
GL_COLOR_MATERIAL	                参数返回一个布尔值,该值指示一个或多个材料参数是否跟踪当前颜色。 请参阅 glColorMaterial。
GL_COLOR_MATERIAL_FACE	            参数返回一个值:一个符号常量,指示哪些材料具有跟踪当前颜色的参数。 请参阅 glColorMaterial。
GL_COLOR_MATERIAL_PARAMETER	        参数返回一个值:一个符号常量,指示哪些材料参数正在跟踪当前颜色。 请参阅 glColorMaterial。
GL_COLOR_WRITEMASK	                参数返回四个布尔值:红色、绿色、蓝色和 alpha 写入为颜色缓冲区启用。 请参阅 glColorMask。
GL_CULL_FACE	                    参数返回一个布尔值,该值指示是否启用多边形剔除。 请参阅 glCullFace。
GL_CULL_FACE_MODE	                参数返回一个值:一个符号常量,指示要剔除哪个多边形面。 请参阅 glCullFace。
GL_CURRENT_COLOR	                参数返回四个值:当前颜色的红色、绿色、蓝色和 alpha 值。 如果请求整数值,则从内部浮点表示形式线性映射,以便 1.0 返回最正的可表示整数值,-1.0 返回最负表示的整数值。 请参阅 glColor。
GL_CURRENT_INDEX	                参数返回一个值:当前颜色索引。 请参阅 glIndex。
GL_CURRENT_NORMAL	                参数返回三个值:当前正态的 x、y 和 z 值。 如果请求整数值,则从内部浮点表示形式线性映射,以便 1.0 返回最正的可表示整数值,-1.0 返回最负表示的整数值。 见 glNormal。
GL_CURRENT_RASTER_COLOR	            参数返回四个值:当前光栅位置的红色、绿色、蓝色和 alpha 值。 如果请求整数值,则从内部浮点表示形式线性映射,以便 1.0 返回最正的可表示整数值,-1.0 返回最负表示的整数值。 请参阅 glRasterPos。
GL_CURRENT_RASTER_DISTANCE	        参数返回一个值:从眼睛到当前光栅位置的距离。 请参阅 glRasterPos。
GL_CURRENT_RASTER_INDEX	            参数返回一个值:当前光栅位置的颜色索引。 请参阅 glRasterPos。
GL_CURRENT_RASTER_POSITION	        参数返回四个值:当前光栅位置的 x、y、z 和 w 组件。 x、y 和 z 组件位于窗口坐标中,w 位于剪辑坐标中。 请参阅 glRasterPos。
GL_CURRENT_RASTER_POSITION_VALID	参数返回一个布尔值,该值指示当前光栅位置是否有效。 请参阅 glRasterPos。
GL_CURRENT_RASTER_TEXTURE_COORDS	参数返回四个值:s、t、r 和 q 当前光栅纹理坐标。 请参阅 glRasterPos 和 glTexCoord。
GL_CURRENT_TEXTURE_COORDS           参数返回四个值:s、t、r 和 q 当前纹理坐标。 请参阅 glTexCoord。
GL_DEPTH_BIAS                       参数返回一个值:像素传输期间使用的深度偏差因子。 请参阅 glPixelTransfer。
GL_DEPTH_BITS                       参数返回一个值:深度缓冲区中的位平面数。
GL_DEPTH_CLEAR_VALUE                参数返回一个值:用于清除深度缓冲区的值。 如果请求整数值,则从内部浮点表示形式线性映射,以便 1.0 返回最正的可表示整数值,-1.0 返回最负表示的整数值。 请参阅 glClearDepth。
GL_DEPTH_FUNC                       参数返回一个值:指示深度比较函数的符号常量。 请参阅 glDepthFunc。
GL_DEPTH_RANGE                      参数返回两个值:深度缓冲区的近和远映射限制。 如果请求整数值,则从内部浮点表示形式线性映射,以便 1.0 返回最正的可表示整数值,-1.0 返回最负表示的整数值。 请参阅 glDepthRange。
GL_DEPTH_SCALE                      参数返回一个值:像素传输期间使用的深度刻度因子。 请参阅 glPixelTransfer。
GL_DEPTH_TEST                       参数返回一个布尔值,该值指示是否启用片段的深度测试。 请参阅 glDepthFunc 和 glDepthRange。
GL_DEPTH_WRITEMASK                  参数返回一个布尔值,该值指示是否启用了深度缓冲区进行写入。 请参阅 glDepthMask。
GL_DITHER                           参数返回一个布尔值,该值指示是否启用片段颜色和索引的任一值。
GL_DOUBLEBUFFER                     参数返回一个布尔值,该值指示是否支持双缓冲。
GL_DRAW_BUFFER                      参数返回一个值:一个符号常量,指示要绘制哪些缓冲区。 请参阅 glDrawBuffer。
GL_EDGE_FLAG                        参数返回一个布尔值,该值指示当前边缘标志是 true 还是 false。 请参阅 glEdgeFlag。
GL_EDGE_FLAG_ARRAY                  参数返回一个布尔值,该值指示是否启用边缘标志数组。 请参阅 glEdgeFlagPointer。
GL_EDGE_FLAG_ARRAY_STRIDE           参数返回一个值,即边缘标志数组中连续边缘标志之间的字节偏移量。 请参阅 glEdgeFlagPointer。
GL_FOG                              参数返回一个布尔值,该值指示是否启用雾化。 请参阅 glFog。
GL_FOG_COLOR                        参数返回四个值:雾色的红色、绿色、蓝色和 alpha 分量。 如果请求整数值,则从内部浮点表示形式线性映射,以便 1.0 返回最正的可表示整数值,-1.0 返回最负表示的整数值。 请参阅 glFog。
GL_FOG_DENSITY                      参数返回一个值:雾密度参数。 请参阅 glFog。
GL_FOG_END                          参数返回一个值:线性雾公式的结束因子。 请参阅 glFog。
GL_FOG_HINT                         参数返回一个值:指示雾提示模式的符号常量。 请参阅 glHint。
GL_FOG_INDEX                        参数返回一个值:雾色索引。 请参阅 glFog。
GL_FOG_MODE                         参数返回一个值:一个符号常量,指示选择了哪个雾公式。 请参阅 glFog。
GL_FOG_START                        参数返回一个值:线性雾公式的起始因子。 请参阅 glFog。
GL_FRONT_FACE                       参数返回一个值:一个符号常量,指示是顺时针还是逆时针多边形绕组被视为正面。 请参阅 glFrontFace。
GL_GREEN_BIAS                       参数返回一个值:像素传输期间使用的绿色偏差因子。
GL_GREEN_BITS                       参数返回一个值:每个颜色缓冲区中的绿色位平面数。
GL_GREEN_SCALE                      参数返回一个值:像素传输期间使用的绿色刻度因子。 请参阅 glPixelTransfer。
GL_INDEX_ARRAY                      参数返回一个布尔值,该值指示是否启用颜色索引数组。 请参阅 glIndexPointer。
GL_INDEX_ARRAY_STRIDE               参数返回一个值,即颜色索引数组中连续颜色索引之间的字节偏移量。 请参阅 glIndexPointer。
GL_INDEX_ARRAY_TYPE                 参数返回一个值,即颜色索引数组中索引的数据类型。 初始值		GL_FLOAT。 请参阅 glIndexPointer。
GL_INDEX_BITS                       参数返回一个值:每个颜色索引缓冲区中的位平面数。
GL_INDEX_CLEAR_VALUE                参数返回一个值:用于清除颜色索引缓冲区的颜色索引。 请参阅 glClearIndex。
GL_INDEX_LOGIC_OP                   参数返回一个布尔值,该值指示片段的索引值是否使用逻辑操作合并到 framebuffer 中。 请参阅 glLogicOp。
GL_INDEX_MODE                       参数返回一个布尔值,该值指示 OpenGL 是否处于颜色索引模式 (TRUE) 还是 RGBA 模式 (FALSE) 。
GL_INDEX_OFFSET                     参数返回一个值:在像素传输期间添加到颜色和模具索引的偏移量。 请参阅 glPixelTransfer。
GL_INDEX_SHIFT                      参数返回一个值:颜色和模具索引在像素传输期间移动的量。 请参阅 glPixelTransfer。
GL_INDEX_WRITEMASK                  参数返回一个值:一个掩码,指示可以写入每个颜色索引缓冲区的位平面。 请参阅 glIndexMask。
GL_LIGHT i                          参数返回一个布尔值,该值指示是否启用指定的光。 请参阅 glLight 和 glLightModel。
GL_LIGHTING                         参数返回一个布尔值,该值指示是否启用照明。 请参阅 glLightModel。
GL_LIGHT_MODEL_AMBIENT              参数返回四个值:整个场景环境强度的红色、绿色、蓝色和 alpha 部分。 如果请求整数值,则从内部浮点表示形式线性映射,以便 1.0 返回最正的可表示整数值,-1.0 返回最负表示的整数值。 请参阅 glLightModel。
GL_LIGHT_MODEL_LOCAL_VIEWER         参数返回一个布尔值,该值指示反射计算是否将查看器视为场景本地。 请参阅 glLightModel。
GL_LIGHT_MODEL_TWO_SIDE             参数返回一个布尔值,该值指示是否使用单独的材料计算正面多边形和背向多边形的照明。 请参阅 glLightModel。
GL_LINE_SMOOTH                      参数返回一个布尔值,该值指示是否启用行反锯齿。 请参阅 glLineWidth。
GL_LINE_SMOOTH_HINT                 参数返回一个值:指示线条抗锯齿提示模式的符号常量。 请参阅 glHint。
GL_LINE_STIPPLE                     参数返回一个布尔值,该值指示是否启用行的存根。 请参阅 glLineStipple。
GL_LINE_STIPPLE_PATTERN             参数返回一个值:16 位行存根模式。 请参阅 glLineStipple。
GL_LINE_STIPPLE_REPEAT              参数返回一个值:行存重复因子。 请参阅 glLineStipple。
GL_LINE_WIDTH                       参数返回一个值:使用 glLineWidth 指定的线条宽度。
GL_LINE_WIDTH_GRANULARITY           参数返回一个值:反锯齿线的相邻支持的宽度之间的宽度差。 请参阅 glLineWidth。
GL_LINE_WIDTH_RANGE                 参数返回两个值:抗锯齿线支持的最小和最大宽度。 请参阅 glLineWidth。
GL_LIST_BASE                        参数返回一个值:添加到提供给 glCallLists 的数组中所有名称的基偏移量。 请参阅 glListBase。
GL_LIST_INDEX                       参数返回一个值:当前正在构造的显示列表的名称。 如果当前未显示列表正在建设中,则返回零。 请参阅 glNewList。
GL_LIST_MODE                        参数返回一个值:一个符号常量,指示当前正在构造的显示列表的构造模式。 请参阅 glNewList。
GL_LOGIC_OP                         参数返回单个布尔值,该值指示是否使用逻辑操作将片段索引合并到 framebuffer 中。 请参阅 glLogicOp。
GL_LOGIC_OP_MODE                    参数返回一个值:指示所选逻辑操作模式的符号常量。 请参阅 glLogicOp。
GL_MAP1_COLOR_4                     参数返回一个布尔值,该值指示 1D 评估是否生成颜色。 请参阅 glMap1。
GL_MAP1_GRID_DOMAIN                 参数返回两个值:1D 映射网格域的终结点。 请参阅 glMapGrid。
GL_MAP1_GRID_SEGMENTS               参数返回一个值:1D 映射网格域中的分区数。 请参阅 glMapGrid。
GL_MAP1_INDEX                       参数返回一个布尔值,该值指示 1D 评估是否生成颜色索引。 请参阅 glMap1。
GL_MAP1_NORMAL                      参数返回一个布尔值,该值指示 1D 计算是否生成法则。 请参阅 glMap1。
GL_MAP1_TEXTURE_COORD_1             参数返回一个布尔值,该值指示 1D 计算是否生成 1D 纹理坐标。 请参阅 glMap1。
GL_MAP1_TEXTURE_COORD_2             参数返回一个布尔值,该值指示 1D 计算是否生成二维纹理坐标。 请参阅 glMap1。
GL_MAP1_TEXTURE_COORD_3             参数返回一个布尔值,该值指示 1D 计算是否生成三维纹理坐标。 请参阅 glMap1。
GL_MAP1_TEXTURE_COORD_4             参数返回一个布尔值,该值指示 1D 计算是否生成 4D 纹理坐标。 请参阅 glMap1。
GL_MAP1_VERTEX_3                    参数返回一个布尔值,该值指示 1D 计算是否生成三维顶点坐标。 请参阅 glMap1。
GL_MAP1_VERTEX_4                    参数返回一个布尔值,该值指示 1D 计算是否生成 4-D 顶点坐标。 请参阅 glMap1。
GL_MAP2_COLOR_4                     参数返回一个布尔值,该值指示 2D 评估是否生成颜色。 请参阅 glMap2。
GL_MAP2_GRID_DOMAIN                 参数返回四个值:二维映射 i 和 j 网格域的终结点。 请参阅 glMapGrid。
GL_MAP2_GRID_SEGMENTS               参数返回两个值:二维映射 i 和 j 网格域中的分区数。 请参阅 glMapGrid。
GL_MAP2_INDEX                       参数返回一个布尔值,该值指示二维评估是否生成颜色索引。 请参阅 glMap2。
GL_MAP2_NORMAL                      参数返回一个布尔值,该值指示 2D 评估是否生成正常值。 请参阅 glMap2。
GL_MAP2_TEXTURE_COORD_1             参数返回一个布尔值,该值指示 2D 计算是否生成 1D 纹理坐标。 请参阅 glMap2。
GL_MAP2_TEXTURE_COORD_2             参数返回一个布尔值,该值指示二维计算是否生成二维纹理坐标。 请参阅 glMap2。
GL_MAP2_TEXTURE_COORD_3             参数返回一个布尔值,该值指示 2D 计算是否生成三维纹理坐标。 请参阅 glMap2。
GL_MAP2_TEXTURE_COORD_4             参数返回一个布尔值,该值指示二维计算是否生成四维纹理坐标。 请参阅 glMap2。
GL_MAP2_VERTEX_3                    参数返回一个布尔值,该值指示二维计算是否生成三维顶点坐标。 请参阅 glMap2。
GL_MAP2_VERTEX_4                    参数返回一个布尔值,该值指示 2D 计算是否生成 4-D 顶点坐标。 请参阅 glMap2。
GL_MAP_COLOR                        参数返回单个布尔值,该值指示在像素传输期间是否将颜色和颜色索引替换为表格查找。 请参阅 glPixelTransfer。
GL_MAP_STENCIL                      参数返回一个布尔值,该值指示是否要在像素传输期间用表格查找替换模具索引。 请参阅 glPixelTransfer。
GL_MATRIX_MODE                      参数返回一个值:一个符号常量,指示哪个矩阵堆栈当前是所有矩阵操作的目标。 请参阅 glMatrixMode。
GL_MAX_CLIENT_ATTRIB_STACK_DEPTH	参数返回一个值,该值指示客户端属性堆栈支持的最大深度。 请参阅 glPushClientAttrib。
GL_MAX_ATTRIB_STACK_DEPTH           参数返回一个值:属性堆栈支持的最大深度。 请参阅 glPushAttrib。
GL_MAX_CLIP_PLANES                  参数返回一个值:应用程序定义的剪辑平面的最大数目。 请参阅 glClipPlane。
GL_MAX_EVAL_ORDER                   参数返回一个值:1-D 和二维计算器支持的最大公式顺序。 请参阅 glMap1 和 glMap2。
GL_MAX_LIGHTS                       参数返回一个值:最大灯数。 请参阅 glLight。
GL_MAX_LIST_NESTING                 参数返回一个值:显示列表遍历期间允许的最大递归深度。 请参阅 glCallList。
GL_MAX_MODELVIEW_STACK_DEPTH        参数返回一个值:modelview 矩阵堆栈支持的最大深度。 请参阅 glPushMatrix。
GL_MAX_NAME_STACK_DEPTH             参数返回一个值:所选名称堆栈支持的最大深度。 请参阅 glPushName。
GL_MAX_PIXEL_MAP_TABLE              参数返回一个值:glPixelMap 查找表的最大支持大小。
GL_MAX_PROJECTION_STACK_DEPTH       参数返回一个值:投影矩阵堆栈支持的最大深度。 请参阅 glPushMatrix。
GL_MAX_TEXTURE_SIZE                 参数返回一个值:任何纹理图像的最大宽度或高度 (无边框) 。 请参阅 glTexImage1D 和 glTexImage2D。
GL_MAX_TEXTURE_STACK_DEPTH          参数返回一个值:纹理矩阵堆栈支持的最大深度。 请参阅 glPushMatrix。
GL_MAX_VIEWPORT_DIMS                参数返回两个值:视区支持的最大宽度和高度。 请参阅 glViewport。
GL_MODELVIEW_MATRIX                 参数返回 16 个值:modelview 矩阵堆栈顶部的 modelview 矩阵。 请参阅 glPushMatrix。
GL_MODELVIEW_STACK_DEPTH            参数返回一个值:modelview 矩阵堆栈上的矩阵数。 请参阅 glPushMatrix。
GL_NAME_STACK_DEPTH                 参数返回一个值:选择名称堆栈上的名称数。 请参阅 glPushName。
GL_NORMAL_ARRAY                     参数返回单个布尔值,该值指示是否启用普通数组。 请参阅 glNormalPointer。
GL_NORMAL_ARRAY_STRIDE              参数返回一个值,即普通数组中连续正态之间的字节偏移量。 请参阅 glNormalPointer。
GL_NORMAL_ARRAY_TYPE                参数返回一个值,即普通数组中每个坐标的数据类型。 请参阅 glNormalPointer。
GL_NORMALIZE                        参数返回一个布尔值,该值指示在将正常值转换为眼睛坐标后是否自动缩放为单位长度。 见 glNormal。
GL_PACK_ALIGNMENT                   参数返回一个值:用于将像素数据写入内存的字节对齐方式。 请参阅 glPixelStore。
GL_PACK_LSB_FIRST                   参数返回一个布尔值,该值指示写入内存的单位像素是否首先写入每个无符号字节的最小有效位。 请参阅 glPixelStore。
GL_PACK_ROW_LENGTH                  参数返回一个值:用于将像素数据写入内存的行长度。 请参阅 glPixelStore。
GL_PACK_SKIP_PIXELS                 参数返回一个值:在第一个像素写入内存之前跳过的像素位置数。 请参阅 glPixelStore。
GL_PACK_SKIP_ROWS                   参数返回一个值:在第一个像素写入内存之前跳过的像素位置行数。 请参阅 glPixelStore。
GL_PACK_SWAP_BYTES                  参数返回一个布尔值,该值指示在写入内存之前是否交换 2 字节和 4 字节像素索引和组件的字节数。 请参阅 glPixelStore。
GL_PERSPECTIVE_CORRECTION_HINT      参数返回一个值:指示透视更正提示模式的符号常量。 请参阅 glHint。
GL_PIXEL_MAP_A_TO_A_SIZE            参数返回一个值:alpha 到 alpha 像素转换表的大小。 请参阅 glPixelMap。
GL_PIXEL_MAP_B_TO_B_SIZE            参数返回一个值:蓝色到蓝色像素转换表的大小。 请参阅 glPixelMap。
GL_PIXEL_MAP_G_TO_G_SIZE            参数返回一个值:绿色到绿色像素转换表的大小。 请参阅 glPixelMap。
GL_PIXEL_MAP_I_TO_A_SIZE            参数返回一个值:索引到 alpha 像素转换表的大小。 请参阅 glPixelMap。
GL_PIXEL_MAP_I_TO_B_SIZE            参数返回一个值:索引到蓝色像素转换表的大小。 请参阅 glPixelMap。
GL_PIXEL_MAP_I_TO_G_SIZE            参数返回一个值:索引到绿色像素转换表的大小。 请参阅 glPixelMap。
GL_PIXEL_MAP_I_TO_I_SIZE            参数返回一个值:索引到索引像素转换表的大小。 请参阅 glPixelMap。
GL_PIXEL_MAP_I_TO_R_SIZE            参数返回一个值:索引到红色像素转换表的大小。 请参阅 glPixelMap。
GL_PIXEL_MAP_R_TO_R_SIZE            参数返回一个值:红色到红色像素转换表的大小。 请参阅 glPixelMap。
GL_PIXEL_MAP_S_TO_S_SIZE            参数返回一个值:模具到模具像素转换表的大小。 请参阅 glPixelMap。
GL_POINT_SIZE                       参数返回一个值:glPointSize 指定的点大小。
GL_POINT_SIZE_GRANULARITY           参数返回一个值:抗锯齿点的相邻支持大小之间的差异。 请参阅 glPointSize。
GL_POINT_SIZE_RANGE                 参数返回两个值:抗锯齿点的最小和最大支持大小。 请参阅 glPointSize。
GL_POINT_SMOOTH                     参数返回一个布尔值,该值指示是否启用点反锯齿。 请参阅 glPointSize。
GL_POINT_SMOOTH_HINT                参数返回一个值:指示点抗锯齿提示模式的符号常量。 请参阅 glHint。
GL_POLYGON_MODE                     参数返回两个值:符号常量,指示正面和后向多边形是光栅化为点、线条还是填充多边形。 请参阅 glPolygonMode。
GL_POLYGON_OFFSET_FACTOR            参数返回一个值,用于确定在光栅化多边形时生成的每个片段的深度值的变量偏移量。 请参阅 glPolygonOffset。
GL_POLYGON_OFFSET_UNITS             参数返回一个值。 此值乘以特定于实现的值,然后添加到在光栅化多边形时生成的每个片段的深度值。 请参阅 glPolygonOffset。
GL_POLYGON_OFFSET_FILL              参数返回一个布尔值,该值指示是否为填充模式下的多边形启用多边形偏移量。 请参阅 glPolygonOffset。
GL_POLYGON_OFFSET_LINE              参数返回一个布尔值,该值指示是否为线条模式下的多边形启用多边形偏移量。 请参阅 glPolygonOffset。
GL_POLYGON_OFFSET_POINT             参数返回一个布尔值,该值指示是否为点模式下的多边形启用多边形偏移量。 请参阅 glPolygonOffset。
GL_POLYGON_SMOOTH                   参数返回一个布尔值,该值指示是否启用多边形的反锯齿。 请参阅 glPolygonMode。
GL_POLYGON_SMOOTH_HINT              参数返回一个值:指示多边形反锯齿提示模式的符号常量。 请参阅 glHint。
GL_POLYGON_STIPPLE                  参数返回一个布尔值,该值指示是否启用多边形的存根。 请参阅 glPolygonStipple。
GL_PROJECTION_MATRIX                参数返回 16 个值:投影矩阵堆栈顶部的投影矩阵。 请参阅 glPushMatrix。
GL_PROJECTION_STACK_DEPTH           参数返回一个值:投影矩阵堆栈上的矩阵数。 请参阅 glPushMatrix。
GL_READ_BUFFER                      参数返回一个值:一个符号常量,指示选择哪个颜色缓冲区进行读取。 请参阅 glReadPixels 和 glAccum。
GL_RED_BIAS                         参数返回一个值:像素传输期间使用的红色偏差因子。 请参阅 glPixelTransfer。
GL_RED_BITS                         参数返回一个值:每个颜色缓冲区中的红色位平面数。
GL_RED_SCALE                        参数返回一个值:像素传输期间使用的红色刻度因子。 请参阅 glPixelTransfer。
GL_RENDER_MODE                      参数返回一个值:指示 OpenGL 是否处于呈现、选择或反馈模式的符号常量。 请参阅 glRenderMode。
GL_RGBA_MODE                        参数返回单个布尔值,该值指示 OpenGL 是否处于 RGBA 模式, (TRUE) 还是颜色索引模式 (FALSE) 。 请参阅 glColor。
GL_SCISSOR_BOX                      参数返回四个值:剪刀框的 x 和 y 窗口坐标,后跟其宽度和高度。 请参阅 glScissor。
GL_SCISSOR_TEST                     参数返回一个布尔值,该值指示是否启用剪裁。 请参阅 glScissor。
GL_SHADE_MODEL                      参数返回一个值:指示着色模式是平面还是平滑的符号常量。 请参阅 glShadeModel。
GL_STENCIL_BITS                     参数返回一个值:模具缓冲区中的位平面数。
GL_STENCIL_CLEAR_VALUE              参数返回一个值:清除模具位平面的索引。 请参阅 glClearStencil。
GL_STENCIL_FAIL                     参数返回一个值:一个符号常量,指示模具测试失败时执行的操作。 请参阅 glStencilOp。
GL_STENCIL_FUNC                     参数返回一个值:一个符号常量,指示用于将模具引用值与模具缓冲区值进行比较的函数。 请参阅 glStencilFunc。
GL_STENCIL_PASS_DEPTH_FAIL          参数返回一个值:一个符号常量,指示模具测试通过时执行的操作,但深度测试失败。 请参阅 glStencilOp。
GL_STENCIL_PASS_DEPTH_PASS          参数返回一个值:一个符号常量,指示模具测试通过和深度测试通过时要执行的操作。 请参阅 glStencilOp。
GL_STENCIL_REF                      参数返回一个值:与模具缓冲区的内容进行比较的引用值。 请参阅 glStencilFunc。
GL_STENCIL_TEST                     参数返回一个布尔值,该值指示是否启用了片段的模具测试。 请参阅 glStencilFunc 和 glStencilOp。
GL_STENCIL_VALUE_MASK               参数返回一个值:用于在比较模具引用值和模具缓冲区值之前掩码的掩码。 请参阅 glStencilFunc。
GL_STENCIL_WRITEMASK                参数返回一个值:控制模具位平面写入的掩码。 请参阅 glStencilMask。
GL_STEREO                           参数返回单个布尔值,该值指示是否支持 (左右立体声缓冲区) 。
GL_SUBPIXEL_BITS                    参数返回一个值:估计用于在窗口坐标中定位光栅化几何图形的子像素分辨率位数。
GL_TEXTURE_1D                       参数返回一个布尔值,该值指示是否启用 1D 纹理映射。 请参阅 glTexImage1D。
GL_TEXTURE_2D                       参数返回一个布尔值,该值指示是否启用二维纹理映射。 请参阅 glTexImage2D。
GL_TEXTURE_COORD_ARRAY              参数返回一个布尔值,该值指示是否启用纹理坐标数组。 请参阅 glTexCoordPointer。
GL_TEXTURE_COORD_ARRAY_SIZE         参数返回一个值,即纹理坐标数组中每个元素的坐标数。 请参阅 glTexCoordPointer。
GL_TEXTURE_COORD_ARRAY_STRIDE       参数返回一个值,即纹理坐标数组中连续元素之间的字节偏移量。 请参阅 glTexCoordPointer。
GL_TEXTURE_COORD_ARRAY_TYPE         参数参数参数返回一个值,即纹理坐标数组中坐标的数据类型。 请参阅 glTexCoordPointer。
GL_TEXTURE_ENV_COLOR                参数返回四个值:纹理环境颜色的红色、绿色、蓝色和 alpha 值。 如果请求整数值,则从内部浮点表示形式线性映射,以便 1.0 返回最正的可表示整数值,1.0 返回最负表示的整数值。 请参阅 glTexEnv。
GL_TEXTURE_ENV_MODE                 参数返回一个值:一个符号常量,指示当前选择了哪个纹理环境函数。 请参阅 glTexEnv。
GL_TEXTURE_GEN_Q                    参数返回一个布尔值,该值指示是否启用自动生成 Q 纹理坐标。 请参阅 glTexGen。
GL_TEXTURE_GEN_R                    参数返回一个布尔值,该值指示是否启用自动生成 R 纹理坐标。 请参阅 glTexGen。
GL_TEXTURE_GEN_S                    参数返回一个布尔值,该值指示是否启用 S 纹理坐标的自动生成。 请参阅 glTexGen。
GL_TEXTURE_GEN_T                    参数返回一个布尔值,该值指示是否启用自动生成 T 纹理坐标。 请参阅 glTexGen。
GL_TEXTURE_MATRIX                   参数返回 16 个值:纹理矩阵堆栈顶部的纹理矩阵。 请参阅 glPushMatrix。
GL_TEXTURE_STACK_DEPTH              参数返回一个值:纹理矩阵堆栈上的矩阵数。 请参阅 glPushMatrix。
GL_UNPACK_ALIGNMENT                 参数返回一个值:用于从内存中读取像素数据的字节对齐方式。 请参阅 glPixelStore。
GL_UNPACK_LSB_FIRST                 参数返回一个布尔值,该值指示从内存中读取的单位像素是否首先从每个无符号字节的最小有效位读取。 请参阅 glPixelStore。
GL_UNPACK_ROW_LENGTH                参数返回一个值:用于从内存中读取像素数据的行长度。 请参阅 glPixelStore。
GL_UNPACK_SKIP_PIXELS               参数返回一个值:从内存中读取第一个像素之前跳过的像素位置数。 请参阅 glPixelStore。
GL_UNPACK_SKIP_ROWS                 参数返回一个值:从内存中读取第一个像素之前跳过的像素位置行数。 请参阅 glPixelStore。
GL_UNPACK_SWAP_BYTES                参数返回一个布尔值,该值指示从内存中读取后是否交换了 2 字节和 4 字节像素索引和组件的字节数。 请参阅 glPixelStore。
GL_VERTEX_ARRAY                     参数返回一个布尔值,该值指示是否启用顶点数组。 请参阅 glVertexPointer。
GL_VERTEX_ARRAY_SIZE                参数返回一个值,即顶点数组中每个顶点的坐标数。 请参阅 glVertexPointer。
GL_VERTEX_ARRAY_STRIDE              参数返回一个值,即顶点数组中连续顶点之间的字节偏移量。 请参阅 glVertexPointer。
GL_VERTEX_ARRAY_TYPE                参数返回一个值,即顶点数组中每个坐标的数据类型。 请参阅 glVertexPointer。
GL_VIEWPORT                         参数返回四个值:视区 x 和 y 窗口坐标,后跟其宽度和高度。 请参阅 glViewport。
GL_ZOOM_X                           参数返回一个值:x 像素缩放因子。 请参阅 glPixelZoom。
GL_ZOOM_Y                           参数返回一个值:y 像素缩放因子。 请参阅 glPixelZoom。

1.3、enum QOpenGLBuffer::Access:此枚举定义了 map() 的访问模式。

ReadOnly:缓冲区将被映射为只读。
WriteOnly:缓冲区将被映射为只写。
ReadWrite:缓冲区将被映射用于读写。

1.4、enum QOpenGLBuffer::RangeAccessFlag:此枚举定义了 mapRange() 的访问模式位。

RangeRead:缓冲区将被映射以供读取。
RangeWrite:缓冲区将被映射以进行写入。
RangeInvalidate:丢弃指定范围的先前内容。
RangeInvalidateBuffer:丢弃整个缓冲区的先前内容。
RangeFlushExplicit:表示修改将通过 glFlushMappedBufferRange 显式刷新。
RangeUnsynchronized:表示在从 mapRange() 返回之前不应该同步挂起的操作。

1.5、enum QOpenGLBuffer::Type:此枚举定义了使用 QOpenGLBuffer 创建的 OpenGL 缓冲区对象的类型。

VertexBuffer:顶点数组时使用的顶点缓冲区对象。
IndexBuffer:用于 glDrawElements() 的索引缓冲区对象。
PixelPackBuffer:用于从 OpenGL 服务器读取像素数据的像素包缓冲区对象。
PixelUnpackBuffer:像素解包缓冲区对象,用于将像素数据写入 OpenGL 服务器。

1.6、QOpenGLBuffer::UsagePattern:此枚举定义了 QOpenGLBuffer 对象的使用模式。

StreamDraw:数据将被设置一次,并用于绘制操作几次。
StreamRead:数据将被设置一次并使用几次从OpenGL服务器读回数据。
StreamCopy:数据将被设置一次并使用几次,用于从 OpenGL 服务器读取数据以用于进一步的绘图操作。
StaticDraw:数据会设置一次,多次用于绘图操作。
StaticRead:数据将被设置一次并多次用于从 OpenGL 服务器读取数据。
StaticCopy:数据将被设置一次并多次用于从 OpenGL 服务器读取数据以用于进一步的绘图操作。
DynamicDraw:数据会被反复修改,多次用于绘图操作。
DynamicRead:数据将被反复修改并多次用于从OpenGL服务器读回数据。
DynamicCopy:数据将被反复修改并多次用于从 OpenGL 服务器读取数据以用于进一步的绘图操作

1.7、OPENGL 获取状态的一些枚举值:

GL_ACTIVE_TEXTURE                       参数返回一个表示活动多重纹理单元的值。初始值为GL_TEXTURE0。请参阅glActiveTexture。
GL_ALIASED_LINE_WIDTH_RANGE             参数返回两个值,即别名行的最小和最大支持宽度。范围必须包括宽度1。
GL_ALIASED_POINT_SIZE_RANGE             参数返回两个值,即别名点支持的最小和最大尺寸。范围必须包括1号。
GL_ALPHA_BITS                           参数返回一个值,即当前绑定的帧缓冲区的颜色缓冲区中的alpha位平面的数量。
GL_ARRAY_BUFFER_BINDING                 参数返回单个值,即当前绑定到目标GL_ARRAY_BUFFER的缓冲区对象的名称。如果没有缓冲区对象绑定到此目标,则返回0。初始值为0.请参阅glBindBuffer。
GL_BLEND                                参数返回一个布尔值,指示是否启用了混合。初始值为GL_FALSE。请参阅glBlendFunc。
GL_BLEND_COLOR                          参数返回四个值,红色,绿色,蓝色和alpha值,它们是混合颜色的组成部分。请参阅glBlendColor。
GL_BLEND_DST_ALPHA                      参数返回一个值,该符号常量标识alpha目标混合函数。初始值为GL_ZERO。请参阅glBlendFunc和glBlendFuncSeparate。
GL_BLEND_DST_RGB                        参数返回一个值,该符号常量标识RGB目标混合函数。初始值为GL_ZERO。请参阅glBlendFunc和glBlendFuncSeparate。
GL_BLEND_EQUATION_ALPHA                 参数返回一个值,一个符号常量,指示Alpha混合方程是GL_FUNC_ADD,GL_FUNC_SUBTRACT还是GL_FUNC_REVERSE_SUBTRACT。请参阅glBlendEquationSeparate。
GL_BLEND_EQUATION_RGB                   参数返回一个值,一个符号常量,指示RGB混合方程是GL_FUNC_ADD,GL_FUNC_SUBTRACT还是GL_FUNC_REVERSE_SUBTRACT。请参阅glBlendEquationSeparate。
GL_BLEND_SRC_ALPHA                      参数返回一个值,这是一个标识alpha源混合函数的符号常量。初始值为GL_ONE。请参阅glBlendFunc和glBlendFuncSeparate。
GL_BLEND_SRC_RGB                        参数返回一个值,这个符号常量标识RGB源混合函数。初始值为GL_ONE。请参阅glBlendFunc和glBlendFuncSeparate。
GL_BLUE_BITS                            参数返回一个值,即当前绑定的帧缓冲区的颜色缓冲区中的蓝色位平面的数量。
GL_COLOR_CLEAR_VALUE                    参数返回四个值:用于清除颜色缓冲区的红色,绿色,蓝色和alpha值。如果请求,整数值从内部浮点表示线性映射,使得1.0返回最正可表示的整数值,-1.0返回最负可表示的整数值。初始值为(0,0,0,0)。请参阅glClearColor。
GL_COLOR_WRITEMASK                      参数返回四个布尔值:红色,绿色,蓝色和alpha写入启用颜色缓冲区。初始值为(GL_TRUE,GL_TRUE,GL_TRUE,GL_TRUE)。请参阅glColorMask。
GL_COMPRESSED_TEXTURE_FORMATS           参数返回长度为GL_NUM_COMPRESSED_TEXTURE_FORMATS的符号常量列表,指示哪些压缩纹理格式可用。请参阅glCompressedTexImage2D。
GL_CULL_FACE                            参数返回一个布尔值,指示是否启用了多边形剔除。初始值为GL_FALSE。请参阅glCullFace。
GL_CULL_FACE_MODE                       参数返回一个值,一个符号常量,指示要剔除哪些多边形面。初始值为GL_BACK。请参阅glCullFace。
GL_CURRENT_PROGRAM                      参数返回一个值,即当前活动的程序对象的名称,如果没有程序对象处于活动状态,则返回0。请参阅glUseProgram。
GL_DEPTH_BITS                           参数返回一个值,即当前绑定的帧缓冲区的深度缓冲区中的位平面数。
GL_DEPTH_CLEAR_VALUE                    参数返回一个值,该值用于清除深度缓冲区。如果请求,整数值从内部浮点表示线性映射,使得1.0返回最正可表示的整数值,-1.0返回最负可表示的整数值。初始值为1.请参阅glDepthRangef。
GL_DEPTH_FUNC                           参数返回一个值,表示深度比较函数的符号常量。初始值为GL_LESS。请参阅glDepthFunc。
GL_DEPTH_RANGE                          参数返回两个值:深度缓冲区的近和远映射限制。如果请求,整数值从内部浮点表示线性映射,使得1.0返回最正可表示的整数值,-1.0返回最负可表示的整数值。初始值为(0,1)。请参阅glDepthRangef。
GL_DEPTH_TEST                           参数返回一个布尔值,指示是否启用了片段的深度测试。初始值为GL_FALSE。请参阅glDepthFunc和glDepthRangef。
GL_DEPTH_WRITEMASK                      参数返回一个布尔值,指示深度缓冲区是否已启用写入。初始值为GL_TRUE。请参阅glDepthMask。
GL_DITHER                               参数返回一个布尔值,指示是否启用了片段颜色和索引的抖动。初始值为GL_TRUE。
GL_ELEMENT_ARRAY_BUFFER_BINDING         参数返回单个值,即当前绑定到目标GL_ELEMENT_ARRAY_BUFFER的缓冲区对象的名称。如果没有缓冲区对象绑定到此目标,则返回0。初始值为0.请参阅glBindBuffer。
GL_FRAMEBUFFER_BINDING                  参数返回单个值,即当前绑定的帧缓冲区的名称。初始值为0,表示默认的帧缓冲区。请参阅glBindFramebuffer。
GL_FRONT_FACE                           参数返回一个值,一个符号常数,表示顺时针或逆时针多边形绕组是否被视为正面。初始值为GL_CCW。请参阅glFrontFace。
GL_GENERATE_MIPMAP_HINT                 参数返回一个值,一个符号常量,指示mipmap生成过滤提示的模式。初始值为GL_DONT_CARE。见glHint。
GL_GREEN_BITS                           参数返回一个值,即当前绑定的帧缓冲区的颜色缓冲区中的绿色位平面的数量。
GL_IMPLEMENTATION_COLOR_READ_FORMAT     参数返回一个值,即实现选择的格式,其中可以从当前绑定的帧缓冲区的颜色缓冲区中读取像素,并结合GL_IMPLEMENTATION_COLOR_READ_TYPE。除了这种依赖于实现的格式/类型对之外,每个实现始终允许格式GL_RGBA和类型GL_UNSIGNED_BYTE,而不管当前绑定的渲染表面如何。请参阅glReadPixels。
GL_IMPLEMENTATION_COLOR_READ_TYPE       参数返回一个值,该实现选择的类型可以从当前绑定的帧缓冲区的颜色缓冲区中读取像素,并结合GL_IMPLEMENTATION_COLOR_READ_FORMAT。除了这种依赖于实现的格式/类型对之外,每个实现始终允许格式GL_RGBA和类型GL_UNSIGNED_BYTE,而不管当前绑定的渲染表面如何。请参阅glReadPixels。
GL_LINE_WIDTH                           参数返回一个值,即glLineWidth指定的行宽。初始值为1。
GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS     参数返回一个值,最大支持的纹理图像单元数,可用于从顶点着色器和片段处理器组合访问纹理贴图。如果顶点着色器和片段处理阶段都访问相同的纹理图像单元,则计数为使用两个纹理图像单元来抵抗此限制。该值必须至少为8.请参阅glActiveTexture。
GL_MAX_CUBE_MAP_TEXTURE_SIZE            参数返回一个值。该值粗略估计了GL可以处理的最大立方体贴图纹理。该值必须至少为16.请参阅glTexImage2D。
GL_MAX_FRAGMENT_UNIFORM_VECTORS         参数返回一个值,可以保存在片段着色器的统一变量存储中的四元素浮点数,整数或布尔矢量的最大数量。该值必须至少为16.请参阅glUniform。
GL_MAX_RENDERBUFFER_SIZE                参数返回一个值。该值表示GL可以处理的最大渲染缓冲区宽度和高度。该值必须至少为1.请参阅glRenderbufferStorage。
GL_MAX_TEXTURE_IMAGE_UNITS              参数返回一个值,这是支持的最大纹理图像单元,可用于从片段着色器访问纹理贴图。该值必须至少为8.请参阅glActiveTexture。
GL_MAX_TEXTURE_SIZE                     参数返回一个值。该值粗略估计了GL可以处理的最大纹理。该值必须至少为64.请参阅glTexImage2D。
GL_MAX_VARYING_VECTORS                  参数返回一个值,最大数量的四元素浮点向量可用于插入顶点和片段着色器使用的变量变量。声明为矩阵或数组的变量变量将使用多个插值器。该值必须至少为8。
GL_MAX_VERTEX_ATTRIBS                   参数返回一个值,即顶点着色器可访问的4分量通用顶点属性的最大数量。该值必须至少为8.请参阅glVertexAttrib。
GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS       参数返回一个值,最大支持的纹理图像单元,可用于从顶点着色器访问纹理贴图。值可能为0.请参阅glActiveTexture。
GL_MAX_VERTEX_UNIFORM_VECTORS           参数返回一个值,可以保存在顶点着色器的统一变量存储中的四元素浮点数,整数或布尔矢量的最大数量。该值必须至少为128.请参阅glUniform。
GL_MAX_VIEWPORT_DIMS                    参数返回两个值:视口的最大支持宽度和高度。这些必须至少与要渲染的显示器的可见尺寸一样大。请参阅glViewport。
GL_NUM_COMPRESSED_TEXTURE_FORMATS       参数返回一个整数值,表示可用的压缩纹理格式的数量。最小值为0.请参阅glCompressedTexImage2D。
GL_NUM_SHADER_BINARY_FORMATS            参数返回一个整数值,表示可用着色器二进制格式的数量。最小值为0.请参阅glShaderBinary。
GL_PACK_ALIGNMENT                       参数返回一个值,用于将像素数据写入内存的字节对齐。初始值为4.请参阅glReadPixels。
GL_POLYGON_OFFSET_FACTOR                参数返回一个值,缩放因子用于确定添加到多边形光栅化时生成的每个片段的深度值的变量偏移量。初始值为0.请参阅glPolygonOffset。
GL_POLYGON_OFFSET_FILL                  参数返回一个布尔值,指示在填充模式下是否为多边形启用了多边形偏移。初始值为GL_FALSE。请参阅glPolygonOffset。
GL_POLYGON_OFFSET_UNITS                 参数返回一个值。此值乘以特定于实现的值,然后添加到栅格化多边形时生成的每个片段的深度值。初始值为0.请参阅glPolygonOffset。
GL_RED_BITS                             参数返回一个值,即当前绑定的帧缓冲区的颜色缓冲区中的红色位平面的数量。
GL_RENDERBUFFER_BINDING                 参数返回单个值,即当前绑定的renderbuffer的名称。初始值为0,表示没有绑定渲染缓冲区。请参阅glBindRenderbuffer。
GL_SAMPLE_ALPHA_TO_COVERAGE             参数返回一个布尔值,指示片段覆盖值是否应与基于片段的alpha值的临时覆盖值进行AND运算。初始值为GL_FALSE。请参阅glSampleCoverage。
GL_SAMPLE_BUFFERS                       参数返回一个整数值,表示与当前绑定的帧缓冲区关联的样本缓冲区的数量。请参阅glSampleCoverage。
GL_SAMPLE_COVERAGE                      参数返回一个布尔值,指示片段覆盖值是否应与基于当前样本覆盖值的临时覆盖值进行AND运算。初始值为GL_FALSE。请参阅glSampleCoverage。
GL_SAMPLE_COVERAGE_INVERT               参数返回一个布尔值,指示是否应该反转临时覆盖值。请参阅glSampleCoverage。
GL_SAMPLE_COVERAGE_VALUE                参数返回单个正浮点值,表示当前样本覆盖值。请参阅glSampleCoverage。
GL_SAMPLES                              参数返回一个整数值,表示当前绑定的帧缓冲区的coverage掩码大小。请参阅glSampleCoverage。
GL_SCISSOR_BOX                          参数返回四个值:裁剪框的x和y窗口坐标,后跟宽度和高度。最初,x和y窗口坐标均为0,宽度和高度设置为窗口大小。见glScissor。
GL_SCISSOR_TEST                         参数返回一个布尔值,指示是否启用裁剪。初始值为GL_FALSE。见glScissor。
GL_SHADER_BINARY_FORMATS                参数返回长度为GL_NUM_SHADER_BINARY_FORMATS的符号常量列表,指示哪些着色器二进制格式可用。请参阅glShaderBinary。
GL_SHADER_COMPILER                      参数返回一个布尔值,指示是否支持着色器编译器。 GL_FALSE表示对glShaderSource,glCompileShader或glReleaseShaderCompiler的任何调用都将导致生成GL_INVALID_OPERATION错误。
GL_STENCIL_BACK_FAIL                    参数返回一个值,一个符号常量,指示当模板测试失败时对后向多边形采取的操作。初始值为GL_KEEP。请参阅glStencilOpSeparate。
GL_STENCIL_BACK_FUNC                    参数返回一个值,一个符号常量,指示用于后向多边形的函数,以将模板参考值与模板缓冲区值进行比较。初始值为GL_ALWAYS。请参阅glStencilFuncSeparate。
GL_STENCIL_BACK_PASS_DEPTH_FAIL         参数返回一个值,一个符号常量,表示当模板测试通过时对背面多边形采取的操作,但深度测试失败。初始值为GL_KEEP。请参阅glStencilOpSeparate。
GL_STENCIL_BACK_PASS_DEPTH_PASS         参数返回一个值,一个符号常量,表示当模板测试通过并且深度测试通过时,对于背面多边形采取的操作。初始值为GL_KEEP。请参阅glStencilOpSeparate。
GL_STENCIL_BACK_REF                     参数返回一个值,该值与背面多边形的模板缓冲区内容进行比较。初始值为0.请参阅glStencilFuncSeparate。
GL_STENCIL_BACK_VALUE_MASK              参数返回一个值,用于背面多边形的掩码在比较之前屏蔽模板参考值和模板缓冲区值。初始值全是1。请参阅glStencilFuncSeparate。
GL_STENCIL_BACK_WRITEMASK               参数返回一个值,该值控制用于背面多边形的模板位平面的写入。初始值全是1。请参阅glStencilMask。
GL_STENCIL_BITS                         参数返回一个值,即当前绑定的帧缓冲区的模板缓冲区中的位平面数。
GL_STENCIL_CLEAR_VALUE                  参数返回一个值,即模板位平面被清除的索引。初始值为0.请参阅glClearStencil。
GL_STENCIL_FAIL                         参数返回一个值,一个符号常量,表示当前面的多边形和非多边形的模板测试失败时采取的操作。初始值为GL_KEEP。请参阅glStencilOp和glStencilOpSeparate。
GL_STENCIL_FUNC                         参数返回一个值,一个符号常量,指示用于将模板参考值与前面多边形和非多边形的模板缓冲区值进行比较的函数。初始值为GL_ALWAYS。请参阅glStencilFunc和glStencilFuncSeparate。
GL_STENCIL_PASS_DEPTH_FAIL              参数返回一个值,一个符号常量,表示模板测试通过时采取的操作,但前向多边形和非多边形的深度测试失败。初始值为GL_KEEP。请参阅glStencilOp和glStencilOpSeparate。
GL_STENCIL_PASS_DEPTH_PASS              参数返回一个值,一个符号常量,表示模板测试通过时采取的操作,深度测试通过前面的多边形和非多边形。初始值为GL_KEEP。请参阅glStencilOp和glStencilOpSeparate。
GL_STENCIL_REF                          参数返回一个值,该值与前面的多边形和非多边形的模板缓冲区的内容进行比较。初始值为0.请参阅glStencilFunc和glStencilFuncSeparate。
GL_STENCIL_TEST                         参数返回一个布尔值,指示是否启用了片段的模板测试。初始值为GL_FALSE。请参阅glStencilFunc和glStencilOp。
GL_STENCIL_VALUE_MASK                   参数返回一个值,该掩码用于在比较前面的多边形和非多边形之前屏蔽模板参考值和模板缓冲区值。初始值全是1。请参阅glStencilFunc和glStencilFuncSeparate。
GL_STENCIL_WRITEMASK                    参数返回一个值,该控件用于控制前面的多边形和非多边形的模板位平面的写入。初始值全是1。请参阅glStencilMask和glStencilMaskSeparate。
GL_SUBPIXEL_BITS                        参数返回一个值,即用于在窗口坐标中定位栅格化几何的子像素分辨率的位数估计值。该值必须至少为4。
GL_TEXTURE_BINDING_2D                   参数返回单个值,即当前绑定到活动多纹理单元的目标GL_TEXTURE_2D的纹理的名称。初始值为0.请参阅glBindTexture。
GL_TEXTURE_BINDING_CUBE_MAP             参数返回单个值,当前绑定到活动多纹理单元的目标GL_TEXTURE_CUBE_MAP的纹理的名称。初始值为0.请参阅glBindTexture。
GL_UNPACK_ALIGNMENT                     参数返回一个值,用于从内存中读取像素数据的字节对齐。初始值为4.请参阅glPixelStorei。
GL_VIEWPORT                             参数返回四个值:视口的x和y窗口坐标,后跟其宽度和高度。最初,x和y窗口坐标都设置为0,宽度和高度设置为GL将进行渲染的窗口的宽度和高度。请参阅glViewport。

2、OPENGL 3D模型:

剪辑视图(clip) = 投影(projection) · 模型(model) · 观察(view) · 局部视图(locoal)

2.1、正交投影

正交投影则是具有矩形观察体的投影⽅式(透视投影则是视锥观察体),它不会根据物体离视点的远近缩放物体(透视投影则会)。正交投影可以分成侧投影和正交投影两种类型。

在这里插入图片描述

2.2、透视投影

投影变换完成的是如何将三维模型显示到二维视口上,这是一个三维到二维的过程。
你可以将投影变换看作是调整照相机的焦距,它模拟了为照相机选择镜头的过程。
投影变换是所有变换中最复杂的一个。

在这里插入图片描述

2.3、推导过程

OpenGL坐标变换

3、QT例程

3.1、新建MainWindow

#-------------------------------------------------
#
# Project created by QtCreator 2022-11-19T15:00:36
#
#-------------------------------------------------

QT       += core gui opengl

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = Test
TEMPLATE = app

# The following define makes your compiler emit warnings if you use
# any feature of Qt which has been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

CONFIG += c++11

SOURCES += \
        main.cpp \
        mainwindow.cpp \
    myOpenGL.cpp

HEADERS += \
        mainwindow.h \
    myOpenGL.h \
    myOpenGLenum.h \
    myOpenGLmodel.h

FORMS += \
        mainwindow.ui

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

RESOURCES += \
    resources.qrc

3.2、新建myOpenGL类

#ifndef MYOPENGL_H
#define MYOPENGL_H

#include <QTime>
#include <QTimer>
#include <QtMath>
#include <QWidget>
#include <QVector>
#include <QVector3D>
#include <QMatrix4x4>
#include <QKeyEvent>
#include <QOpenGLWidget>
#include <QOpenGLFunctions_3_3_Core>
#include <QOpenGLShaderProgram>
#include <QOpenGLTexture>

enum Shape{
    None,
    Rect,
    Circle,
    Triangle
};

class myOpenGL : public QOpenGLWidget,QOpenGLFunctions_3_3_Core
{
    Q_OBJECT
public:
    explicit myOpenGL(QWidget *parent = nullptr);
    virtual ~myOpenGL();

public:
    QMatrix4x4 myModel;
    QMatrix4x4 myView;
    QMatrix4x4 myProjection;

    Shape myShape = Rect;

    bool Scan = true;

    unsigned int VBO = 0;
    unsigned int VAO = 0;
    unsigned int EBO = 0;
    /* vertices表示顶点元素
     * indices表示元素索引
     * 共同描述了一组8*6*6的三维立体图像的信息*/
    unsigned int indices[6*6] = {
         0,  1,  2,  2,  3,  0,//第一个面
         4,  5,  6,  6,  7,  4,//第二个面
         8,  9, 10, 10,  4,  8,//第三个面
        11,  2, 12, 12, 13, 11,//第四个面
        10, 14,  5,  5,  4, 10,//第五个面
         3,  2, 11, 11, 15,  3 //第六个面
    };
    float vertices[8*16] = {
        //坐标 3              颜色RGB             纹理坐标
        -0.3f, -0.3f, -0.3f,  1.0f, 1.0f, 1.0f,  0.0f, 0.0f,//0
         0.3f, -0.3f, -0.3f,  0.0f, 1.0f, 1.0f,  1.0f, 0.0f,//1
         0.3f,  0.3f, -0.3f,  0.0f, 0.0f, 1.0f,  1.0f, 1.0f,//2
        -0.3f,  0.3f, -0.3f,  0.0f, 0.0f, 0.0f,  0.0f, 1.0f,//3
        -0.3f, -0.3f,  0.3f,  1.0f, 1.0f, 1.0f,  0.0f, 0.0f,//4
         0.3f, -0.3f,  0.3f,  1.0f, 1.0f, 1.0f,  1.0f, 0.0f,//5
         0.3f,  0.3f,  0.3f,  1.0f, 0.0f, 1.0f,  1.0f, 1.0f,//6
        -0.3f,  0.3f,  0.3f,  0.0f, 0.0f, 0.0f,  0.0f, 1.0f,//7
        -0.3f,  0.3f,  0.3f,  0.0f, 1.0f, 1.0f,  1.0f, 0.0f,//8
        -0.3f,  0.3f, -0.3f,  0.0f, 1.0f, 1.0f,  1.0f, 1.0f,//9
        -0.3f, -0.3f, -0.3f,  1.0f, 0.0f, 1.0f,  0.0f, 1.0f,//10
         0.3f,  0.3f,  0.3f,  1.0f, 0.0f, 0.0f,  1.0f, 0.0f,//11
         0.3f, -0.3f, -0.3f,  1.0f, 1.0f, 1.0f,  0.0f, 1.0f,//12
         0.3f, -0.3f,  0.3f,  0.0f, 1.0f, 1.0f,  0.0f, 0.0f,//13
         0.3f, -0.3f, -0.3f,  0.0f, 0.0f, 1.0f,  1.0f, 1.0f,//14
        -0.3f,  0.3f,  0.3f,  0.0f, 0.0f, 0.0f,  0.0f, 0.0f //15
    };
    QVector<QVector3D>cubePosition = {
        QVector3D( 0.0f, 0.0f, 0.0f),
        QVector3D( 0.7f, 1.7f, -5.0f),
        QVector3D(-0.5f, -0.7f, -0.8f),
        QVector3D(-1.3f, -1.7f, -4.1f),
        QVector3D( 0.8f, -0.1f, -1.2f),
        QVector3D(-0.6f, 1.0f, -2.5f)
    };
    double theat  = 0;
    float borderColor[4] = {1.0f, 1.0f, 0.0f, 1.0f};
    float rValue = 1.0f;
    float gValue = 1.0f;
    float bValue = 1.0f;
    float TextureRatio = 0.5f;
    float verticalAngle = 0.0f;
    float aspectRatio = 0.0f;
    float nearPlane =  0.0f;
    float farPlane = 0.0f;
    float modelAngle = 0.0f;
    float modelX = 0.0f;
    float modelY = 0.0f;
    float modelZ = 0.0f;
    float viewXAngle = 0.0f;
    float viewYAngle = 0.0f;
    float viewZAngle = 0.0f;
    float viewX = 0.0f;
    float viewY = 0.0f;
    float viewZ = -3.0f;

protected:
    //重载三个函数
    virtual void initializeGL();
    virtual void resizeGL(int w, int h);
    virtual void paintGL();
    //按键事件
    virtual void keyPressEvent(QKeyEvent *event);

public slots:
    void ShaderUniform();

private: 
    const GLsizei floatsize = sizeof (float);
    const GLsizei uintsize = sizeof (unsigned int);
    QOpenGLShaderProgram ShaderProgram;
    QOpenGLTexture *TextureWall;
    QOpenGLTexture *TextureSmaile;
    QOpenGLTexture *TextureSmall;

private slots:


};
#endif // MYOPENGL_H

3.3、添加资源文件

":/Images/awesomeface.png"

在这里插入图片描述

":/Images/wall.jpg"

在这里插入图片描述

/* ":/Shaders/ShaderSource.vert" */
#version 330 core

in vec3 aPos;
in vec3 aColer;
in vec2 aTexCord;

uniform mat4 myProjection;
uniform mat4 myModel;
uniform mat4 myView;

out vec3 vertexColor;
out vec2 vertexTexCord;

void main()
{
    gl_Position = myProjection * myView * myModel * vec4(aPos.x, aPos.y, aPos.z, 1.0f);
    vertexTexCord = vec2(1- aTexCord.s, aTexCord.t);
    vertexColor = aColer;
}


/* ":/Shaders/ShaderSource.frag" */

in vec3 vertexColor;
in vec2 vertexTexCord;

uniform vec3 myColor;
uniform float TextureRatio;

uniform sampler2D TextureWall;
uniform sampler2D TextureSmaile;
uniform sampler2D TextureSmall;
out vec4 FragColor;

void main()
{
    vec4 FragWall = texture(TextureWall, vertexTexCord);
    vec4 FragSmaile = texture(TextureSmaile, vertexTexCord);
    vec4 FragSmall = texture(TextureSmall, vertexTexCord);
    vec4 TextureDate = mix(FragWall, FragSmaile, TextureRatio);
    vec4 vertexColorDate = vec4(vertexColor, 1.0f);
    vec4 myColorDate = vec4(myColor, 1.0f);
    vec4 ColorDate = mix(vertexColorDate, myColorDate, 0.5);
    FragColor = mix(TextureDate, ColorDate, 0.5);
}

3.4、添加myOpenGL源文件

#include "myOpenGL.h"

myOpenGL::myOpenGL(QWidget *parent) : QOpenGLWidget(parent)
{

    /*此属性保持小部件接受键盘焦点的方式
     * Qt::TabFocus,小部件通过Tab键接受键盘焦点,
     * Qt::ClickFocus,小部件通过单击接受焦点,
     * Qt::StrongFocus,两者都接受
     * Qt::NoFocus(默认值),如果根本不接受焦点。
     * 如果小部件处理键盘事件,则必须为其启用键盘焦点。
     * 这通常是通过小部件的构造函数完成的。
     * 例如,QLineEdit构造函数调用setFocusPolicy(Qt::StrongFocus)。
     * 如果小部件具有焦点代理,则焦点策略将传播到它。*/
    QWidget::setFocusPolicy(Qt::StrongFocus);

}
myOpenGL::~myOpenGL()
{
    Scan = false;//停止扫描
    QOpenGLWidget::makeCurrent();
    /* 删除顺序:VAO➡VBO➡EBO
     * void QOpenGLFunctions_3_3_Core::glDeleteVertexArrays
     * (GLsizei n, const GLuint *arrays)*/
    QOpenGLFunctions_3_3_Core::glDeleteVertexArrays(1, &VAO);
    /* void QOpenGLFunctions_3_3_Core::glDeleteBuffers
     * (GLsizei n, const GLuint *buffers)*/
    QOpenGLFunctions_3_3_Core::glDeleteBuffers(1, &VBO);
    QOpenGLFunctions_3_3_Core::glDeleteBuffers(1, &EBO);
    QOpenGLWidget::doneCurrent();
}
void myOpenGL::initializeGL()
{
    /* 初始化,创建顺序:VAO➡VBO➡EBO
     * bool QOpenGLFunctions_3_3_Core::initializeOpenGLFunctions() */
    QOpenGLFunctions_3_3_Core::initializeOpenGLFunctions();
    /* VAO(顶点数组对象):创建、绑定、写入数据,告诉OpenGL该如何解析这些数据
     * void QOpenGLFunctions_3_3_Core::glGenVertexArrays
     * (GLsizei n, GLuint *arrays)*/
    QOpenGLFunctions_3_3_Core::glGenVertexArrays(1, &VAO);
    /* void QOpenGLFunctions_3_3_Core::glBindVertexArray
     * (GLuint array)*/
    QOpenGLFunctions_3_3_Core::glBindVertexArray(VAO);
    /* VBO(顶点缓冲对象):创建、绑定、写入数据,将数据储存进显存区域中
     * void QOpenGLFunctions_3_3_Core::glGenBuffers
     * (GLsizei n, GLuint *buffers)*/
    QOpenGLFunctions_3_3_Core::glGenBuffers(1, &VBO);
    /* void QOpenGLFunctions_3_3_Core::glBindBuffer
     * (GLenum target, GLuint buffer)
     * GL_ARRAY_BUFFER顶点数组缓冲区*/
    QOpenGLFunctions_3_3_Core::glBindBuffer(GL_ARRAY_BUFFER, VBO);
    /* QOpenGLFunctions_3_3_Core::glBufferData
     * (GLenum target, GLsizeiptr size, const GLvoid *data, GLenum usage)*/
    QOpenGLFunctions_3_3_Core::glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
    /*EBO(索引缓冲对象):创建、绑定、写入数据,将数据储存进显存区域中*/
    QOpenGLFunctions_3_3_Core::glGenBuffers(1, &EBO);
    /*GL_ELEMENT_ARRAY_BUFFER索引数组缓冲区*/
    QOpenGLFunctions_3_3_Core::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
    QOpenGLFunctions_3_3_Core::glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
    /* 将属性名称绑定到指定位置。
     * 可以在链接程序之前或之后调用此函数。
     * 链接程序时未明确绑定的任何属性都将自动分配位置。
     * 当程序链接后调用此函数时,需要重新链接程序才能使更改生效。
     * 启用了顶点着色器,访问Location=0,输入值aPos*/
    ShaderProgram.bindAttributeLocation("aPos",0);
    /* void QOpenGLFunctions_3_3_Core::glVertexAttribPointer
     * (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid *pointer)
     * dynamic_cast<类型>(要转换的对象):用于转换基类和派生类。
     * const_cast<类型>(要转换的对象) :用于const和volatile的转换。
     * reinterpret_cast<类型>(要转换的对象):用于两个对象之间没有任何关系时进行转换。
     * static_cast<类型>(要转换的对象):这个是一般转换,把派生类的指针或引用转换成基类是安全的 */
    QOpenGLFunctions_3_3_Core::glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8 * floatsize, reinterpret_cast <GLvoid*>(0 * floatsize));
    /* void QOpenGLFunctions_3_3_Core::glEnableVertexAttribArray
     * (GLuint index)*/
    QOpenGLFunctions_3_3_Core::glEnableVertexAttribArray(0);
    //启用了顶点着色器,访问Location=1,输入值aColer
    ShaderProgram.bindAttributeLocation("aColer",1);
    QOpenGLFunctions_3_3_Core::glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 8 * floatsize, reinterpret_cast <GLvoid*>(3 * floatsize));
    QOpenGLFunctions_3_3_Core::glEnableVertexAttribArray(1);
    //启用了顶点着色器,访问Location=2,输入值aTexCord
    ShaderProgram.bindAttributeLocation("aTexCord",2);
    QOpenGLFunctions_3_3_Core::glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 8 * floatsize, reinterpret_cast <GLvoid*>(6 * floatsize));
    QOpenGLFunctions_3_3_Core::glEnableVertexAttribArray(2);
    /* 将fileName的内容编译为指定类型的着色器,
     * 并将其添加到此着色器程序中。
     * 如果编译成功,则返回true,否则返回false。
     * 编译错误和警告将通过log()提供。
     * 此函数旨在成为快速将顶点和片段着色器添加到着色器程序的捷径,
     * 而无需先创建QOpenGLShader的实例。*/
    ShaderProgram.addShaderFromSourceFile(QOpenGLShader::Vertex, ":/Shaders/ShaderSource.vert");
    ShaderProgram.addShaderFromSourceFile(QOpenGLShader::Fragment, ":/Shaders/ShaderSource.frag");
    ShaderProgram.link();
    /* 函数启用或禁用 OpenGL 功能
     * void QOpenGLFunctions_3_3_Core::glEnable
     * (GLenum cap)
     * cap:参考myOpenGLenum*/
    QOpenGLFunctions_3_3_Core::glEnable(GL_BLEND);
    /* 函数指定像素算术
     * void QOpenGLFunctions_3_3_Core::glBlendFunc
     * (GLenum sfactor, GLenum dfactor)
     * sfactor\dfactor:参考myOpenGLenum*/
    QOpenGLFunctions_3_3_Core::glBlendFunc(GL_BLEND_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
    /* 创建QOpenGLTexture对象,
     * 该对象稍后可以绑定到2D纹理目标,并包含图像中包含的像素数据。
     * 如果希望生成一系列mipmap,请将genMipMaps设置为true(这是默认值)。
     * 这将创建底层OpenGL纹理对象。
     * 因此,使用此构造函数的构造确实需要有效的当前OpenGL上下文。*/
    TextureWall = new QOpenGLTexture(QImage(":/Images/wall.jpg").mirrored());
    TextureSmaile = new QOpenGLTexture(QImage(":/Images/awesomeface.png").mirrored());
    TextureSmall = new QOpenGLTexture(QImage(":/Images/small.jpg").mirrored());
    /* 将此着色器程序绑定到活动的QOpenGLContext,
     * 并使其成为当前着色器程序。
     * 将释放任何先前绑定的着色器程序。
     * 这相当于对programId()调用glUseProgram()。
     * 如果程序绑定成功,则返回true;
     * 否则为false。
     * 如果着色器程序尚未链接,或者需要重新链接,
     * 则此函数将调用link()。*/
    ShaderProgram.bind();
    /* 将当前上下文中位置处的统一变量设置为值。*/
    ShaderProgram.setUniformValue("TextureWall",0);
    ShaderProgram.setUniformValue("TextureSmaile",1);
    ShaderProgram.setUniformValue("TextureSmall",2);
    /* 将此纹理绑定到当前活动的纹理单元,以便渲染。
     * 请注意,您不需要绑定QOpenGLTexture对象来修改它们,
     * 因为实现在可用的地方使用EXT_direct_state_access扩展,
     * 并在不可用的地方模拟它。*/
    TextureWall->bind(0);
    TextureSmaile->bind(1);
    TextureSmall->bind(2);
    /* 从mipmap级别0生成此纹理对象的mipmap。
     * 如果使用需要mipmap的纹理目标和过滤选项,
     * 并且禁用了自动mipmap生成,
     * 则需要调用此函数或重载来创建mipmap链。*/
    TextureWall->generateMipMaps();
    TextureSmaile->generateMipMaps();
    TextureSmall->generateMipMaps();
    /* 填充背景颜色
     * void QOpenGLFunctions_3_3_Core::glTexParameterfv
     * (GLenum target, GLenum pname, const GLfloat *params)
     * 目标:目标纹理,必须是GL_TEXTURE_1D或GL_TEXTURE_2D。
     * pname:单个值纹理参数的符号名称。
     * pname 中接受以下符号:
     * GL_TEXTURE_MIN_FILTER每当纹理化像素映射到大于一个纹理元素的区域时,将使用纹理缩小函数
     * GL_TEXTURE_MAG_FILTER纹理放大函数用于纹理化像素映射到小于或等于一个纹理元素的区域
     * GL_TEXTURE_WRAP_S将纹理坐标的换行参数设置为GL_CLAMP或GL_REPEAT
     * GL_TEXTURE_WRAP_T将纹理坐标 t 的 wrap 参数设置为GL_CLAMP或GL_REPEAT
     * GL_TEXTURE_BORDER_COLOR设置边框颜色。 参数包含四个值,这些值构成纹理边框的 RGBA 颜色
     * GL_TEXTURE_PRIORITY指定当前绑定纹理的纹理居住优先级
     * params:指向存储 pname 值或值的数组的指针
     * 参数提供一个函数,用于将纹理缩小为以下项之一:
     * GL_NEAREST返回曼哈顿距离中距离最接近 (的纹理元素的值,) 到所纹理像素的中心
     * GL_LINEAR返回与所纹理像素中心最接近的四个纹理元素的加权平均值。
     * GL_NEAREST_MIPMAP_NEAREST选择最接近纹理像素大小的 mipmap,并使用GL_NEAREST条件 (距离像素中心最近的纹理元素) 生成纹理值。
     * GL_LINEAR_MIPMAP_NEAREST选择与所纹理像素大小最接近的 mipmap,并使用GL_LINEAR条件 (最接近像素中心) 的四个纹理元素的加权平均值来生成纹理值。
     * GL_NEAREST_MIPMAP_LINEAR选择与纹理像素大小最接近的两个 mipmap,并使用GL_NEAREST条件 (最接近像素中心) 的纹理元素,从每个 mipmap 生成纹理值。
     * GL_LINEAR_MIPMAP_LINEAR选择与纹理像素大小最接近的两个 mipmap,并使用GL_LINEAR条件 (最接近像素中心) 的四个纹理元素的加权平均值,以从每个 mipmap 生成纹理值。*/
    QOpenGLFunctions_3_3_Core::glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, borderColor);
    /* 设置纹理参数
     * void QOpenGLFunctions_3_3_Core::glTexParameteri
     * (GLenum target, GLenum pname, GLint param)
     * 目标:目标纹理,必须是GL_TEXTURE_1D或GL_TEXTURE_2D。
     * pname:单个值纹理参数的符号名称。
     * pname 中接受以下符号:
     * GL_TEXTURE_MIN_FILTER每当纹理绘制的像素映射到大于一个纹理元素的区域时,将使用纹理缩小函数。
     * GL_TEXTURE_MAG_FILTER当纹理像素映射到小于或等于一个纹理元素的区域时,将使用纹理放大函数。
     * GL_TEXTURE_WRAP_S将纹理坐标s的包装参数设置为GL_CLAMP或GL_REPEAT。
     * GL_TEXTURE_WRAP_T将纹理坐标t的包装参数设置为GL_CLAMP或GL_REPEAT。
     * param:pname 的值
     * GL_REPEAT: 超出纹理范围的坐标整数部分被忽略,形成重复效果。
     * GL_MIRRORED_REPEAT: 超出纹理范围的坐标整数部分被忽略,但当整数部分为奇数时进行取反,形成镜像效果。
     * GL_CLAMP_TO_EDGE:超出纹理范围的坐标被截取成0和1,形成纹理边缘延伸的效果。
     * GL_CLAMP_TO_BORDER: 超出纹理范围的部分被设置为边缘色。*/
    QOpenGLFunctions_3_3_Core::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
    QOpenGLFunctions_3_3_Core::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    QOpenGLFunctions_3_3_Core::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
    QOpenGLFunctions_3_3_Core::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
    /* 函数选择多边形光栅化模式
     * void QOpenGLFunctions_3_3_Core::glPolygonMode
     * (GLenum face, GLenum mode)
     * face:模式适用的多边形。 必须为正面多边形GL_FRONT、面向背面多边形的GL_BACK,或GL_FRONT_AND_BACK正面多边形和后向多边形。
     * mode:多边形的光栅化方式。
     * 定义了以下模式,默认值为GL_FILL:
     * GL_POINT标记为边界边缘起点的多边形顶点绘制为点。
     * GL_LINE多边形的边界边缘绘制为线段。
     * GL_FILL多边形的内部已填充。*/
    // QOpenGLFunctions_3_3_Core::glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
}
void myOpenGL::resizeGL(int w, int h)
{
    /* 函数设置视区
     * void QOpenGLFunctions_3_3_Core:glViewport
     * (GLint x, GLint y, GLsizei width, GLsizei height)
     * x视区矩形的左下角,以像素为单位。 默认值为 (0,0)。
     * y视区矩形的左下角,以像素为单位。 默认值为 (0,0)。
     * width视区宽度。 首次附加到窗口的 OpenGL 上下文时, 宽度 和 高度 将设置为该窗口的尺寸。
     * height视区的高度。 首次附加到窗口的 OpenGL 上下文时, 宽度 和 高度 将设置为该窗口的尺寸。*/
    glViewport(0, 0 ,w, h);
}
void myOpenGL::paintGL()
{
    /* 函数指定颜色缓冲区的清除值
     * void QOpenGLFunctions_3_3_Core::glClearColor
     * (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)
     * 红色:glClear 用于清除颜色缓冲区的红色值。 默认值为零。
     * 绿色:glClear 用于清除颜色缓冲区的绿色值。 默认值为零。
     * 蓝色:glClear 用于清除颜色缓冲区的蓝色值。 默认值为零。
     * 透明:gClear 用于清除颜色缓冲区的 alpha 值。 默认值为零。*/
    QOpenGLFunctions_3_3_Core::glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
    /*启用了片段的深度测试*/
    QOpenGLFunctions_3_3_Core::glEnable(GL_DEPTH_TEST);
    /* void QOpenGLFunctions_3_3_Core::glClear
     * (GLbitfield mask)
     * GL_COLOR_BUFFER_BIT当前为颜色写入启用的缓冲区。
     * GL_DEPTH_BUFFER_BIT深度缓冲区。
     * GL_ACCUM_BUFFER_BIT累积缓冲区。
     * GL_STENCIL_BUFFER_BIT模具缓冲区。*/
    QOpenGLFunctions_3_3_Core::glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    switch (myShape) {
    case Rect:
        /*绑定着色器*/
        ShaderProgram.bind();
        /*绑定纹理*/
        TextureWall->bind(0);
        TextureSmaile->bind(1);
        TextureSmall->bind(2);
        /*传递背景颜色*/
        ShaderProgram.setUniformValue("myColor", rValue, gValue, bValue);
        /*传递透明度*/
        ShaderProgram.setUniformValue("TextureRatio", TextureRatio);
        /*传递投影*/
        ShaderProgram.setUniformValue("myProjection", myProjection);
        /*传递观察*/
        ShaderProgram.setUniformValue("myView", myView);
        /*绑定VAO(顶点数组对象)*/
        QOpenGLFunctions_3_3_Core::glBindVertexArray(VAO);
        /* 索引绘图
         * void QOpenGLFunctions_3_3_Core::glDrawElements
         * (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices)*/
        foreach (auto item, cubePosition){
            /* 初始化矩阵为单位矩阵。
             * void QMatrix4x4::setToIdentity()*/
            myModel.setToIdentity();
            /* 将此矩阵乘以另一个矩阵,该矩阵通过分量QVector3D转换坐标。
            * void QMatrix4x4::translate
            * (const QVector3D &vector)*/
            myModel.translate(item);
            /* 将此矩阵乘以另一个矩阵,该矩阵将坐标围绕向量旋转角度。
             * 第一个参数度数, 剩下三个参数为选择旋转轴
             * void QMatrix4x4::rotate
             * (float angle, float x, float y, float z = 0.0f)*/
            modelAngle = static_cast <float>(theat);
            modelX = 1.0f;
            modelY = 5.0f;
            modelZ = 0.5f;
            myModel.rotate(modelAngle, modelX, modelY, modelZ);
            /*传递模型*/
            ShaderProgram.setUniformValue("myModel", myModel);
            QOpenGLFunctions_3_3_Core::glDrawElements(GL_TRIANGLES, 36 * uintsize, GL_UNSIGNED_INT, reinterpret_cast <GLvoid*>(0 * uintsize));
        }
        /* 数组绘图
         * void QOpenGLFunctions_3_3_Core::glDrawArrays
         * (GLenum mode, GLint first, GLsizei count)*/
        //QOpenGLFunctions_3_3_Core::glDrawArrays(GL_TRIANGLES, 0, 36);
        break;
    case Circle:
        break;
    case Triangle:
        break;
    case None:
        break;
    }
}
void myOpenGL::ShaderUniform()
{
    /* 通过使相应的上下文成为当前上下文并在该上下文中绑定帧缓冲区对象,
     * 为渲染此小部件的OpenGL内容做好准备。
     * 在大多数情况下,不必调用此函数,因为在调用paintGL()之前会自动调用此函数。*/
    QOpenGLWidget::makeCurrent();
    /* 获取当前时间
     * 0到59 */
    theat += 3;
    if(theat > 360){theat = 0; }
    float sintheat = static_cast <float>(sin(theat));
    float costheat = static_cast <float>(cos(theat));
    rValue = 0.5f * sintheat;
    gValue = 1.0f * sintheat * costheat;
    bValue = 0.5f * costheat;
    /* 初始化矩阵为单位矩阵。
     * void QMatrix4x4::setToIdentity()*/
    myView.setToIdentity();
    myProjection.setToIdentity();
    /*此属性保存小部件的宽度/高度,不包括任何窗口框架
     * width()
     * height()*/
    float myWidth = static_cast <float>(width());
    float myHeight = static_cast <float>(height());
    /* 将此矩阵乘以另一个应用透视投影的矩阵。
     * 垂直视野将是窗口内的垂直角度度,
     * 具有确定水平视野的给定纵横比。
     * 投影将具有指定的“近平面”和“远平面”剪裁平面,
     * 这是从观察者到相应平面的距离。
     * void QMatrix4x4::perspective
     * (float verticalAngle, float aspectRatio, float nearPlane, float farPlane)*/
    verticalAngle = 45.f;
    aspectRatio = static_cast <float>(myWidth / myHeight);
    nearPlane =  0.1f;
    farPlane = 100.f;
    myProjection.perspective(verticalAngle, aspectRatio, nearPlane, farPlane);
    /* 将此矩阵乘以另一个矩阵,该矩阵通过分量x、y和z转换坐标。
     * void QMatrix4x4::translate
     * (float x, float y, float z)*/
    myView.translate(viewX, viewY, viewZ);
    /* 将此矩阵乘以另一个矩阵,该矩阵将坐标围绕向量旋转角度。
     * 第一个参数度数, 剩下三个参数为选择旋转轴
     * void QMatrix4x4::rotate
     * (float angle, float x, float y, float z = 0.0f)*/
    myView.rotate(viewXAngle, 1.0f, 0.0f, 0.0f);
    myView.rotate(viewYAngle, 0.0f, 1.0f, 0.0f);
    myView.rotate(viewZAngle, 0.0f, 0.0f, 1.0f);
    /*更新小部件,除非禁用更新或隐藏小部件。*/
    this->update();
    /* 释放上下文。
     * 在大多数情况下,不必调用此函数,
     * 因为小部件将确保在调用paintGL()时正确绑定和释放上下文。*/
    QOpenGLWidget::doneCurrent();
    if(Scan){
        QTimer::singleShot(100, this, &myOpenGL::ShaderUniform);
    }
}
void myOpenGL::keyPressEvent(QKeyEvent *event)
{
    QOpenGLWidget::makeCurrent();
    switch(event->key()){
    case Qt::Key_Up:
        TextureRatio += 0.1f;
        break;
    case Qt::Key_Down:
        TextureRatio -= 0.1f;
        break;
    case Qt::Key_Q:
        viewZ -= 0.1f;
        break;
    case Qt::Key_E:
        viewZ += 0.1f;
        break;
    case Qt::Key_A:
        viewX -= 0.1f;
        break;
    case Qt::Key_D:
        viewX += 0.1f;
        break;
    case Qt::Key_S:
        viewY -= 0.1f;
        break;
    case Qt::Key_W:
        viewY += 0.1f;
        break;
    case Qt::Key_T:
        viewXAngle += 1.0f;
        break;
    case Qt::Key_G:
        viewXAngle -= 1.0f;
        break;
    case Qt::Key_F:
        viewYAngle += 1.0f;
        break;
    case Qt::Key_H:
        viewYAngle -= 1.0f;
        break;
    case Qt::Key_R:
        viewZAngle += 1.0f;
        break;
    case Qt::Key_Y:
        viewZAngle -= 1.0f;
        break;
    default:
        break;
    }
    if(TextureRatio > 1){ TextureRatio = 1.0f; }
    if(TextureRatio < 0){ TextureRatio = 0.0f; }
    if(viewXAngle > 360){viewXAngle = 0.0f;}
    if(viewYAngle > 360){viewYAngle = 0.0f;}
    if(viewZAngle > 360){viewZAngle = 0.0f;}
    update();
    QOpenGLWidget::doneCurrent();
}

3.4、提升窗口启动mian

在这里插入图片描述

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    ui->myOpenGLWidget->ShaderUniform();
}

MainWindow::~MainWindow()
{
    delete ui;
}

3.5、效果图

在这里插入图片描述

3.6、按键功能

Qt::Key_Up: 透明度++   
Qt::Key_Down: 透明度--
Qt::Key_Q:拉远
Qt::Key_E:拉近
Qt::Key_A:左移
Qt::Key_D:右移
Qt::Key_S:下移
Qt::Key_W:上移
Qt::Key_T:向上翻滚
Qt::Key_G:向下翻滚
Qt::Key_F:向左偏航
Qt::Key_H:向右偏航
Qt::Key_R:逆时针旋转
Qt::Key_Y:顺时针旋转
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值