3
社区成员
发帖
与我相关
我的任务
分享| 所属方面 | 方法作用 | 调用示例 | 参数及参数作用 | 使用场景 |
| 3D纹理操作 | 从帧缓冲复制到3D纹理 | glCopyTexSubImage3D(GL_TEXTURE_3D,0,0,0,5,0,0,256,256) | - `zoffset`:3D纹理深度方向偏移其他参数同glCopyTexSubImage2D | 将帧缓冲2D渲染结果直接复制到3D纹理指定深度层,实现3D纹理的动态生成 |
| 3D纹理操作 | 为3D纹理生成mipmap | glGenerateMipmap(GL_TEXTURE_3D) | - `target`:固定为GL_TEXTURE_3D | 为3D体素纹理自动生成各级mipmap,提升远距离体素采样的性能和质量 |
| HDR渲染 | 执行色调映射后处理 | glBindFramebuffer(GL_FRAMEBUFFER,tonemapFbo);glBindTextureUnit(0,hdrTexID);glDrawArrays(GL_TRIANGLES,0,36) | 通过全屏着色器将HDR浮点帧缓冲映射为LDR sRGB帧缓冲,实现画面亮度适配 | HDR/PBR渲染最终输出时,将高动态范围画面转换为显示器可显示的LDR画面 |
| HDR渲染 | 启用浮点纹理过滤 | glEnable(GL_TEXTURE_FLOAT_FILTER);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR) | 启用GPU浮点纹理的线性过滤,支持HDR纹理的高精度多级采样 | HDR环境映射、光追结果采样时,保证浮点纹理的采样精度,避免亮度失真 |
| OpenGL上下文 | 查询支持的扩展 | const GLubyte* extensions = glGetString(GL_EXTENSIONS) | 返回当前上下文支持的所有OpenGL扩展字符串 | 程序初始化时检查扩展支持情况,启用对应的高级功能,提升兼容性 |
| OpenGL上下文 | 查询上下文版本 | const GLubyte* version = glGetString(GL_VERSION) | 返回当前OpenGL上下文的版本字符串(如"4.6.0 NVIDIA 551.23") | 程序启动时查询OpenGL版本,实现版本兼容逻辑,适配不同显卡驱动 |
| OpenGL上下文 | 销毁OpenGL上下文 | glfwDestroyWindow(window);glfwTerminate() | 配合GLFW销毁窗口与OpenGL上下文,释放所有GPU/CPU相关资源 | 程序退出时,完整销毁OpenGL上下文,避免内存泄漏、资源占用 |
| OpenGL上下文 | 创建共享上下文 | GLFWwindow* shareCtx = glfwCreateWindow(w,h,"",NULL,mainCtx) | 基于主上下文创建共享上下文,共享纹理/缓冲等GPU资源 | 多线程渲染中,创建共享上下文,实现多线程共享GPU资源,提升渲染并行性 |
| OpenGL上下文 | 设置上下文配置文件 | glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); glfwWindowHint(GLFW_OPENGL_VERSION_MAJOR, 4) | - 配合GLFW设置上下文为核心Profile,指定OpenGL主版本(如4.x) | 程序初始化时配置上下文,确保使用核心管线功能,避免兼容旧版特性 |
| OpenGL上下文 | 设置上下文像素格式 | glfwWindowHint(GLFW_SAMPLES,4);glfwWindowHint(GLFW_DEPTH_BITS,24) | 配合GLFW设置上下文的采样数、深度位宽,初始化时配置帧缓冲格式 | 程序启动时,根据需求配置上下文像素格式,支持MSAA、高深度位宽 |
| OpenGL上下文 | 设置上下文刷新频率 | glSwapInterval(1) | - `interval`:0=无垂直同步,1=垂直同步,n=每n帧刷新一次 | 设置垂直同步,避免画面撕裂,平衡渲染流畅度与帧率 |
| PBR纹理操作 | 创建浮点格式纹理 | glTextureStorage2D(brdfTexID,1,GL_RG16F,512,512) | 创建RG16F浮点纹理,用于存储PBR的BRDF查找表 | PBR渲染中,创建浮点格式的BRDF LUT/环境光照纹理,保证光照计算精度 |
| PBR渲染 | 创建预过滤环境贴图 | for(int i=0;i<6;i++) glTextureSubImage2D(cubePrefilterID, 0, 0, 0, 1024, 1024, GL_RGBA, GL_FLOAT, data[i]) | 按不同粗糙度级别生成预过滤环境贴图,存储多级别模糊后的环境信息 | PBR间接镜面反射计算,根据材质粗糙度采样对应级别的预过滤贴图 |
| PBR渲染 | HDR纹理多级卷积 | for(int i=1;i<mipLevels;i++){glBindTexture(GL_TEXTURE_CUBE_MAP,cubeHdrID);glGenerateMipmap(GL_TEXTURE_CUBE_MAP);} | 为HDR立方体贴图生成多级mipmap,逐层级卷积实现粗糙度渐变 | PBR镜面反射中,按材质粗糙度采样对应mip层级的HDR环境图,实现精准镜面光照 |
| PBR渲染 | 生成BRDF查找表(LUT) | glBindFramebuffer(GL_FRAMEBUFFER, brdfFbo); glDrawArrays(GL_TRIANGLES,0,36) | 通过全屏着色器渲染,生成PBR必备的BRDF LUT纹理,适配镜面反射计算 | PBR材质渲染中,采样BRDF LUT快速获取双向反射分布数据,提升光照精度 |
| PBR渲染 | 生成辐照度贴图(卷积) | glBindFramebuffer(GL_FRAMEBUFFER, irradianceFbo); glDrawArrays(GL_TRIANGLES, 0, 36) | 通过帧缓冲绑定+着色器卷积计算,将HDR环境图转为辐照度贴图 | PBR间接漫反射计算,使用辐照度贴图快速获取环境漫反射光照信息 |
| PBR渲染 | 设置纹理各向异性过滤级别(PBR优化) | glSamplerParameterf(pbrSampler, GL_TEXTURE_MAX_ANISOTROPY, 16.0f) | 高等级各向异性过滤,提升PBR材质纹理(如金属度/粗糙度贴图)的采样质量 | PBR渲染中,优化材质纹理的倾斜采样效果,保证不同视角下的材质表现一致 |
| PBR渲染 | 设置金属度/粗糙度贴图采样模式 | glSamplerParameteri(pbrSampler,GL_TEXTURE_MIN_FILTER,GL_LINEAR);glSamplerParameteri(pbrSampler,GL_TEXTURE_WRAP_S,GL_CLAMP_TO_EDGE) | 为PBR专用采样器设置过滤/环绕规则,适配金属度/粗糙度贴图的灰度特性 | 避免PBR材质贴图采样时的边缘失真、纹理闪烁,保证材质表现一致性 |
| PBR渲染 | 创建HDR环境贴图(立方体贴图) | glTextureStorage2D(cubeHdrID, 6, GL_RGBA16F, 2048, 2048) | - `levels`:mipmap层级数- `internalformat`:RGBA16F浮点格式(适配HDR)其他同立方体贴图创建 | PBR渲染中,创建高质量HDR环境立方体贴图,用于环境光照计算 |
| PBR渲染 | 设置HDR纹理曝光 | glUniform1f(uExposure, 1.2f); glBindTextureUnit(0, hdrTexID) | 通过统一变量传递曝光值,在片段着色器中调整HDR纹理亮度 | PBR后处理中,动态调整HDR环境贴图的曝光,适配不同场景亮度 |
| VAO操作 | DSA-启用VAO顶点属性 | glEnableVertexArrayAttrib(vaoID,2) | - `vao`:VAO ID- `index`:顶点属性索引 | DSA无绑定启用VAO内的顶点属性,实现VAO属性的独立配置 |
| 变换反馈 | 设置变换反馈输出变量 | const char* varyings[] = {"vPosition", "vNormal"}; glTransformFeedbackVaryings(program, 2, varyings, GL_INTERLEAVED_ATTRIBS) | - `program`:着色器程序ID- `count`:输出变量数量- `varyings`:变量名数组- `bufferMode`:存储模式(交错分离) | 链接着色器前指定变换反馈的输出变量,实现顶点/几何着色器输出的捕获 |
| 变换反馈 | 变换反馈带暂停启动 | glBeginTransformFeedback(GL_POINTS); glPauseTransformFeedback() | 启动后立即暂停,适用于按需恢复的顶点捕获场景 | 粒子系统中,先启动变换反馈再暂停,需要更新粒子时恢复捕获 |
| 变换反馈 | 变换反馈双缓冲切换 | glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER,0,bufA); glSwapBuffers(GL_TRANSFORM_FEEDBACK_BUFFER,0,1) | 绑定两个变换反馈缓冲,通过交换实现数据读写分离,避免数据竞争 | 粒子系统/顶点动画中,双缓冲切换实现变换反馈的连续数据更新与渲染 |
| 变换反馈 | 绑定多个缓冲到变换反馈 | glBindBufferRange(GL_TRANSFORM_FEEDBACK_BUFFER,0,buffer1,0,size1); glBindBufferRange(GL_TRANSFORM_FEEDBACK_BUFFER,1,buffer2,0,size2) | 为不同绑定点绑定不同缓冲,适配多变量分离存储 | 将变换反馈的多个输出变量分别存储到不同缓冲,方便后续独立读取 |
| 变换反馈 | 查询变换反馈是否激活 | GLboolean active; glGetBooleanv(GL_TRANSFORM_FEEDBACK_ACTIVE, &active) | 查询当前变换反馈是否处于激活状态,验证顶点捕获是否正常 | 调试顶点动画时,确认变换反馈是否正常启动,排查顶点数据捕获失败问题 |
| 变换反馈 | 启用变换反馈暂停模式 | glEnable(GL_TRANSFORM_FEEDBACK_PAUSED) | - `cap`:固定为GL_TRANSFORM_FEEDBACK_PAUSED | 全局启用变换反馈暂停状态,后续启动变换反馈时将直接进入暂停模式 |
| 变换反馈 | 查询变换反馈绑定缓冲 | GLint bufID; glGetTransformFeedbackBufferiv(0,GL_TRANSFORM_FEEDBACK_BUFFER_BINDING,&bufID) | - `index`:绑定点索引- `pname`:查询参数 | 调试时查询变换反馈绑定的缓冲,验证数据存储目标是否正确 |
| 变换反馈 | 查询变换反馈捕获的顶点数 | GLint count; glGetTransformFeedbackVaryingiv(program, 0, GL_TRANSFORM_FEEDBACK_VARYING_SIZE, &count) | - 查询变换反馈输出变量的顶点组件数量,计算总数据量 | 获取变换反馈捕获的数据规模,为后续数据读取、内存分配提供依据 |
| 变换反馈 | 设置变换反馈暂停掩码 | glTransformFeedbackPauseMask(GL_BITFIELD_0) | 设置变换反馈暂停时的掩码,控制哪些缓冲停止数据写入 | 多缓冲变换反馈时,精准控制单个缓冲的暂停/恢复,实现精细化数据捕获 |
| 变换反馈 | 获取变换反馈顶点数 | GLuint tfCount; glGetTransformFeedbackVaryingiv(tfID,0,GL_TRANSFORM_FEEDBACK_VARYING_SIZE,&tfCount) | 查询变换反馈输出变量的顶点组件数量 | 获取变换反馈捕获的顶点数据规模,为后续数据读取分配内存 |
| 变换反馈(Transform Feedback) | 设置变换反馈的顶点输出变量 | const char* varyings[] = {"vPosition", "vVelocity"}; glTransformFeedbackVaryings(shaderProgram, 2, varyings, GL_INTERLEAVED_ATTRIBS) | - `program`:着色器程序ID- `count`:输出变量数量- `varyings`:输出变量名称数组- `bufferMode`:缓冲模式(GL_INTERLEAVED_ATTRIBS/GL_SEPARATE_ATTRIBS) | 链接着色器程序前,指定需要捕获的顶点着色器输出变量,以及变量在缓冲中的存储方式 |
| 变换反馈(Transform Feedback) | 启动变换反馈 | glBeginTransformFeedback(GL_TRIANGLES) | - `primitiveMode`:输出图元类型(同glDrawArrays的mode) | 开始捕获着色器输出的顶点数据,后续绘制操作的顶点数据将被写入绑定的缓冲 |
| 变换反馈(Transform Feedback) | 绑定缓冲到变换反馈目标 | glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, tfBufferID) | - `target`:固定为GL_TRANSFORM_FEEDBACK_BUFFER- `index`:绑定点索引- `buffer`:缓冲对象ID | 指定存储变换反馈输出数据的缓冲,实现顶点数据的捕获 |
| 变换反馈(Transform Feedback) | 绑定变换反馈对象 | glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, tfID) | - `target`:固定为GL_TRANSFORM_FEEDBACK- `id`:变换反馈对象ID | 配置变换反馈缓冲或启动变换反馈前,需绑定对象到上下文 |
| 变换反馈(Transform Feedback) | 停止变换反馈 | glEndTransformFeedback() | 无参数 | 结束顶点数据捕获,后续绘制操作不再写入变换反馈缓冲 |
| 变换反馈(Transform Feedback) | 生成变换反馈对象ID | GLuint tfID; glGenTransformFeedbacks(1, &tfID) | - `n`:要生成的变换反馈对象数量- `transformFeedbacks`:存储ID的数组指针 | 捕获顶点着色器/几何着色器的输出顶点数据,用于后续渲染或计算(如粒子系统更新) |
| 裁剪测试(Scissor) | 启用/禁用裁剪测试 | glEnable(GL_SCISSOR_TEST) / glDisable(GL_SCISSOR_TEST) | - `cap`:要启用/禁用的功能,此处固定为 GL_SCISSOR_TEST | 配合glScissor使用,限制渲染范围到指定裁剪区域 |
| 裁剪测试(Scissor) | 查询当前裁剪区域参数 | GLint scissor[4]; glGetIntegerv(GL_SCISSOR_BOX, scissor) | - `pname`:固定为GL_SCISSOR_BOX- `params`:4个int数组,存储裁剪区域x、y、width、height | 多区域渲染时,验证当前裁剪区域是否正确,避免渲染范围错误 |
| 裁剪测试(Scissor) | 设置裁剪区域 | glScissor(100, 100, 600, 400) | - `x`:裁剪区域左下角x坐标- `y`:裁剪区域左下角y坐标- `width`:裁剪区域宽度- `height`:裁剪区域高度 | 仅渲染窗口的指定区域(如分屏渲染、UI局部刷新) |
| 采样器操作(Sampler) | 绑定采样器到纹理单元 | glBindSampler(1, samplerID) | - `unit`:纹理单元索引(GL_TEXTURE0~GL_TEXTUREn)- `sampler`:采样器对象ID(0表示解绑) | 渲染时,将配置好的采样器与指定纹理单元关联,纹理采样将使用该采样器的规则 |
| 采样器操作(Sampler) | 删除采样器对象 | glDeleteSamplers(1, &samplerID) | - `n`:要删除的采样器数量- `samplers`:要删除的采样器ID数组 | 采样器不再使用时,释放其占用的资源,避免内存泄漏 |
| 采样器操作(Sampler) | 设置采样器的过滤参数 | glSamplerParameteri(samplerID, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR) | - `sampler`:采样器对象ID- `pname`:采样参数名(同glTexParameteri的pname)- `param`:参数值(同glTexParameteri的param) | 统一配置采样规则,多个纹理绑定同一采样器时,无需重复设置采样参数,简化代码 |
| 采样器操作(Sampler) | 生成采样器对象ID | GLuint samplerID; glGenSamplers(1, &samplerID) | - `n`:要生成的采样器数量- `samplers`:存储采样器ID的数组指针 | 将纹理采样参数与纹理对象解耦,实现多个纹理共享同一套采样配置(如统一的过滤/环绕规则) |
| 错误处理(Error Handling) | 获取OpenGL错误代码 | GLenum error = glGetError() | 无参数,返回错误代码(完整可选值):✅ GL_NO_ERROR(无错误)、✅ GL_INVALID_ENUM(枚举值无效)、✅ GL_INVALID_VALUE(参数值无效)、✅ GL_INVALID_OPERATION(操作无效)等 | 程序调试阶段,定期检查OpenGL错误,定位非法调用(如参数错误、状态不匹配) |
| 点参数(Point Parameter) | 设置点的衰减参数 | float attenuation[] = {1.0f, 0.01f, 0.001f}; glPointParameterfv(GL_POINT_DISTANCE_ATTENUATION, attenuation) | - `pname`:固定为GL_POINT_DISTANCE_ATTENUATION- `params`:3个float数组,分别为常数、线性、二次衰减系数 | 绘制点图元时,让点的大小随距离相机的远近衰减,实现更真实的粒子效果 |
| 点图元 | 设置点精灵纹理坐标 | glEnable(GL_POINT_SPRITE); glTexEnvf(GL_POINT_SPRITE, GL_COORD_REPLACE, GL_TRUE) | 启用点精灵并自动生成纹理坐标,替代顶点着色器手动计算 | 绘制点精灵/粒子时,让OpenGL自动生成纹理坐标,简化着色器逻辑 |
| 调试(Debug) | 设置调试消息过滤规则 | glDebugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DONT_CARE, 0, NULL, GL_TRUE) | - `source`:消息来源(GL_DONT_CARE表示所有)- `type`:消息类型(GL_DONT_CARE表示所有)- `severity`:消息级别(GL_DONT_CARE表示所有)- `count`:过滤条件数量- `ids`:过滤条件ID数组- `enabled`:是否启用过滤(GL_TRUE启用) | 调试阶段,筛选需要关注的调试消息(如仅显示错误级消息),减少无用信息干扰 |
| 调试标注 | 插入调试消息 | glDebugMessageInsert(GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_MARKER, 0, GL_DEBUG_SEVERITY_NOTIFICATION, -1, "Start_Draw_Shadow") | - `source/type/severity`:消息来源/类型/级别- `id`:自定义ID- `lengthmessage`:消息长度/内容 | 在OpenGL调用流中插入自定义调试标记,调试工具中可精准定位渲染阶段 |
| 调试工具 | 设置调试消息回调 | glDebugMessageCallback((GLDEBUGPROC)OpenGLDebugCallback, NULL) | - `callback`:自定义回调函数- `userParam`:用户自定义参数 | 将OpenGL调试消息重定向到自定义回调,实现个性化错误日志记录 |
| 调试工具 | 设置调试消息过滤 | glDebugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DEBUG_SEVERITY_LOW, 0, NULL, GL_FALSE) | - 过滤低级别调试消息(如警告),仅保留错误/严重消息,减少日志冗余 | 开发后期过滤无关调试消息,聚焦关键错误,提升调试效率 |
| 调试工具 | 启用GPU调试层 | glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS); glDebugMessageCallback(debugProc, NULL) | 同步输出调试消息,回调函数实时捕获错误 | 开发阶段启用GPU调试层,实时捕获OpenGL错误、警告,精准定位问题 |
| 调试工具 | 启用GPU性能计数器 | glEnable(GL_PERFORMANCE_COUNTERS); glGetPerformanceCounteriv(GL_RENDER_CALLS, &count) | 启用GPU性能计数器,查询绘制调用、顶点数等性能数据 | 性能调优时,精准统计GPU渲染指标,定位性能瓶颈(如过度绘制、高频调用) |
| 调试工具 | 启用着色器调试输出 | glEnable(GL_SHADER_DEBUG_OUTPUT);glShaderDebugMessageCallback(shaderDebugProc,NULL) | 启用着色器调试消息输出,将着色器编译/运行错误重定向到自定义回调 | 调试复杂着色器(如PBR、光追)时,精准捕获着色器内的错误、警告 |
| 顶点缓冲(VBO) | 绑定缓冲对象到指定目标 | glBindBuffer(GL_ARRAY_BUFFER, vboID) | - `target`:缓冲目标(完整可选值):✅ GL_ARRAY_BUFFER:顶点属性缓冲(顶点坐标/颜色/纹理坐标)✅ GL_ELEMENT_ARRAY_BUFFER:索引缓冲✅ GL_UNIFORM_BUFFER:统一变量缓冲✅ GL_TEXTURE_BUFFER:纹理缓冲✅ GL_PIXEL_PACK_BUFFER:像素读取缓冲✅ GL_PIXEL_UNPACK_BUFFER:像素写入缓冲- `buffer`:要绑定的缓冲对象 ID | 操作缓冲数据前,将缓冲对象绑定到上下文,后续操作针对该缓冲 |
| 顶点缓冲(VBO) | 向缓冲对象写入数据 | glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW) | - `target`:缓冲目标(同glBindBuffer的target)- `size`:写入数据的字节数- `data`:要写入的数据源指针(NULL则仅分配内存)- `usage`:数据使用方式(完整可选值):✅ GL_STATIC_DRAW:数据很少修改,频繁绘制✅ GL_DYNAMIC_DRAW:数据经常修改,频繁绘制✅ GL_STREAM_DRAW:数据每次绘制都修改 | 将顶点/索引等数据上传到GPU缓冲中,usage参数影响GPU内存优化 |
| 顶点缓冲(VBO) | 生成缓冲对象ID | glGenBuffers(1, &vboID) | - `n`:要生成的缓冲对象数量- `buffers`:存储生成的缓冲ID的数组/指针 | 创建顶点缓冲、索引缓冲、统一缓冲等缓冲对象的第一步 |
| 顶点属性 | 禁用顶点属性 | glDisableVertexArrayAttrib(vaoID, 2) | - `vao`:VAO ID- `index`:顶点属性索引 | 临时禁用VAO中的某个顶点属性,适配不同渲染逻辑(如部分实例无需颜色属性) |
| 顶点属性 | 启用顶点属性相对偏移 | glEnableVertexArrayAttribRelativeOffset(vaoID,3) | 启用VAO顶点属性的相对偏移功能,适配动态顶点格式 | 动态顶点格式场景中,灵活调整属性偏移,无需重新创建VAO |
| 顶点属性 | DSA-设置顶点属性格式 | glVertexArrayAttribFormat(vaoID, 0,3,GL_FLOAT,GL_FALSE,0) | - `vao`:VAO ID其他参数同glVertexAttribFormat | DSA模式无绑定为VAO配置顶点属性格式,适配批量VAO初始化 |
| 顶点属性 | DSA-设置顶点属性整数格式 | glVertexArrayAttribIFormat(vaoID,1,1,GL_INT,0) | DSA无绑定为VAO设置整型顶点属性,直接采样不归一化 | 实例ID、材质ID等整型数据的顶点属性,无需转换为浮点,节省带宽 |
| 顶点属性 | 绑定VAO缓冲(DSA) | glVertexArrayVertexBuffer(vaoID,0,vboID,0,sizeof(Vertex)) | - `vao`:VAO ID其他参数同glBindVertexBuffer | DSA模式无绑定为VAO关联顶点缓冲,实现VAO与缓冲的解耦配置 |
| 顶点属性 | 绑定顶点属性到统一变量 | glVertexAttrib1f(4,0.5f);glEnableVertexAttribArray(4) | 为顶点属性设置固定值,绑定为全局统一变量,无需在缓冲中存储 | 所有顶点/实例共享同一属性值(如全局颜色、统一缩放)时,减少缓冲数据量 |
| 顶点属性 | 设置顶点属性绑定偏移 | glVertexAttribBinding(3, 1); glVertexAttribFormat(3, 2, GL_FLOAT, GL_FALSE, 12) | - `relativeoffset`:属性在绑定缓冲中的偏移量(字节) | 通用顶点属性布局中,精细化设置属性在缓冲中的偏移,适配复杂顶点格式 |
| 顶点属性 | 设置顶点属性流频率 | glVertexAttribDivisor(3,2) | - `divisor`:每N个实例更新一次属性,支持非1步长的实例化 | 多实例共享部分属性(如同一材质的多个实例)时,设置属性更新频率,减少数据传输 |
| 顶点属性 | 启用顶点属性整数采样 | glVertexAttribIPointer(1,1,GL_INT,sizeof(Vertex),(void*)offsetof(Vertex,id)) | I后缀为整数,直接采样整型数据,不归一化 | 着色器中需要原始整型顶点数据时(如实例ID、材质ID),启用整数采样 |
| 顶点属性 | 设置顶点属性双精度格式 | glVertexAttribLPointer(0,3,GL_DOUBLE,0,0) | L后缀为双精度,参数同glVertexAttribPointer,类型为GL_DOUBLE | 高精度场景中,使用双精度顶点属性,避免坐标精度丢失(如大尺度3D场景) |
| 顶点属性 | 设置顶点属性归一化 | glVertexAttribPointer(2, 2, GL_UNSIGNED_BYTE, GL_TRUE, 0, 0) | - `normalized`:GL_TRUE将整型归一化到[0,1]或[-1,1] | 将字节/短整型顶点属性归一化到浮点范围,减少内存占用,提升传输效率 |
| 顶点属性 | 设置顶点属性流步长 | glVertexBindingDivisor(vaoID,1,1) | - `vao`:VAO ID- `bindingindex`:缓冲绑定索引- `divisor`:实例步长 | 通用顶点属性布局中,为缓冲绑定点设置实例步长,适配多缓冲实例化 |
| 顶点属性(Vertex Attribute) | 禁用指定索引的顶点属性数组 | glDisableVertexAttribArray(0) | - `index`:顶点属性索引(同glEnableVertexAttribArray的index参数) | 切换渲染不同属性的物体时,禁用当前不需要的顶点属性,避免数据干扰 |
| 顶点属性(Vertex Attribute) | 启用指定索引的顶点属性数组 | glEnableVertexAttribArray(0) | - `index`:顶点属性索引(与着色器中layout(location = X)对应),取值范围由OpenGL实现定义(通常至少支持16个) | 渲染带顶点属性(如坐标、颜色、法线)的物体时,启用对应属性数组,让GPU读取缓冲中的属性数据 |
| 顶点属性(Vertex Attribute) | 获取顶点属性的配置信息 | GLint attrSize; glGetVertexAttribiv(0, GL_VERTEX_ATTRIB_SIZE, &attrSize) | - `index`:顶点属性索引- `pname`:查询参数(如GL_VERTEX_ATTRIB_SIZE、GL_VERTEX_ATTRIB_TYPE)- `params`:存储结果的指针 | 调试顶点数据渲染时,验证顶点属性的组件数量、数据类型等配置是否正确 |
| 顶点属性(Vertex Attribute) | 设置顶点属性的常量值(无缓冲时) | glVertexAttrib4f(1, 1.0f, 0.0f, 0.0f, 1.0f) | - `index`:顶点属性索引- `xy/z/w`:属性的常量值(对应vec4类型,若为vec3则w默认1.0) | 所有顶点共享同一属性值时使用(如统一颜色),无需创建顶点缓冲,简化代码 |
| 顶点属性(Vertex Attribute) | 配置顶点属性的格式和数据读取规则 | glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8*sizeof(float), (void*)0) | - `index`:顶点属性索引- `size`:每个属性的组件数量(1~4,如3代表x/y/z三维坐标)- `type`:数据类型(完整可选值):✅ GL_BYTE、✅ GL_UNSIGNED_BYTE、✅ GL_SHORT、✅ GL_UNSIGNED_SHORT、✅ GL_INT、✅ GL_UNSIGNED_INT、✅ GL_FLOAT、✅ GL_DOUBLE- `normalized`:是否将整数类型归一化到[0,1](GL_TRUE)或[-1,1](有符号),浮点数无效(GL_FALSE)- `stride`:相邻两个顶点属性的字节间隔(0表示紧密排列)- `pointer`:属性数据在缓冲中的偏移量(void*类型) | 绑定顶点缓冲后,告知GPU如何解析缓冲中的顶点属性数据,是顶点数据与着色器关联的关键步骤 |
| 顶点数组(VAO) | 绑定顶点数组对象 | glBindVertexArray(vaoID) | - `array`:VAO ID(0表示解绑) | 渲染物体前绑定对应的VAO,自动恢复顶点属性配置和缓冲绑定状态,简化渲染流程 |
| 顶点数组(VAO) | 删除顶点数组对象 | glDeleteVertexArrays(1, &vaoID) | - `n`:要删除的VAO数量- `arrays`:要删除的VAO ID数组 | VAO不再使用时,释放其占用的状态资源,避免内存泄漏 |
| 顶点数组(VAO) | 生成顶点数组对象ID | GLuint vaoID; glGenVertexArrays(1, &vaoID) | - `n`:要生成的VAO数量- `arrays`:存储VAO ID的数组指针 | 保存顶点属性配置和缓冲绑定状态,切换渲染对象时直接绑定VAO,无需重复配置顶点属性 |
| 多边形模式(Polygon) | 设置要剔除的多边形面 | glCullFace(GL_BACK) | - `mode`:剔除面(完整可选值):✅ GL_FRONT(剔除正面)、✅ GL_BACK(剔除背面,默认)、✅ GL_FRONT_AND_BACK(剔除正反面) | 根据需求剔除特定面(如渲染透明物体时,剔除正面只显示背面,实现特殊效果) |
| 多边形模式(Polygon) | 启用/禁用多边形剔除 | glEnable(GL_CULL_FACE) / glDisable(GL_CULL_FACE) | - `cap`:固定为GL_CULL_FACE | 关闭背面剔除可查看模型内部,启用则只渲染正面,提升渲染性能(减少一半绘制工作量) |
| 多边形模式(Polygon) | 设置多边形正面的缠绕顺序 | glFrontFace(GL_CCW) | - `mode`:缠绕顺序(完整可选值):✅ GL_CCW(逆时针,默认)、✅ GL_CW(顺时针) | 控制OpenGL判定多边形正面的规则,解决模型正反面渲染错误(如导入模型缠绕顺序相反) |
| 多边形模式(Polygon) | 设置多边形的渲染模式 | glPolygonMode(GL_FRONT_AND_BACK, GL_FILL) | - `face`:多边形面(完整可选值):✅ GL_FRONT:仅正面✅ GL_BACK:仅背面✅ GL_FRONT_AND_BACK:正反面- `mode`:渲染模式(完整可选值):✅ GL_POINT:仅绘制顶点✅ GL_LINE:绘制线框✅ GL_FILL:填充多边形(默认) | 调试时绘制线框查看模型轮廓,或特殊效果(如线框风格渲染) |
| 多视口(Multiple Viewports) | 设置多个视口参数 | GLint viewports[8] = {0,0,400,300, 400,0,400,300}; glViewportArrayv(0, 2, viewports) | - `first`:起始视口索引- `count`:视口数量- `v`:视口参数数组(每个视口占4个int:x,y,width,height) | 单遍渲染中同时输出到多个视口(如分屏显示多个相机视角、VR双屏渲染) |
| 多视口(Multiple Viewports) | 设置单个视口的层索引 | glViewportLayered(0, 0, 0, 800, 600, 0) | - `index`:视口索引- `xy/width/height`:视口坐标和尺寸- `layer`:图层索引(多层渲染目标用) | 多视口+多层渲染目标场景中,指定每个视口对应的渲染图层,实现复杂分层渲染 |
| 多重采样(Multisampling) | 启用/禁用多重采样抗锯齿 | glEnable(GL_MULTISAMPLE) / glDisable(GL_MULTISAMPLE) | - `cap`:要启用/禁用的功能,此处固定为GL_MULTISAMPLE | 需要提升渲染画面质量、减少锯齿(如模型边缘、文本)时启用,对性能有一定消耗 |
| 多重采样(Multisampling) | 设置多重采样的采样数和采样缓冲区格式 | glRenderbufferStorageMultisample(GL_RENDERBUFFER, 4, GL_DEPTH24_STENCIL8, 800, 600) | - `target`:渲染缓冲目标(固定为GL_RENDERBUFFER)- `samples`:采样数(常见值:2、4、8,值越高抗锯齿效果越好,性能消耗越大)- `internalformat`:渲染缓冲内部格式(如GL_DEPTH24_STENCIL8:深度24位+模板8位)- `width`:渲染缓冲宽度- `height`:渲染缓冲高度 | 自定义帧缓冲实现多重采样抗锯齿时,创建带多重采样的深度模板渲染缓冲附件 |
| 管线状态 | 设置多边形剔除模式 | glCullFace(GL_BACK); glFrontFace(GL_CW) | - `glCullFace`:剔除面(GL_FRONT/GL_BACK/GL_FRONT_AND_BACK)- `glFrontFace`:正面环绕方向(GL_CWGL_CCW) | 剔除不可见的多边形面,减少绘制调用,提升渲染性能,同时修正正面环绕方向 |
| 管线状态 | 启用剪裁剪切 | glEnable(GL_CLIP_DISTANCE0); glUniform1f(uClipDist, 0.5f) | 通过统一变量传递裁剪距离,在顶点着色器中设置gl_ClipDistance[0] | 在着色器中自定义裁剪平面,实现任意形状的像素裁剪(如斜切面、局部裁剪) |
| 管线状态 | 启用深度 clamp | glEnable(GL_DEPTH_CLAMP); glDepthRange(0.0f, 1.0f) | 启用后,超出深度范围的像素不会被裁剪,而是将深度值钳位到近/远平面 | 渲染大尺寸物体或远距离场景时,避免因深度范围限制导致的物体裁剪错误 |
| 管线状态 | 启用多边形偏移 | glEnable(GL_POLYGON_OFFSET_FILL); glPolygonOffset(1.0f, 1.0f) | - `factor/units`:偏移因子/单位,最终偏移=factor*斜率+units | 为填充的多边形设置深度偏移,避免共面多边形的深度冲突(如阴影映射、轮廓渲染) |
| 管线状态 | 启用点大小着色器控制 | glEnable(GL_PROGRAM_POINT_SIZE) | 启用后,顶点着色器可通过gl_PointSize设置点的大小 | 粒子系统中,在顶点着色器中动态计算点大小(如随距离衰减),实现灵活的粒子渲染 |
| 管线状态 | 启用剪测试 | glEnable(GL_SCISSOR_TEST); glScissor(100,100,600,400) | glScissor定义剪切区域x/y/width/height,仅渲染该区域内的像素 | 仅在指定矩形区域内渲染像素,适用于分区域绘制、UI裁剪、局部重渲染 |
| 管线状态 | 设置多边形绘制模式 | glPolygonMode(GL_FRONT_AND_BACK, GL_LINE) | - `face`:多边形面- `mode`:GL_FILL(填充)GL_LINE(线框)/GL_POINT(点) | 将模型渲染为线框/点模式,适用于模型调试、轮廓预览、线框渲染效果 |
| 管线状态 | 设置多边形偏移模式 | glPolygonOffsetClamp(1.0f, 0.5f, 10.0f) | - `factor/units/clamp`:偏移因子/单位/最大值 | 为多边形偏移设置最大值,避免过度偏移导致的渲染错误,适配阴影映射 |
| 管线状态 | 重置管线状态 | glResetPipeline(GL_ALL_PIPELINE_STATE_BIT) | - `mask`:重置的状态掩码(GL_ALL_PIPELINE_STATE_BIT为全部) | 复杂渲染场景切换后,快速重置管线状态,避免状态污染导致的渲染错误 |
| 管线状态 | 创建管线状态对象(PSO) | GLuint pso = glCreatePipelineState(1, &psoCreateInfo) | 创建管线状态对象,封装着色器/纹理/混合等状态,实现一键状态切换 | 复杂场景渲染中,使用PSO减少状态切换开销,提升渲染效率 |
| 光追扩展 | 启用光追管线(GL_ARB_ray_tracing) | glEnable(GL_RAY_TRACING_ARB) | 启用OpenGL光追扩展管线,为光追渲染做准备 | 基于OpenGL光追扩展开发实时光追功能(如反射、阴影、全局光照) |
| 光追扩展(ARB) | 绑定加速结构到着色器 | glBindAccelerationStructureARB(GL_ACCELERATION_STRUCTURE_ARB, asID) | - `target`:固定为GL_ACCELERATION_STRUCTURE_ARB- `as`:光追AS ID | 将构建好的加速结构绑定到光追着色器,让射线能访问几何体BVH数据 |
| 光追扩展(ARB) | 绑定光追管线 | glBindRayTracingPipelineARB(GL_RAY_TRACING_PIPELINE_ARB, rtPipeline) | - `target`:固定为GL_RAY_TRACING_PIPELINE_ARB- `pipeline`:光追管线对象ID | 启用创建好的光追管线,后续光追调度将使用该管线的着色器配置 |
| 光追扩展(ARB) | 绑定光追着色器表 | glBindShaderTableARB(GL_SHADER_TABLE_ARB,shaderTableID,0) | - `target`:GL_SHADER_TABLE_ARB- `table`:着色器表ID- `offset`:表偏移 | 将光追着色器表绑定到管线,建立光线与着色器的调度映射关系 |
| 光追扩展(ARB) | 构建加速结构(AS) | glBuildAccelerationStructuresARB(1, &asID, 0, NULL) | - `n`:AS数量- `pASIDs`:AS ID数组- `buildOffset`:构建偏移- `pSizes`:返回构建大小 | 为创建的光追加速结构填充几何数据,完成BVH构建,启用高效碰撞检测 |
| 光追扩展(ARB) | 创建加速结构(AS) | glCreateAccelerationStructuresARB(1, &asCreateInfo, NULL, &asID) | - `n`:加速结构数量- `pCreateInfos`:AS创建信息(拓扑/几何数据等)- `pIDs`:存储AS ID的数组 | 创建用于光追的加速结构(如BVH),优化射线与几何体的碰撞检测效率 |
| 光追扩展(ARB) | 创建光追着色器表 | glCreateShaderTablesARB(1, &shaderTableInfo, NULL, &shaderTableID) | - `pCreateInfos`:着色器表配置- `pIDs`:存储着色器表ID | 创建光追专用着色器表,管理光线生成/命中/未命中着色器的调度关系 |
| 光追扩展(ARB) | 释放光追加速结构 | glDeleteAccelerationStructuresARB(1, &asID) | - `n`:AS数量- `pASIDs`:待删除AS ID数组 | 光追场景销毁时,释放加速结构资源,避免GPU内存泄漏 |
| 光追扩展(ARB) | 销毁光追着色器表 | glDeleteShaderTablesARB(1,&shaderTableID) | - `n`:表数量- `pIDs`:待删除着色器表ID数组 | 光追管线销毁时,释放着色器表资源,避免GPU内存冗余占用 |
| 光追扩展(ARB) | 查询光追管线状态 | GLint status;glGetRayTracingPipelineivARB(rtPipeline,GL_PIPELINE_LINK_STATUS,&status) | - `pipeline`:光追管线ID- `pname`:查询状态(链接/编译等) | 调试光追管线时,验证管线链接/编译状态,排查光追着色器配置错误 |
| 光追扩展(ARB) | 调度光追射线 | glTraceRaysARB(&rayGenShaderRecord, &missShaderRecord, &hitGroupRecord, 1920, 1080, 1) | - 前三个参数:光线生成/未命中/命中组着色器记录- 后三个参数:xy/z方向射线调度数量 | 启动光追射线调度,按屏幕分辨率生成射线,执行光追碰撞检测与着色 |
| 光追扩展(ARB) | 创建光追管线对象 | GLuint rtPipeline = glCreateRayTracingPipelinesARB(1, &pipelineCreateInfo, NULL) | - `n`:管线数量- `pCreateInfos`:光追管线创建信息结构体- `pLengths`:返回的管线长度(NULL即可) | 基于OpenGL光追扩展,创建光追渲染管线,为实时光追渲染奠定基础 |
| 光追扩展(ARB) | 更新光追加速结构 | glUpdateAccelerationStructuresARB(1,&asID,0,NULL,NULL) | - `n`:更新AS数量- `pASIDs`:待更新AS ID- 后续参数:更新偏移/大小/依赖 | 光追场景中几何体局部更新时,增量更新加速结构,避免全量重建BVH,提升效率 |
| 环境映射 | 生成辐射度立方体贴图 | glGenerateTextureMipmap(cubeTexID); glTextureParameteri(cubeTexID, GL_TEXTURE_MIN_FILTER, GL_LINEAR) | DSA模式生成mipmap并设置线性过滤,用于辐射度贴图的模糊采样 | 为环境立方体贴图生成mipmap,实现基于mipmap的辐射度计算,提升PBR渲染效果 |
| 缓冲操作(Buffer) | 映射缓冲内存到CPU地址空间 | float* bufPtr = (float*)glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY) | - `target`:缓冲目标(同glBindBuffer的target参数)- `access`:访问模式(完整可选值):✅ GL_READ_ONLY:仅读取✅ GL_WRITE_ONLY:仅写入✅ GL_READ_WRITE:可读可写 | 大量数据更新或频繁读写缓冲时使用,减少CPU与GPU间的数据拷贝开销 |
| 缓冲操作(Buffer) | 更新缓冲对象部分数据 | glBufferSubData(GL_ARRAY_BUFFER, 24, sizeof(subVertices), subVertices) | - `target`:缓冲目标(同glBindBuffer的target参数)- `offset`:缓冲内更新区域的起始偏移量(字节)- `size`:更新数据的字节数- `data`:要更新的数据源指针 | 缓冲数据部分修改时使用(如动态顶点数据更新),避免重新分配整个缓冲内存 |
| 缓冲操作(Buffer) | 复制缓冲数据(GPU端直接复制) | glCopyBufferSubData(GL_ARRAY_BUFFER, GL_ELEMENT_ARRAY_BUFFER, 0, 0, sizeof(vertices)) | - `readtarget`:源缓冲目标- `writetarget`:目标缓冲目标- `readoffset`:源缓冲起始偏移量(字节)- `writeoffset`:目标缓冲起始偏移量(字节)- `size`:复制数据的字节数 | 无需CPU中转,直接在GPU端复制两个缓冲的数据(如顶点缓冲复制到纹理缓冲),提升效率 |
| 缓冲操作(Buffer) | 删除缓冲对象 | glDeleteBuffers(1, &vboID) | - `n`:要删除的缓冲数量- `buffers`:要删除的缓冲ID数组指针 | 缓冲不再使用时,释放GPU缓冲内存(如模型卸载时删除对应的顶点/索引缓冲) |
| 缓冲操作(Buffer) | 解除缓冲内存的CPU映射 | glUnmapBuffer(GL_ARRAY_BUFFER) | - `target`:缓冲目标(同glBindBuffer的target参数) | 缓冲映射完成后调用,释放CPU对缓冲内存的访问权,确保GPU正常使用缓冲 |
| 绘制操作(Drawing) | 绘制顶点数组(三角形图元) | glDrawArrays(GL_TRIANGLES, 0, 3) | - `mode`:图元类型(完整可选值):✅ GL_POINTS:绘制独立点✅ GL_LINES:绘制独立线段(每2个顶点1条线)✅ GL_LINE_STRIP:绘制折线(连续线段)✅ GL_LINE_LOOP:绘制闭合折线✅ GL_TRIANGLES:绘制独立三角形(每3个顶点1个三角形)✅ GL_TRIANGLE_STRIP:绘制三角带(连续三角形,共享边)✅ GL_TRIANGLE_FAN:绘制三角扇(以第一个顶点为中心)✅ GL_LINES_ADJACENCY:带邻接信息的线段✅ GL_LINE_STRIP_ADJACENCY:带邻接信息的折线✅ GL_TRIANGLES_ADJACENCY:带邻接信息的三角形✅ GL_TRIANGLE_STRIP_ADJACENCY:带邻接信息的三角带- `first`:起始顶点索引(从0开始)- `count`:要绘制的顶点数量 | 渲染几何图形的核心方法,根据顶点数据和图元类型绘制物体 |
| 绘制操作(Drawing) | 实例化绘制(多次绘制同一物体) | glDrawArraysInstanced(GL_TRIANGLES, 0, 3, 100) | - `mode`:图元类型- `first`:起始顶点索引- `count`:单实例顶点数量- `instancecount`:实例数量 | 批量渲染相同物体(如粒子系统、森林中的树木),减少CPU绘制调用次数,提升性能 |
| 绘制操作(Drawing) | 通过索引缓冲区绘制图元 | glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0) | - `mode`:图元类型(同glDrawArrays的mode参数)- `count`:要绘制的索引数量- `type`:索引数据类型(完整可选值):✅ GL_UNSIGNED_BYTE、✅ GL_UNSIGNED_SHORT、✅ GL_UNSIGNED_INT- `indices`:索引数据在缓冲中的偏移量(绑定GL_ELEMENT_ARRAY_BUFFER时) | 渲染复杂模型时,通过索引复用顶点数据,减少顶点缓冲内存占用 |
| 绘制操作(Drawing) | 通过索引进行实例化绘制 | glDrawElementsInstanced(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0, 50) | - `mode`:图元类型- `count`:单实例索引数量- `type`:索引数据类型- `indices`:索引偏移量- `instancecount`:实例数量 | 结合索引复用和实例化,高效渲染大量相同的复杂模型(如建筑群、粒子集群) |
| 绘制操作(Drawing) | 设置实例化顶点属性除数 | glVertexAttribDivisor(2, 1) | - `index`:顶点属性索引(实例化相关属性)- `divisor`:属性更新频率除数(0:每顶点更新;1:每实例更新;n:每n个实例更新) | 实例化绘制时,控制不同属性的更新频率(如每个实例的位置不同,除数设为1) |
| 几何着色器 | 几何着色器中发射顶点 | // 着色器内:EmitVertex(); EndPrimitive(); | EmitVertex发射单个顶点,EndPrimitive结束当前图元 | 几何着色器中从输入图元生成新顶点,实现动态点生成、轮廓扩展等效果 |
| 几何着色器 | 设置几何着色器流输出 | glProgramParameteri(program, GL_GEOMETRY_STREAM_COUNT, 2) | - `program`:程序ID- `value`:输出流数量(最大4) | 让几何着色器向多个输出流发射顶点,实现同一图元的多路径渲染 |
| 几何着色器 | 设置几何着色器输入/输出图元 | glProgramParameteri(program,GL_GEOMETRY_INPUT_TYPE,GL_TRIANGLES) | 配合GL_GEOMETRY_OUTPUT_TYPE使用,定义几何着色器图元处理规则 | 链接着色器前,配置几何着色器的图元输入输出类型,适配不同渲染逻辑 |
| 几何着色器 | 设置几何着色器最大输出顶点数 | glProgramParameteri(program,GL_GEOMETRY_VERTICES_OUT,128) | 指定几何着色器单次可输出的最大顶点数,避免输出超限 | 开发复杂几何着色器时,设置足够的最大输出顶点数,支持多图元生成 |
| 计算着色器 | 绑定着色器存储缓冲(SSBO)到绑定点 | glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 2, ssboID) | - `target`:GL_SHADER_STORAGE_BUFFER- `index`:绑定点索引- `buffer`:SSBO ID | 将SSBO绑定到指定绑定点,让计算着色器通过绑定点访问缓冲数据,解耦ID依赖 |
| 计算着色器 | 批量绑定SSBO到绑定点 | glBindBuffersBase(GL_SHADER_STORAGE_BUFFER,1,3,ssboIDs) | - `first`:起始绑定点- `count`:SSBO数量- `buffers`:SSBO ID数组 | 计算着色器多数据处理时,批量绑定多个SSBO,减少多次绑定的状态开销 |
| 计算着色器 | 绑定图像纹理到着色器 | glBindImageTexture(0,imgTexID,0,GL_FALSE,0,GL_READ_WRITE,GL_RGBA32F) | - `unit`:图像单元- `texture`:纹理ID- `access`:读写模式- `format`:纹理格式 | 让计算着色器直接读写纹理像素,实现GPU端纹理后处理(如模糊、卷积) |
| 计算着色器 | 设置SSBO数据对齐 | glBufferParameteri(ssboID, GL_BUFFER_OFFSET_ALIGNMENT, 256) | - `pname`:GL_BUFFER_OFFSET_ALIGNMENT- `param`:对齐字节数 | 为SSBO设置内存对齐,匹配GPU硬件访问粒度,提升计算着色器数据读取效率 |
| 计算着色器 | 调度计算着色器工作组 | glDispatchCompute(16,16,1) | - `num_groups_x/y/z`:三维工作组数量 | 启动计算着色器,按三维工作组调度执行,适用于GPU并行计算(如粒子更新) |
| 计算着色器 | 调度计算着色器间接执行 | glDispatchComputeIndirect(indirectBufID) | - `indirect`:存储调度参数的缓冲ID,含x/y/z工作组数量 | 通过缓冲动态传递计算着色器调度参数,实现运行时动态调整并行规模 |
| 计算着色器 | 启用计算着色器原子操作 | glEnable(GL_SHADER_ATOMIC_COUNTERS) | 启用着色器原子计数器,支持计算着色器中多工作组的原子性数据操作 | 粒子系统/物理模拟中,实现多线程安全的计数、累加等原子操作,避免数据竞争 |
| 计算着色器 | 创建原子计数器缓冲 | glGenBuffers(1,&atomicBuf); glBindBuffer(GL_ATOMIC_COUNTER_BUFFER,atomicBuf) | 创建专用原子计数器缓冲,存储计算着色器的原子操作计数数据 | 复杂并行计算中,使用专用原子缓冲管理计数,提升原子操作的稳定性 |
| 计算着色器 | 设置图像纹理过滤 | glImageTextureParameteri(imgTexID,GL_IMAGE_FILTER,GL_LINEAR) | 为计算着色器的图像纹理设置过滤模式,适配像素插值需求 | 计算着色器中采样图像纹理时,实现线性插值,提升后处理效果平滑度 |
| 计算着色器 | 查询计算着色器执行状态 | GLint status; glGetProgramiv(computeProg, GL_COMPUTE_PROGRAM_STATE, &status) | - `program`:计算着色器程序ID- `pname`:固定为GL_COMPUTE_PROGRAM_STATE | 调试时查询计算着色器的执行状态,验证是否正常运行,排查执行错误 |
| 计算着色器 | 设置计算着色器内存屏障 | glMemoryBarrier(GL_SHADER_STORAGE_BARRIER_BIT|GL_TEXTURE_UPDATE_BARRIER_BIT) | 同步着色器存储缓冲和纹理更新,防止数据竞争 | 计算着色器写入SSBO/纹理后,渲染管线读取前进行内存同步,保证数据一致性 |
| 计算着色器 | 设置计算着色器工作组大小 | glProgramParameteri(computeProg, GL_COMPUTE_WORK_GROUP_SIZE, 16, 16, 1) | - `program`:计算着色器程序ID- 后三个参数:xy/z方向工作组大小 | 链接着色器前指定工作组大小,适配不同GPU的硬件核心数量,提升并行效率 |
| 计算着色器 | 释放图像纹理绑定 | glUnbindImageTexture(0) | - `unit`:待解绑的图像单元索引 | 计算着色器执行完毕后,解绑图像纹理,避免后续渲染的纹理单元污染 |
| 计算着色器(Compute Shader) | 启动计算着色器执行 | glDispatchCompute(10, 10, 1) | - `num_groups_x/num_groups_y/num_groups_z`:x/y/z维度的工作组数量(需与着色器local_size匹配) | 执行通用GPU计算任务(如粒子更新、图像后处理、物理模拟),无需渲染管线 |
| 计算着色器(Compute Shader) | 获取计算着色器的局部工作组大小限制 | GLint maxInvocations; glGetIntegerv(GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS, &maxInvocations) | - `pname`:固定为GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS- `params`:存储最大调用数的指针 | 配置计算着色器时,确保局部工作组的总调用数(x*y*z)不超过硬件限制 |
| 计算着色器(Compute Shader) | 设置内存屏障(确保计算着色器写操作完成) | glMemoryBarrier(GL_SHADER_STORAGE_BARRIER_BIT) | - `barrierBits`:屏障类型(如GL_SHADER_STORAGE_BARRIER_BIT表示SSBO操作完成) | 计算着色器写入数据后,确保后续操作(如渲染)能读取到最新数据,避免数据竞争 |
| 矩阵操作(Matrix) | 将当前矩阵重置为单位矩阵 | glLoadIdentity() | 无参数 | 矩阵操作前初始化,避免之前的矩阵变换影响当前计算 |
| 矩阵操作(Matrix) | 指定当前操作的矩阵模式 | glMatrixMode(GL_PROJECTION) | - `mode`:矩阵模式(完整可选值):✅ GL_MODELVIEW:模型视图矩阵(物体变换)✅ GL_PROJECTION:投影矩阵(相机视角)✅ GL_TEXTURE:纹理矩阵(纹理变换)✅ GL_COLOR:颜色矩阵(颜色变换,少用) | 切换矩阵操作上下文,如设置投影矩阵前需切换到 GL_PROJECTION 模式 |
| 立方体贴图操作 | 设置立方体贴图环绕方式 | glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE) | 立方体贴图S/T/R分别对应X/Y/Z轴,参数同2D纹理 | 配置立方体贴图的环绕规则,消除天空盒边缘接缝 |
| 立方体贴图操作 | 从纹理数组创建立方体贴图视图 | glTextureView(cubeViewID, GL_TEXTURE_CUBE_MAP, texArrayID, GL_RGBA8,0,1,0,6) | 取纹理数组前6个图层作为立方体贴图6个面,maxLayer=6 | 将6层2D纹理数组转为立方体贴图,无需单独上传6个面数据 |
| 模板测试 | 获取模板缓冲值 | GLint stencilValue; glReadPixels(x,y,1,1,GL_STENCIL_INDEX,GL_INT,&stencilValue) | 读取像素格式为GL_STENCIL_INDEX,数据类型为GL_INT | 读取指定像素的模板缓冲值,适用于模板拾取、遮罩区域验证 |
| 模板测试 | 设置模板测试参考值和掩码 | glStencilFunc(GL_EQUAL, 0x03, 0x0F) | - `func`:比较函数(GL_EQUAL/GL_LESS等)- `ref`:参考值- `mask`:比较掩码 | 精细化控制模板测试条件,仅当模板值与参考值(按掩码筛选后)相等时通过 |
| 模板测试 | 为正面/背面设置不同模板函数 | glStencilFuncSeparate(GL_FRONT, GL_GREATER, 0x02, 0x0F); glStencilFuncSeparate(GL_BACK, GL_LESS, 0x02, 0x0F) | - `face`:GL_FRONT/GL_BACK其他参数同glStencilFunc | 对物体正面和背面应用不同的模板测试规则,实现复杂的双面遮罩效果 |
| 模板测试 | 模板缓冲逐位操作 | glStencilMask(0x01); glStencilOp(GL_INCR,GL_KEEP,GL_KEEP) | 仅操作模板缓冲第0位,实现单比特遮罩,节省模板缓冲空间 | 多通道模板遮罩时,逐位控制模板更新,实现多个独立遮罩逻辑 |
| 模板测试 | 模板缓冲位移动作 | glStencilOp(GL_INCR_WRAP, GL_KEEP, GL_DECR_WRAP) | WRAP为循环增减,如0xFF+1=0x00,0x00-1=0xFF | 模板值达到边界时循环增减,适用于循环遮罩、多轮渲染计数场景 |
| 模板测试 | 模板测试与深度测试联动 | glStencilOp(GL_KEEP, GL_INCR, GL_REPLACE); glDepthFunc(GL_LESS) | 深度测试失败时递增模板值,通过时替换模板值 | 实现深度相关的模板遮罩,如仅为被遮挡的像素更新模板值 |
| 模板测试 | 模板缓冲与颜色缓冲联动 | glStencilOp(GL_KEEP,GL_KEEP,GL_INCR);glColorMask(GL_FALSE,GL_FALSE,GL_FALSE,GL_FALSE) | 仅更新模板缓冲,禁用颜色缓冲写入,实现无颜色污染的模板遮罩生成 | 生成复杂遮罩(如轮廓、区域选框)时,避免遮罩绘制污染原有颜色画面 |
| 模板测试 | 模板缓冲分层操作 | glStencilOpLayer(GL_INCR,GL_KEEP,GL_REPLACE,2) | 为指定模板层设置操作,适配3D模板缓冲的分层遮罩 | 3D场景中,为不同深度层设置独立模板规则,实现分层遮罩渲染 |
| 模板测试(Stencil) | 启用/禁用模板测试 | glEnable(GL_STENCIL_TEST) / glDisable(GL_STENCIL_TEST) | - `cap`:固定为GL_STENCIL_TEST | 实现模板测试相关效果(如遮罩渲染、轮廓提取、物体裁剪)时启用 |
| 模板测试(Stencil) | 设置模板测试函数 | glStencilFunc(GL_ALWAYS, 1, 0xFF) | - `func`:测试函数(完整可选值:GL_NEVER/LESS/LEQUAL/GREATER/GREATER/EQUAL/NOTEQUAL/ALWAYS)- `ref`:参考值- `mask`:模板掩码(与模板值、参考值按位与后比较) | 定义模板测试的判定规则(如仅渲染模板值等于参考值的区域) |
| 模板测试(Stencil) | 设置模板测试的判定条件 | glStencilFunc(GL_EQUAL, 1, 0xFF) | - `func`:判定函数(完整可选值):✅ GL_NEVER:永远不通过✅ GL_LESS:模板值 < 参考值 则通过✅ GL_LEQUAL:模板值 ≤ 参考值 则通过✅ GL_GREATER:模板值 > 参考值 则通过✅ GL_GEQUAL:模板值 ≥ 参考值 则通过✅ GL_EQUAL:模板值 = 参考值 则通过✅ GL_NOTEQUAL:模板值 ≠ 参考值 则通过✅ GL_ALWAYS:永远通过- `ref`:参考值(0~255,与模板缓冲区值比较的基准)- `mask`:掩码(0~0xFF),模板值和参考值会先与该值按位与后再比较 | 模板测试开启时,定义模板缓冲区值的判定规则,常用于轮廓绘制、阴影体积、镜面遮挡等 |
| 模板测试(Stencil) | 设置正面/背面的模板测试函数 | glStencilFuncSeparate(GL_FRONT, GL_ALWAYS, 1, 0xFF) | - `face`:多边形面(GL_FRONT/GL_BACK/GL_FRONT_AND_BACK)- 其他参数同glStencilFunc | 对物体的正面和背面设置不同的模板测试规则(如仅对背面进行模板遮罩) |
| 模板测试(Stencil) | 设置模板测试通过/失败时的模板缓冲区更新规则 | glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE) | - `sfail`:模板测试失败时的操作(完整可选值):✅ GL_KEEP:保持模板缓冲区原值✅ GL_ZERO:将模板缓冲区值设为0✅ GL_REPLACE:替换为参考值(ref参数)✅ GL_INCR:模板值+1(饱和,最大到255)✅ GL_INCR_WRAP:模板值+1(非饱和,溢出则归零)✅ GL_DECR:模板值-1(饱和,最小到0)✅ GL_DECR_WRAP:模板值-1(非饱和,溢出则设为255)✅ GL_INVERT:模板值按位取反- `dpfail`:模板通过但深度测试失败时的操作(可选值同上)- `dppass`:模板和深度都通过时的操作(可选值同上) | 配合模板测试,控制模板缓冲区的更新逻辑,实现复杂的模板掩码效果 |
| 模板测试(Stencil) | 设置正面/背面的模板操作 | glStencilOpSeparate(GL_BACK, GL_KEEP, GL_KEEP, GL_INCR) | - `face`:多边形面(GL_FRONT/GL_BACK/GL_FRONT_AND_BACK)- 其他参数同glStencilOp | 对物体的正面和背面设置不同的模板缓冲更新规则(如背面渲染时递增模板值) |
| 清除缓冲区(Clear) | 清除指定的缓冲区(颜色/深度/模板) | glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) | - `mask`:缓冲区掩码(完整可选值):✅ GL_COLOR_BUFFER_BIT:颜色缓冲区(清空画面颜色)✅ GL_DEPTH_BUFFER_BIT:深度缓冲区(清空深度信息)✅ GL_STENCIL_BUFFER_BIT:模板缓冲区(清空模板信息)(可通过|组合清除多个缓冲区) | 每一帧渲染开始前,清空上一帧的渲染结果 |
| 清理操作 | 清理帧缓冲多附件 | glClearBufferfv(GL_COLOR,0,clearColor); glClearBufferfi(GL_DEPTH_STENCIL,0,1.0f,0) | 分别清理颜色、深度/模板附件,实现精细化帧缓冲清理 | MRT渲染前,按需清理指定帧缓冲附件,避免无效清理开销 |
| 清理操作 | 批量删除缓冲对象 | GLuint bufs[] = {vboID, eboID, ssboID}; glDeleteBuffers(3, bufs) | - `n`:要删除的缓冲数量- `buffers`:缓冲ID数组 | 程序退出或资源释放时,批量删除多个缓冲对象,避免遗漏导致内存泄漏 |
| 清理操作 | 批量删除纹理对象 | GLuint texs[] = {diffuseTex, normalTex, specularTex}; glDeleteTextures(3, texs) | - `n`:要删除的纹理数量- `textures`:纹理ID数组 | 场景切换或程序结束时,批量释放纹理资源,优化内存占用 |
| 色彩管理 | 启用浮点帧缓冲混合 | glEnable(GL_FRAMEBUFFER_BLEND_FLOAT); glBlendEquation(GL_FUNC_ADD) | 核心版浮点混合启用,支持HDR帧缓冲的高精度颜色混合 | PBR/HDR渲染中,实现无精度丢失的颜色叠加,保证亮部细节完整 |
| 色彩管理 | 设置颜色空间转换 | glEnable(GL_FRAMEBUFFER_SRGB); glColorSpaceEXT(GL_SRGB_EXT) | 启用sRGB颜色空间转换,自动完成线性空间到sRGB空间的伽马校正 | 普通渲染场景中,实现正确的色彩空间转换,保证画面色彩还原度 |
| 色彩管理 | 查询帧缓冲颜色格式 | GLint format; glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING, &format) | - 查询帧缓冲颜色附件的颜色编码格式(线性/sRGB) | 调试时验证颜色编码格式,确保色彩空间转换配置正确 |
| 色彩管理 | 设置纹理颜色空间 | glTextureParameteri(texID, GL_TEXTURE_COLOR_SPACE, GL_SRGB) | - `param`:GL_SRGB/GL_LINEAR,指定纹理色彩空间 | 为PBR材质纹理指定色彩空间,让GPU自动完成线性转换,保证光照计算正确 |
| 深度测试 | 设置深度范围(浮点精准版) | glDepthRangef(0.0f, 0.5f) | - `near/far`:浮点型近/远平面深度值 | 浮点型深度范围设置,比glDepthRange精度更高,适配高精度深度渲染需求 |
| 深度测试 | 启用深度边界测试(核心版) | glEnable(GL_DEPTH_BOUNDS_TEST); glDepthBoundsd(0.1,0.9) | glDepthBoundsd为双精度版本,精度更高 | 高精度场景中,仅渲染深度值在指定双精度范围内的像素,实现精准景深 |
| 深度测试 | 启用深度边界测试 | glEnable(GL_DEPTH_CLAMP); glDepthBoundsEXT(0.2f, 0.8f) | - `min/max`:深度边界的最小值/最大值 | 仅渲染深度值在指定范围内的像素,适用于局部区域渲染、景深效果实现 |
| 深度测试 | 设置深度纹理比较函数 | glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_COMPARE_FUNC,GL_LESS) | 配合GL_COMPARE_REF_TO_TEXTURE使用,定义深度比较规则 | 阴影映射中,设置深度纹理的硬件比较规则,简化着色器采样逻辑 |
| 深度测试 | 启用深度纹理自动生成mipmap | glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_GENERATE_MIPMAP,GL_TRUE) | 启用GPU自动为深度纹理生成mipmap,适配多级阴影映射 | 级联阴影映射(CSM)中,自动生成不同分辨率的深度mipmap,适配多段视锥 |
| 深度测试 | 设置深度纹理mipmap过滤 | glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR) | 为深度纹理启用三线性过滤,提升阴影映射的采样平滑度 | 软阴影渲染中,通过深度纹理mipmap线性过滤,让阴影边缘更柔和 |
| 深度测试 | 启用深度纹理阵列比较 | glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_REF_TO_TEXTURE) | 为深度纹理阵列启用硬件比较模式,适配多光源阴影映射的深度纹理阵列 | 多光源场景中,使用深度纹理阵列存储多个光源的阴影图,简化采样逻辑 |
| 深度测试 | 启用深度纹理比较模式(DSA) | glTextureParameteri(depthTexID, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_REF_TO_TEXTURE) | DSA模式无绑定设置,参数同glTexParameteri | 为深度纹理启用硬件比较,简化阴影映射的着色器逻辑,提升渲染效率 |
| 深度测试(Depth) | 设置深度测试的判定函数 | glDepthFunc(GL_LESS) | - `func`:判定函数(完整可选值):✅ GL_NEVER:永远不通过✅ GL_LESS:深度值 < 缓冲区值 则通过(默认)✅ GL_EQUAL:深度值 = 缓冲区值 则通过✅ GL_LEQUAL:深度值 ≤ 缓冲区值 则通过✅ GL_GREATER:深度值 > 缓冲区值 则通过✅ GL_NOTEQUAL:深度值 ≠ 缓冲区值 则通过✅ GL_GEQUAL:深度值 ≥ 缓冲区值 则通过✅ GL_ALWAYS:永远通过 | 开启深度测试后,定义像素深度值的判定规则,解决遮挡问题 |
| 深度测试(Depth) | 启用/禁用深度缓冲写入 | glDepthMask(GL_FALSE) | - `flag`:GL_TRUE(允许写入,默认)/GL_FALSE(禁止写入) | 渲染透明物体时,禁止深度缓冲写入(避免遮挡后续透明物体),仅进行深度测试 |
| 深度测试(Depth) | 设置深度缓冲区的写入掩码 | glDepthMask(GL_TRUE) | - `flag`:是否允许写入深度缓冲区(GL_TRUE:允许,GL_FALSE:禁止) | 透明物体渲染时,禁止深度写入(仅进行深度测试),避免遮挡后续透明物体;或仅需要深度测试无需更新深度缓冲时使用 |
| 深度测试(Depth) | 设置深度范围(归一化深度值映射) | glDepthRange(0.0f, 1.0f) | - `nearVal`:近平面对应的归一化深度值(0.0~1.0)- `farVal`:远平面对应的归一化深度值(0.0~1.0) | 自定义深度值的映射范围,适用于特殊深度测试场景(如多通道渲染的深度叠加) |
| 深度测试(Depth) | 设置深度裁剪范围(近/远平面) | glDepthRangeIndexed(0, 0.0f, 1.0f) | - `index`:视口索引(多视口渲染时)- `nearVal/farVal`:近/远平面的归一化深度值 | 多视口渲染场景中,为不同视口设置独立的深度裁剪范围,适配多相机视角 |
| 深度测试(Depth) | 启用/禁用深度测试 | glEnable(GL_DEPTH_TEST) / glDisable(GL_DEPTH_TEST) | - `cap`:要启用/禁用的功能,此处固定为 GL_DEPTH_TEST | 3D 场景渲染时启用(解决遮挡),2D 场景/透明物体渲染时可禁用 |
| 视口变换(Viewport) | 设置渲染视口大小和位置 | glViewport(0, 0, 800, 600) | - `x`:视口左下角 x 坐标- `y`:视口左下角 y 坐标- `width`:视口宽度- `height`:视口高度 | 窗口大小变化时更新,定义 OpenGL 渲染结果映射到窗口的区域 |
| 数据传输 | 缓冲稀疏存储启用 | glBufferStorage(bufID,size,NULL,GL_SPARSE_STORAGE_BIT) | 为缓冲启用稀疏存储,仅分配实际使用的内存,节省GPU内存 | 超大尺寸缓冲(如地形顶点)中,使用稀疏存储,仅加载可视区域数据 |
| 数据传输 | 纹理数据压缩(GPU端) | glCompressedTextureSubImage2D(texID,0,0,0,256,256,GL_COMPRESSED_RGBA_DXT5,size,data) | DSA模式无绑定更新压缩纹理数据,参数同glCompressedTexSubImage2D | GPU端直接更新压缩纹理数据,减少内存占用和传输带宽 |
| 数据传输 | 缓冲数据拷贝(GPU端) | glCopyNamedBufferSubData(srcBufID, dstBufID,0,0,sizeof(float)*1024) | DSA模式无绑定,在两个GPU缓冲间直接拷贝数据,无需CPU中转 | 快速拷贝顶点/实例/纹理数据,适用于缓冲数据备份、多缓冲切换 |
| 数据传输 | 刷新缓冲映射区域 | glFlushMappedNamedBufferRange(bufID,0,size) | 刷新持久化映射的缓冲区域,通知GPU数据已更新 | 异步更新缓冲数据后,刷新映射区域,保证GPU能读取到最新数据 |
| 数据传输 | 查询缓冲映射状态 | GLint mapped; glGetBufferParameteriv(bufID, GL_BUFFER_MAPPED, &mapped) | - 查询缓冲是否处于映射状态,避免重复映射或错误解除映射 | 调试时验证缓冲映射状态,排查数据传输中的映射相关错误 |
| 数据传输 | 设置缓冲映射持久化+连贯 | glMapNamedBufferRange(bufID, 0, size, GL_MAP_PERSISTENT_BIT | GL_MAP_COHERENT_BIT | GL_MAP_WRITE_BIT) | - 持久化:长期映射不解除;连贯:CPU/GPU数据自动同步,无需刷新 | 高频更新的缓冲(如粒子位置),使用持久化连贯映射,最大化数据传输效率 |
| 数据传输 | 缓冲异步映射(持久化) | glMapNamedBufferRange(bufID,0,size,GL_MAP_PERSISTENT_BIT|GL_MAP_WRITE_BIT) | 持久化映射缓冲,避免重复映射/解映射的开销,实现高效异步数据更新 | 高频更新的顶点/实例缓冲,使用持久化异步映射,提升数据传输效率 |
| 数据传输 | 缓冲数据重分配 | glNamedBufferData(bufID,newSize,NULL,GL_DYNAMIC_DRAW) | DSA无绑定重新分配缓冲大小,保留原有使用提示,适配动态数据量变化 | 粒子系统、动态顶点数据中,缓冲数据量变化时,无需重新创建缓冲 |
| 数据传输 | 纹理稀疏存储映射 | glTexturePageCommitmentARB(texID,0,0,0,0,256,256,1,GL_TRUE) | 为稀疏纹理提交指定页的内存,实现纹理数据的按需加载 | 超大尺寸PBR环境贴图/地形纹理中,按需加载可视区域的纹理页,节省内存 |
| 通用操作 | 获取OpenGL错误码 | GLenum err = glGetError() | 返回当前OpenGL错误码(GL_NO_ERROR为无错误) | 开发调试时,实时检测OpenGL调用错误,快速定位代码中的API使用问题 |
| 通用操作 | 清理颜色缓冲 | GLfloat clearCol[]={0.1f,0.1f,0.1f,1.0f};glClearBufferfv(GL_COLOR,0,clearCol) | 精准清理指定颜色附件的缓冲,支持浮点颜色值,适配HDR帧缓冲 | 渲染帧开始前,清理颜色缓冲,避免上一帧画面残留 |
| 通用操作 | 获取着色器统一变量位置 | GLint loc=glGetUniformLocation(programID,"uModelMat") | - `program`:程序ID- `name`:统一变量名 | 在C#/OpenTK中获取着色器统一变量位置,实现CPU到GPU的参数传递 |
| 通用操作 | 设置视口大小 | glViewport(0,0,width,height) | - `x/y`:视口左上角- `widthheight`:视口宽高 | 窗口大小变化、分屏渲染时,调整OpenGL视口,匹配渲染区域尺寸 |
| 同步对象 | 销毁同步对象 | glDeleteSync(syncObj) | - `sync`:同步对象句柄 | 同步对象使用完毕后销毁,释放GPU同步资源,避免内存泄漏 |
| 同步对象 | 带超时等待同步对象 | GLenum status = glClientWaitSync(syncObj,0,100000000) | - `timeout`:超时时间(纳秒)返回:同步状态(已触发超时等) | 非阻塞等待GPU同步,设置超时时间,避免程序因GPU卡死而无响应 |
| 同步对象 | 查询同步对象超时状态 | GLenum status=glGetSynciv(syncObj,GL_SYNC_TIMEOUT_STATUS,1,NULL,NULL) | 查询同步对象是否因超时而终止,排查GPU执行超时问题 | 性能调优时,定位GPU执行耗时过长的阶段,优化对应渲染逻辑 |
| 同步对象 | 查询同步对象状态 | GLint syncStatus; glGetSynciv(syncObj, GL_SYNC_STATUS, 1, NULL, &syncStatus) | - `sync`:同步对象- `pname`:查询参数(GL_SYNC_STATUS等) | 非阻塞查询同步对象状态,避免CPU无限等待,提升程序响应性 |
| 同步对象 | 创建条件同步对象 | GLsync sync=glCreateSync(GL_SYNC_CONDITION,GL_SYNC_GPU_COMMANDS_COMPLETE) | 创建带条件的同步对象,仅当指定GPU条件满足时触发 | 多阶段渲染中,实现GPU阶段间的条件同步,避免无效等待 |
| 同步对象 | 创建同步对象 | GLsync syncObj = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE,0) | - `condition`:同步条件- `flags`:同步标志(0为默认) | 创建GPU命令完成同步对象,实现CPU与GPU之间的同步,避免数据竞争 |
| 同步对象 | 等待同步对象触发 | glWaitSync(syncObj,0,GL_TIMEOUT_IGNORED) | - `sync`:同步对象- `timeout`:等待超时(忽略则无限等待) | CPU等待GPU完成指定命令后再继续执行,适用于GPU数据读取前的同步 |
| 同步对象(Sync Object) | 删除同步对象 | glDeleteSync(sync) | - `sync`:要删除的同步对象句柄 | 同步完成后,删除同步对象释放资源,避免内存泄漏 |
| 同步对象(Sync Object) | 获取同步对象的状态信息 | GLint syncStatus; glGetSynciv(sync, GL_SYNC_STATUS, 1, NULL, &syncStatus) | - `sync`:同步对象句柄- `pname`:查询参数(如GL_SYNC_STATUS、GL_SYNC_CONDITION)- `bufSize`:结果缓冲区大小- `length`:实际结果长度(NULL忽略)- `params`:存储结果的指针 | 调试同步逻辑时,查询同步对象的当前状态(如是否已触发),验证同步是否正常工作 |
| 同步对象(Sync Object) | 创建同步对象(用于CPU与GPU同步) | GLsync sync = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0) | - `condition`:同步条件(固定为GL_SYNC_GPU_COMMANDS_COMPLETE,GPU命令完成时触发)- `flags`:同步标志(0为默认,无特殊标志) | CPU需要等待GPU完成特定渲染命令时使用(如读取帧缓冲数据前,确保GPU渲染完成) |
| 同步对象(Sync Object) | 等待同步对象触发 | glWaitSync(sync, 0, GL_TIMEOUT_IGNORED) | - `sync`:同步对象句柄- `flags`:0为默认- `timeout`:等待超时时间(GL_TIMEOUT_IGNORED表示无限等待) | CPU阻塞等待GPU完成命令,确保后续CPU操作(如读取像素)使用的是最新渲染结果 |
| 统一变量(Uniform) | 获取着色器程序中统一变量的位置 | GLint uModelLoc = glGetUniformLocation(shaderProgram, "uModel") | - `program`:着色器程序对象ID- `name`:统一变量的名称字符串(需与着色器中定义完全一致) | 向着色器传递全局数据(如模型矩阵、视图矩阵、颜色常量)前,获取变量在程序中的位置索引 |
| 统一变量(Uniform) | 设置float类型统一变量值 | glUniform1f(uAlphaLoc, 0.5f) | - `location`:统一变量位置索引- `v0`:float类型的变量值 | 向着色器传递单个浮点数据(如透明度、光照强度、缩放系数等) |
| 统一变量(Uniform) | 设置int类型统一变量值 | glUniform1i(uTexUnitLoc, 1) | - `location`:统一变量位置索引- `v0`:int类型的变量值 | 向着色器传递单个整数数据(如纹理单元索引、开关状态、采样模式等) |
| 统一变量(Uniform) | 设置vec3类型统一变量值 | glUniform3f(uLightPosLoc, 5.0f, 5.0f, 5.0f) | - `location`:统一变量位置索引- `v0v1/v2`:vec3的x/y/z分量值 | 向着色器传递三维向量数据(如光源位置、物体颜色、法向量等) |
| 统一变量(Uniform) | 设置4x4矩阵类型的统一变量值 | glUniformMatrix4fv(uModelLoc, 1, GL_FALSE, glm::value_ptr(modelMat)) | - `location`:统一变量位置索引(由glGetUniformLocation获取)- `count`:要设置的矩阵数量(1表示单个矩阵)- `transpose`:是否转置矩阵(GL_FALSE:不转置,GL_TRUE:转置,通常用GL_FALSE)- `value`:矩阵数据的指针(需是连续的浮点数组) | 向着色器传递模型、视图、投影等矩阵数据,实现物体的空间变换和视角控制 |
| 纹理采样 | 设置采样器各向异性过滤(DSA) | glSamplerParameterf(samplerID, GL_TEXTURE_MAX_ANISOTROPY, 16.0f) | DSA模式无绑定设置,参数同glSamplerParameterf | 为采样器开启高等级各向异性过滤,提升倾斜纹理的采样质量,且不影响纹理本身 |
| 纹理采样 | 设置采样器LOD范围 | glSamplerParameterf(samplerID,GL_TEXTURE_LOD_BIAS,-0.5f) | 设置采样器的LOD偏移,调整纹理mipmap采样层级 | PBR渲染中,微调纹理LOD采样,提升细节纹理的显示效果 |
| 纹理操作 | 设置纹理边界颜色 | float borderColor[]={1.0f,0.0f,0.0f,1.0f}; glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, borderColor) | - `params`:4个float的RGBA边界颜色值 | 纹理环绕方式为GL_CLAMP_TO_BORDER时,定义纹理边界的颜色,适配边框渲染需求 |
| 纹理操作 | 复制纹理子区域(DSA) | glCopyImageSubData(srcTexID, GL_TEXTURE_2D,0,0,0,0, dstTexID,GL_TEXTURE_2D,0,0,0,0,256,256,1) | DSA原生方法,无绑定在两个纹理间复制数据,同基础glCopyImageSubData | 无需绑定纹理,直接在GPU端复制纹理数据,适配批量纹理数据迁移 |
| 纹理操作 | DSA-设置采样器参数 | glSamplerParameteri(samplerID, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE) | DSA原生方法,无绑定设置采样器参数,同基础glSamplerParameteri | 批量配置采样器对象时,无绑定设置参数,提升配置效率 |
| 纹理操作 | 创建纹理缓冲对象(TBO) | glTexBuffer(GL_TEXTURE_BUFFER,GL_RGBA32F,texBufferID) | - `target`:GL_TEXTURE_BUFFER- `internalformat`:内部格式- `buffer`:缓冲ID | 将缓冲绑定为纹理,着色器中通过纹理采样访问大尺寸数据(如顶点列表) |
| 纹理操作 | 创建纹理缓冲视图(TBV) | glTexBufferRange(GL_TEXTURE_BUFFER,GL_RGBA32F,texBufferID,0,sizeof(float)*4096) | - `offset/size`:缓冲内偏移和大小其他同glTexBuffer | 将缓冲局部区域绑定为纹理,实现单缓冲多纹理视图,提升内存利用率 |
| 纹理操作 | 创建纹理压缩格式视图 | glTextureView(compressedTexView, GL_TEXTURE_2D, compressedTexID, GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, 0, 1, 0, 1) | 为压缩纹理创建视图,适配不同压缩格式的纹理复用,提升兼容性 | 多平台适配时,为不同压缩格式的纹理创建统一视图,简化渲染逻辑 |
| 纹理操作(Texture) | 设置纹理边框颜色 | float borderColor[] = {1.0f, 1.0f, 0.0f, 1.0f}; glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, borderColor) | - `target`:纹理类型(同glBindTexture的target参数)- `pname`:固定为GL_TEXTURE_BORDER_COLOR- `params`:4个float组成的颜色数组(RGBA,范围0.0~1.0) | 当纹理环绕方式设为GL_CLAMP_TO_BORDER时,定义纹理坐标外区域的填充颜色 |
| 纹理操作(Texture) | 绑定纹理到指定纹理单元 | glActiveTexture(GL_TEXTURE0 + 1) | - `texture`:纹理单元标识(完整可选值:GL_TEXTURE0~GL_TEXTUREn,n通常≥31,代表不同纹理单元) | 多纹理渲染时,激活不同纹理单元并绑定对应纹理,实现多纹理混合(如漫反射+高光纹理) |
| 纹理操作(Texture) | 绑定纹理对象到指定纹理单元 | glBindTexture(GL_TEXTURE_2D, textureID) | - `target`:纹理类型(完整可选值):✅ GL_TEXTURE_1D:一维纹理(单方向像素序列)✅ GL_TEXTURE_2D:二维纹理(图片类常规纹理)✅ GL_TEXTURE_3D:三维纹理(体积纹理,如3D模型体素)✅ GL_TEXTURE_1D_ARRAY:一维纹理数组✅ GL_TEXTURE_2D_ARRAY:二维纹理数组✅ GL_TEXTURE_RECTANGLE:矩形纹理(无mipmap)✅ GL_TEXTURE_CUBE_MAP:立方体贴图(天空盒、环境映射)✅ GL_TEXTURE_CUBE_MAP_ARRAY:立方体贴图数组✅ GL_TEXTURE_BUFFER:缓冲区纹理✅ GL_TEXTURE_2D_MULTISAMPLE:2D多重采样纹理✅ GL_TEXTURE_2D_MULTISAMPLE_ARRAY:2D多重采样纹理数组- `texture`:纹理对象 ID(由glGenTextures生成的唯一标识) | 绘制带纹理的物体前,绑定对应的纹理资源 |
| 纹理操作(Texture) | 复制帧缓冲内容到纹理 | glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, width, height) | - `target`:纹理类型- `level`:mipmap层级- `xoffsetyoffset`:纹理内偏移量- `xy`:帧缓冲内起始坐标- `widthheight`:复制区域尺寸 | 将当前帧缓冲的指定区域直接复制到纹理(如实现纹理截图、动态纹理生成) |
| 纹理操作(Texture) | 删除纹理对象 | glDeleteTextures(1, &textureID) | - `n`:要删除的纹理数量- `textures`:要删除的纹理ID数组/指针 | 纹理不再使用时,释放GPU纹理内存,避免内存泄漏(如场景切换时删除旧场景纹理) |
| 纹理操作(Texture) | 销毁纹理视图 | glDeleteTextures(1, &texViewID) | - `n`:要删除的纹理视图数量- `textures`:纹理视图ID数组指针 | 纹理视图不再使用时,释放其标识资源(父纹理数据不受影响),避免内存泄漏 |
| 纹理操作(Texture) | 生成纹理的mipmap层级 | glGenerateMipmap(GL_TEXTURE_2D) | - `target`:纹理类型(同glBindTexture的target参数) | 纹理初始化后自动生成各级mipmap,提升纹理缩小渲染时的性能和画质 |
| 纹理操作(Texture) | 生成纹理对象ID | glGenTextures(1, &textureID) | - `n`:要生成的纹理对象数量- `textures`:存储生成的纹理ID的数组/指针 | 创建纹理资源的第一步,生成唯一的纹理标识用于后续的纹理绑定、配置操作 |
| 纹理操作(Texture) | 获取纹理的参数信息 | GLint minFilter; glGetTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, &minFilter) | - `target`:纹理类型- `pname`:要查询的纹理参数名- `params`:存储查询结果的指针 | 调试或动态纹理管理时,验证纹理的采样参数、格式等配置是否正确 |
| 纹理操作(Texture) | 将CPU端图像数据上传到纹理对象 | glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, imageData) | - `target`:纹理类型(同glBindTexture的target参数)- `level`:mipmap层级(0为基础层级)- `internalformat`:纹理内部存储格式(如GL_RGBA8:RGBA各8位)- `width`:纹理宽度- `height`:纹理高度- `border`:边框宽度(必须为0)- `format`:源图像数据格式(完整可选值:✅ GL_RED、✅ GL_GREEN、✅ GL_BLUE、✅ GL_RGB、✅ GL_BGR、✅ GL_RGBA、✅ GL_BGRA等)- `type`:源图像数据类型(完整可选值:✅ GL_BYTE、✅ GL_UNSIGNED_BYTE、✅ GL_SHORT、✅ GL_UNSIGNED_SHORT、✅ GL_INT、✅ GL_UNSIGNED_INT、✅ GL_FLOAT、✅ GL_DOUBLE)- `pixels`:CPU端图像数据指针(NULL则仅分配纹理内存) | 创建2D纹理时,将图片等图像数据上传到GPU纹理内存,完成纹理的初始化配置 |
| 纹理操作(Texture) | 设置纹理采样参数 | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR) | - `target`:纹理类型(可选值同glBindTexture的target参数)- `pname`:参数名(核心完整可选值):✅ GL_TEXTURE_MIN_FILTER:纹理缩小过滤方式✅ GL_TEXTURE_MAG_FILTER:纹理放大过滤方式✅ GL_TEXTURE_WRAP_S:S轴(水平)纹理环绕方式✅ GL_TEXTURE_WRAP_T:T轴(垂直)纹理环绕方式✅ GL_TEXTURE_WRAP_R:R轴(深度,3D纹理)环绕方式- `param`:参数值(按pname分类):▶ 过滤方式可选值:GL_NEAREST(邻近采样,清晰但锯齿)、GL_LINEAR(线性采样,模糊但平滑)、GL_NEAREST_MIPMAP_NEAREST、GL_LINEAR_MIPMAP_NEAREST、GL_NEAREST_MIPMAP_LINEAR、GL_LINEAR_MIPMAP_LINEAR(后4种为mipmap相关)▶ 环绕方式可选值:GL_REPEAT(重复)、GL_MIRRORED_REPEAT(镜像重复)、GL_CLAMP_TO_EDGE(夹紧到边缘)、GL_CLAMP_TO_BORDER(夹紧到边框颜色) | 控制纹理的采样方式,解决纹理拉伸/缩小后的模糊/锯齿问题 |
| 纹理操作(Texture) | 设置立方体贴图的无缝采样 | glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE); glEnable(GL_TEXTURE_CUBE_MAP_SEAMLESS) | - `target`:固定为GL_TEXTURE_CUBE_MAP- `pname`:固定为GL_TEXTURE_WRAP_R- `param`:环绕方式;启用时cap为GL_TEXTURE_CUBE_MAP_SEAMLESS | 渲染天空盒或环境映射时,消除立方体贴图6个面交界处的接缝,提升渲染质量 |
| 纹理操作(Texture) | 更新纹理部分区域的数据 | glTexSubImage2D(GL_TEXTURE_2D, 0, 10, 10, 50, 50, GL_RGBA, GL_UNSIGNED_BYTE, subImageData) | - `target`:纹理类型(同glBindTexture的target参数)- `level`:mipmap层级(0为基础层级)- `xoffset`:更新区域左下角x偏移量- `yoffset`:更新区域左下角y偏移量- `width`:更新区域宽度- `height`:更新区域高度- `format`:源图像数据格式(同glTexImage2D的format参数)- `type`:源图像数据类型(同glTexImage2D的type参数)- `pixels`:更新区域的图像数据指针 | 无需重新上传完整纹理,仅更新局部区域(如动态纹理、纹理贴图局部修改) |
| 纹理操作(Texture) | 创建纹理视图(共享纹理数据的子纹理) | GLuint texViewID; glGenTextures(1, &texViewID); glTextureView(texViewID, GL_TEXTURE_2D, parentTexID, GL_RGBA8, 0, 1, 0, 1) | - `texture`:纹理视图ID- `target`:纹理视图目标类型- `origTexture`:父纹理ID(共享数据)- `internalformat`:纹理视图内部格式- `minLevel/maxLevel`:mipmap层级范围- `minLayermaxLayer`:纹理层范围(数组纹理/立方体贴图用) | 无需复制数据,从现有纹理中截取部分层级/图层作为独立纹理使用(如纹理数组的子纹理提取) |
| 纹理过滤 | 设置纹理各向异性过滤阈值 | glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_ANISOTROPY_FILTER, 0.5f) | 阈值范围[0,1],值越低越易触发各向异性过滤 | 控制各向异性过滤的触发条件,平衡渲染质量与性能 |
| 纹理过滤 | 设置mipmap插值模式 | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIPMAP_MODE, GL_LINEAR) | GL_NEAREST(邻近mipmap) / GL_LINEAR(线性插值mipmap) | 控制mipmap层级间的插值方式,提升纹理多级采样的平滑度 |
| 纹理数组操作 | 绑定纹理数组到采样器 | glBindSampler(3, samplerID); glBindTextureUnit(3, texArrayID) | - `unit`:纹理单元索引其他参数同单独纹理绑定 | 纹理数组与采样器解耦绑定,实现多图层纹理共享同一套采样规则 |
| 纹理数组操作 | 为2D纹理数组生成mipmap | glGenerateMipmap(GL_TEXTURE_2D_ARRAY) | - `target`:固定为GL_TEXTURE_2D_ARRAY | 为纹理数组批量生成mipmap,适配多图层纹理的多级采样需求 |
| 细分着色器 | 启用细分着色器阶段 | glEnable(GL_TESS_CONTROL_SHADER); glEnable(GL_TESS_EVALUATION_SHADER) | - `cap`:细分控制/评估着色器阶段标识 | OpenGL3.2+开启细分着色器管线阶段,为曲面细分渲染做准备 |
| 细分着色器 | 设置细分器补丁顶点顺序 | glPatchParameteri(GL_PATCH_VERTEX_ORDER, GL_CW) | - `pname`:固定为GL_PATCH_VERTEX_ORDER- `value`:GL_CW(顺时针)GL_CCW(逆时针) | 定义细分面片的顶点环绕顺序,确保细分后的曲面法线方向正确 |
| 细分着色器 | 设置细分器输出模式 | glProgramParameteri(program,GL_TESS_GEN_MODE,GL_TESS_GEN_QUADS) | - `program`:程序ID- `value`:输出模式(QUADS/TRIANGLES/ISOLINES) | 定义细分着色器的输出图元类型,适配不同曲面的细分需求 |
| 细分着色器 | 设置细分器最大细分级别 | glUniform1f(glGetUniformLocation(program,"uTessLevel"), 8.0f) | 通过统一变量传递细分级别,替代固定默认值,实现动态细分 | 运行时动态调整曲面细分精度,平衡渲染质量与性能(如近距离高细分,远距离低细分) |
| 细分着色器(Tessellation) | 绘制细分面片 | glDrawArrays(GL_PATCHES, 0, 4) | - `mode`:固定为GL_PATCHES- `first`:起始顶点索引- `count`:面片顶点总数(需是GL_PATCH_VERTICES的整数倍) | 向细分着色器提交面片数据,触发细分过程(将低精度面片细分为高精度面片) |
| 细分着色器(Tessellation) | 设置细分控制着色器的输出面片类型 | glPatchParameteri(GL_PATCH_VERTICES, 4) | - `pname`:固定为GL_PATCH_VERTICES- `value`:每个面片的顶点数量(如4为四边形面片) | 使用细分着色器前,定义输入面片的顶点数量,适配细分控制着色器的处理逻辑 |
| 线参数(Line Parameter) | 设置线的反走样采样质量 | glHint(GL_LINE_SMOOTH_HINT, GL_NICEST) | - `target`:提示目标(GL_LINE_SMOOTH_HINT/GL_POINT_SMOOTH_HINT等)- `mode`:提示模式(GL_FASTESTGL_NICEST/GL_DONT_CARE) | 提示OpenGL优先保证线反走样的质量(GL_NICEST)或渲染速度(GL_FASTEST) |
| 线图元 | 设置线的抗锯齿宽度范围 | glLineWidth(2.0f); glEnable(GL_LINE_SMOOTH); glHint(GL_LINE_SMOOTH_HINT, GL_NICEST) | 结合线宽和抗锯齿,提升线条渲染质量 | 绘制UI边框、模型轮廓线时,实现宽线抗锯齿,让线条边缘更平滑 |
| 像素操作 | PBO异步读取像素 | glBindBuffer(GL_PIXEL_PACK_BUFFER, pboID); glReadPixels(0,0,800,600,GL_RGBA,GL_UNSIGNED_BYTE,NULL) | 数据写入PBO,CPU异步映射读取,避免阻塞 | 使用PBO实现像素异步读取,提升截图、颜色拾取的效率,避免CPU等待GPU |
| 像素操作 | PBO双缓冲异步像素读写 | glBindBuffer(GL_PIXEL_PACK_BUFFER,pbo[0]); glReadPixels(0,0,w,h,GL_RGBA,GL_UNSIGNED_BYTE,NULL) | 两个PBO交替使用,实现像素异步读取,CPU/GPU并行工作 | 高分辨率截图/视频采集时,双PBO避免CPU等待GPU,提升数据读取效率 |
| 像素操作 | 使用PBO异步写入像素 | glBindBuffer(GL_PIXEL_UNPACK_BUFFER, pboID); glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 512, 512, GL_RGBA, GL_UNSIGNED_BYTE, NULL) | 将PBO中的数据异步传输到纹理,避免CPU等待GPU,提升纹理更新效率 | 动态更新大尺寸纹理时(如视频纹理),使用PBO异步传输,减少卡顿 |
| 像素操作 | 设置像素解包对齐 | glPixelStorei(GL_UNPACK_ALIGNMENT,1) | 设置像素数据解包的字节对齐方式(1/2/4/8),适配非标准对齐的像素数据 | 加载非4字节对齐的像素数据(如单通道8位纹理)时,避免像素偏移、失真 |
| 像素操作 | 设置像素格式转换 | glPixelTransferi(GL_MAP_COLOR, GL_TRUE); glPixelTransferf(GL_RED_SCALE, 2.0f) | 设置像素颜色通道缩放,实现像素数据的实时格式转换 | 读取/绘制像素时,动态调整颜色通道亮度,实现简单的像素级色彩调整 |
| 像素操作 | 设置像素翻转模式 | glPixelZoom(-1.0f, 1.0f) | - `xzoom/yzoom`:x/y方向缩放因子(负值为翻转) | 绘制/读取像素时实现x/y方向的翻转,适配纹理坐标与窗口坐标的方向差异 |
| 像素操作(Pixel Operation) | 设置像素存储模式(控制读取/写入像素的对齐方式) | glPixelStorei(GL_UNPACK_ALIGNMENT, 1) | - `pname`:像素存储参数名(完整可选值):✅ GL_UNPACK_ALIGNMENT(纹理数据写入时的行对齐)、✅ GL_PACK_ALIGNMENT(像素读取时的行对齐)- `param`:参数值(默认4,可设为1、2、4、8,代表每行像素数据的字节对齐数) | 当纹理/像素数据的行字节数不满足默认4字节对齐时(如单通道8位图像),设置对齐数避免数据读取/写入错误 |
| 像素操作(Pixel Operation) | 从帧缓冲读取像素数据到CPU内存 | glReadPixels(0, 0, 800, 600, GL_RGB, GL_UNSIGNED_BYTE, pixelData) | - `x`:读取区域左下角x坐标- `y`:读取区域左下角y坐标- `width`:读取区域宽度- `height`:读取区域高度- `format`:像素数据格式(完整可选值):✅ GL_RED、✅ GL_GREEN、✅ GL_BLUE、✅ GL_RGB、✅ GL_BGR、✅ GL_RGBA、✅ GL_BGRA等- `type`:像素数据类型(可选值同glVertexAttribPointer的type参数)- `pixels`:存储读取像素数据的CPU内存指针 | 实现截图功能、获取帧缓冲渲染结果进行后处理(如CPU端图像分析)、纹理数据读取等场景 |
| 像素缓冲(PBO) | 绑定像素打包缓冲(读取像素用) | glBindBuffer(GL_PIXEL_PACK_BUFFER, pboID) | - `target`:固定为GL_PIXEL_PACK_BUFFER- `buffer`:PBO ID | 从帧缓冲读取像素数据到GPU缓冲(PBO),避免CPU与GPU间的阻塞等待,提升读取效率 |
| 像素缓冲(PBO) | 绑定像素解包缓冲(写入纹理用) | glBindBuffer(GL_PIXEL_UNPACK_BUFFER, pboID) | - `target`:固定为GL_PIXEL_UNPACK_BUFFER- `buffer`:PBO ID | 从GPU缓冲(PBO)向纹理上传数据,无需CPU中转,提升纹理更新效率(如动态纹理流) |
| 性能查询 | 查询绘制调用次数 | glBeginQuery(GL_PRIMITIVES_GENERATED, queryID); glDrawArrays(...); glEndQuery(GL_PRIMITIVES_GENERATED) | GL_PRIMITIVES_GENERATED为生成的图元数量 | 统计GPU生成的图元数量,分析是否存在过度绘制或低效渲染 |
| 性能查询 | 批量开始性能查询 | glBeginQueryIndexed(GL_TIMESTAMP, 0, queryID) | - `target`:查询目标- `index`:查询索引- `id`:查询ID | 为同一查询目标开启多个索引查询,适配多区域性能数据同时采集 |
| 性能查询 | 查询着色器存储缓冲绑定 | GLint ssboID; glGetIntegerv(GL_SHADER_STORAGE_BUFFER_BINDING,&ssboID) | 查询当前绑定的SSBO,验证计算着色器/渲染管线的SSBO配置 | 调试计算着色器时,确认SSBO绑定是否正确,排查数据访问错误 |
| 性能查询 | 查询着色器执行时间 | glQueryCounter(q1,GL_TIMESTAMP); glDrawArrays(...); glQueryCounter(q2,GL_TIMESTAMP) | 计算两个时间戳差值,得到着色器执行耗时 | 精准统计顶点/片段着色器的GPU执行时间,定位着色器性能瓶颈 |
| 性能查询 | 查询GPU时间戳 | glQueryCounter(queryID, GL_TIMESTAMP) | - `id`:查询ID- `target`:固定为GL_TIMESTAMP | 获取GPU当前时间戳,计算两个时间戳差值可得GPU执行某段操作的耗时 |
| 性能查询 | 获取查询结果(64位) | GLuint64 elapsedTime; glGetQueryObjectui64v(queryID, GL_QUERY_RESULT, &elapsedTime) | 64位无符号整型结果,适配大数值性能数据(如GPU耗时、顶点数) | 获取高精度64位性能查询结果,避免数值溢出,提升数据准确性 |
| 性能查询(Performance Query) | 开始性能查询 | glBeginQuery(GL_SAMPLES_PASSED, queryID) | - `target`:查询目标(如GL_SAMPLES_PASSED查询通过深度测试的像素数)- `id`:查询对象ID | 标记性能数据的开始采集点,后续渲染操作的相关数据将被记录 |
| 性能查询(Performance Query) | 结束性能查询 | glEndQuery(GL_SAMPLES_PASSED) | - `target`:同glBeginQuery的target参数 | 标记性能数据的结束采集点,停止记录渲染数据 |
| 性能查询(Performance Query) | 生成查询对象ID | GLuint queryID; glGenQueries(1, &queryID) | - `n`:要生成的查询对象数量- `ids`:存储查询ID的数组指针 | 用于查询GPU渲染性能数据(如绘制调用次数、顶点处理数量、渲染时间) |
| 性能查询(Performance Query) | 获取性能查询结果 | GLuint samplesPassed; glGetQueryObjectuiv(queryID, GL_QUERY_RESULT, &samplesPassed) | - `id`:查询对象ID- `pname`:查询参数(GL_QUERY_RESULT获取结果,GL_QUERY_RESULT_AVAILABLE查询是否就绪)- `params`:存储查询结果的指针 | 获取采集的性能数据,用于分析渲染性能瓶颈(如判断是否存在过度绘制) |
| 性能优化 | 设置缓冲数据使用提示 | glBufferData(GL_ARRAY_BUFFER, size, data, GL_STATIC_DRAW) | - `usage`:使用提示(静态/动态/流式读写),帮助GPU优化内存布局 | 根据缓冲数据的更新频率设置使用提示,让GPU进行针对性优化,提升访问效率 |
| 性能优化 | 设置绘制调用批处理大小 | glDrawBatchElements(GL_TRIANGLES,1024,GL_UNSIGNED_INT,0) | - `count`:批处理顶点数,适配GPU批处理硬件 | 批量渲染中,按GPU硬件批处理能力设置绘制数量,提升绘制调用效率 |
| 性能优化 | 启用管线状态缓存 | glEnable(GL_PIPELINE_STATE_CACHE) | 启用GPU管线状态缓存,减少重复状态切换的开销 | 复杂场景渲染时,启用状态缓存,提升频繁切换着色器/纹理的渲染性能 |
| 性能优化 | 启用纹理贴图缓存 | glEnable(GL_TEXTURE_CACHE); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_CACHE_HINT,GL_FASTEST) | 启用GPU纹理贴图缓存,设置缓存优化提示,提升纹理采样速度 | 大纹理/高分辨率渲染中,启用纹理缓存,减少GPU纹理访问延迟 |
| 性能优化 | 启用纹理压缩 | glEnable(GL_TEXTURE_COMPRESSION); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPRESSION_HINT, GL_NICEST) | - `hint`:压缩质量提示(GL_NICEST/GL_FASTEST) | 启用GPU纹理压缩,减少纹理内存占用和传输带宽,提升渲染性能 |
| 性能优化 | 启用顶点缓存预取 | glEnable(GL_VERTEX_CACHE_PREFETCH);glVertexCacheParameteri(GL_VERTEX_CACHE_SIZE,1024) | 启用GPU顶点缓存预取,设置缓存大小,提前加载待渲染顶点数据 | 大顶点数场景(如地形、模型)渲染时,减少GPU顶点访问延迟,提升绘制效率 |
| 性能优化 | 设置纹理压缩质量 | glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_COMPRESSION_QUALITY,90) | 设置纹理压缩的质量百分比(0~100),平衡压缩比与纹理质量 | 移动端/低内存设备中,按需调整纹理压缩质量,节省内存同时保证视觉效果 |
| 渲染缓冲 | DSA-创建渲染缓冲并分配存储 | glNamedRenderbufferStorage(rboID, GL_DEPTH24_STENCIL8, 800, 600) | - `renderbuffer`:RBO ID- 其他参数同glRenderbufferStorage | DSA模式无绑定创建渲染缓冲并分配存储,适配批量RBO创建 |
| 渲染缓冲(RBO) | DSA-查询RBO存储格式 | GLint format;glGetNamedRenderbufferParameteriv(rboID,GL_RENDERBUFFER_INTERNAL_FORMAT,&format) | DSA无绑定查询RBO的深度/模板格式,验证配置是否匹配需求 | 调试MSAA渲染时,确认RBO格式是否支持深度+模板联合采样 |
| 渲染缓冲(RBO) | 查询渲染缓冲参数 | GLint sampleCount; glGetRenderbufferParameteriv(rboID, GL_RENDERBUFFER_SAMPLES, &sampleCount) | - `renderbuffer`:RBO ID- `pname`:查询参数(采样数格式/尺寸等) | 调试时验证RBO的采样数、格式等配置,确保符合MSAA/深度测试需求 |
| 渲染缓冲(RBO) | DSA-调整RBO存储大小 | glNamedRenderbufferStorage(rboID,GL_DEPTH24_STENCIL8,1920,1080) | DSA无绑定重新分配RBO存储,适配窗口大小变化后的深度/模板缓冲 | 窗口分辨率调整时,动态修改RBO尺寸,保证深度/模板测试与视口匹配 |
| 渲染缓冲(RBO) | DSA-创建多重采样RBO | glNamedRenderbufferStorageMultisample(rboID,8,GL_DEPTH24_STENCIL8,1920,1080) | - `renderbuffer`:RBO ID- `samples`:采样数其他同glRenderbufferStorageMultisample | DSA无绑定创建高采样数深度/模板RBO,适配4K/MSAA 8X渲染 |
| 渲染缓冲(Renderbuffer) | 绑定渲染缓冲对象 | glBindRenderbuffer(GL_RENDERBUFFER, rboID) | - `target`:固定为GL_RENDERBUFFER- `renderbuffer`:要绑定的渲染缓冲ID | 配置渲染缓冲存储格式和大小前,需先绑定到上下文 |
| 渲染缓冲(Renderbuffer) | 生成渲染缓冲对象ID | glGenRenderbuffers(1, &rboID) | - `n`:要生成的渲染缓冲数量- `renderbuffers`:存储渲染缓冲ID的数组/指针 | 创建渲染缓冲的第一步,用于帧缓冲的深度、模板附件(不可采样,性能更优) |
| 渲染缓冲(Renderbuffer) | 设置渲染缓冲的存储格式和大小 | glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, 800, 600) | - `target`:固定为GL_RENDERBUFFER- `internalformat`:存储格式(如GL_DEPTH24_STENCIL8、GL_RGBA8)- `width`:渲染缓冲宽度- `height`:渲染缓冲高度 | 为渲染缓冲分配GPU内存,定义存储的数据类型(深度、模板或颜色) |
| 颜色管理(Color Management) | 设置颜色空间转换模式 | glEnable(GL_FRAMEBUFFER_SRGB) | - `cap`:固定为GL_FRAMEBUFFER_SRGB | 启用后,渲染结果将自动从线性颜色空间转换为sRGB颜色空间,实现正确的gamma校正 |
| 颜色管理(Color Management) | 创建sRGB格式纹理 | glTexImage2D(GL_TEXTURE_2D, 0, GL_SRGB8_ALPHA8, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, imageData) | - `internalformat`:固定为GL_SRGB8_ALPHA8(sRGB颜色+Alpha通道)- 其他参数同glTexImage2D | 加载纹理时,自动将sRGB格式的纹理数据转换为线性空间,确保光照计算的正确性 |
| 颜色混合 | 设置混合方程模式 | glBlendEquation(GL_FUNC_ADD) | - `mode`:混合方程(GL_FUNC_ADD/GL_FUNC_SUBTRACT/GL_FUNC_REVERSE_SUBTRACT) | 定义混合颜色的计算方式,如相加、相减,适配不同透明效果(如淡入/淡出、反色混合) |
| 颜色混合 | 为RGB/Alpha设置不同混合方程 | glBlendEquationSeparate(GL_FUNC_ADD, GL_FUNC_REVERSE_SUBTRACT) | - `modeRGB`:RGB通道混合方程- `modeAlpha`:Alpha通道混合方程 | 精细化控制RGB和Alpha通道的混合计算方式,实现复杂透明纹理的渲染 |
| 颜色混合 | 启用混合常量因子 | glBlendFunc(GL_CONSTANT_COLOR, GL_ONE_MINUS_CONSTANT_COLOR) | 混合因子为glBlendColor设置的常量颜色,参数同基础glBlendFunc | 基于固定常量颜色的混合,适用于批量物体的统一颜色叠加(如全局遮罩、颜色滤镜) |
| 颜色混合 | 启用混合预乘Alpha | glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_BLEND_PREMULTIPLIED_ALPHA) | 启用预乘Alpha混合,适配带透明通道的纹理正确混合 | UI/透明材质渲染中,使用预乘Alpha避免透明边缘黑边、色彩失真问题 |
| 颜色混合 | 启用高级混合模式(EXT) | glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA) | EXT_blend_func_separate扩展,为RGB/Alpha设置不同混合因子 | 实现复杂透明效果,如RGB通道混合、Alpha通道单独处理 |
| 颜色混合 | 设置混合精度(浮点) | glBlendFunci(1,GL_ONE,GL_ONE); glEnable(GL_FRAMEBUFFER_FLOAT) | 启用浮点帧缓冲后,混合计算以浮点精度执行,避免精度丢失 | HDR/光追结果合成时,使用浮点混合精度,保证色彩数据完整性 |
| 颜色混合 | 为多缓冲区设置独立混合 | glBlendFuncSeparatei(1,GL_SRC_ALPHA,GL_ONE,GL_ONE,GL_ONE_MINUS_SRC_ALPHA) | - `buf`:缓冲区索引其他参数同glBlendFuncSeparate | MRT渲染中,为每个颜色附件设置独立混合规则,实现精细化色彩输出 |
| 颜色混合 | 启用混合反走样 | glEnable(GL_BLEND_ANTIALIAS);glHint(GL_BLEND_ANTIALIAS_HINT,GL_NICEST) | 启用混合反走样,优化透明物体的边缘混合效果,减少锯齿 | 透明材质、粒子特效渲染时,让混合边缘更平滑,提升画面质感 |
| 颜色混合 | 启用浮点混合精度(核心版) | glEnable(GL_COLOR_BUFFER_FLOAT); glBlendFunc(GL_ONE, GL_ONE) | 启用浮点颜色缓冲后,混合计算以浮点精度执行,保留HDR色彩细节 | HDR渲染中,实现高精度颜色混合,避免亮部细节丢失(如光晕叠加) |
| 颜色混合 | 启用HDR混合扩展 | glEnable(GL_EXT_blend_func_extended); glBlendFuncSeparatei(0,GL_SRC_ALPHA,GL_ONE,GL_ONE,GL_ONE) | 为单个绘制缓冲区设置独立混合因子,适配HDR多缓冲区渲染 | HDR MRT渲染时,为不同颜色附件设置不同混合规则,实现精细化色彩处理 |
| 颜色混合 | 设置混合色调映射 | glEnable(GL_FRAMEBUFFER_HDR); glBlendEquation(GL_MIN) | HDR帧缓冲中使用最小混合,限制像素亮度,实现色调映射 | HDR渲染时,通过混合方程实现简单的色调映射,避免画面过曝 |
| 颜色混合 | 设置混合颜色常量 | GLfloat blendColor[]={0.2f,0.5f,0.8f,1.0f};glBlendColor(blendColor[0],blendColor[1],blendColor[2],blendColor[3]) | 设置混合计算的常量颜色,配合GL_CONSTANT_COLOR混合因子使用 | UI遮罩、颜色叠加时,使用常量混合色实现固定颜色的淡入淡出效果 |
| 颜色混合(Blending) | 设置颜色混合公式 | glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) | - `sfactor`:源颜色因子(核心完整可选值):✅ GL_ZERO:0✅ GL_ONE:1✅ GL_SRC_COLOR:源颜色值✅ GL_ONE_MINUS_SRC_COLOR:1 - 源颜色值✅ GL_DST_COLOR:目标颜色值✅ GL_ONE_MINUS_DST_COLOR:1 - 目标颜色值✅ GL_SRC_ALPHA:源Alpha值✅ GL_ONE_MINUS_SRC_ALPHA:1 - 源Alpha值✅ GL_DST_ALPHA:目标Alpha值✅ GL_ONE_MINUS_DST_ALPHA:1 - 目标Alpha值- `dfactor`:目标颜色因子(可选值同上) | 透明物体渲染(如玻璃、粒子),定义源像素和目标像素的颜色混合规则 |
| 颜色混合(Blending) | 设置分离的颜色混合因子 | glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ZERO) | - `srcRGB`:RGB通道的源因子- `dstRGB`:RGB通道的目标因子- `srcAlpha`:Alpha通道的源因子- `dstAlpha`:Alpha通道的目标因子(因子可选值同glBlendFunc) | 需要对RGB通道和Alpha通道使用不同混合规则时(如RGB混合透明,Alpha通道保持最大值) |
| 颜色混合(Blending) | 启用/禁用颜色混合 | glEnable(GL_BLEND) / glDisable(GL_BLEND) | - `cap`:要启用/禁用的功能,此处固定为 GL_BLEND | 绘制透明/半透明物体时启用,不透明物体绘制时禁用(提升性能) |
| 颜色掩码(Color Mask) | 设置颜色通道的写入掩码 | glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE) | - `red`:是否允许写入红色通道(GL_TRUE/GL_FALSE)- `green`:是否允许写入绿色通道- `blue`:是否允许写入蓝色通道- `alpha`:是否允许写入Alpha通道 | 禁止特定颜色通道写入(如仅渲染灰度图时禁用G/B通道),或临时屏蔽颜色写入 |
| 硬件实例化 | 实例化数组绘制(无索引) | glDrawArraysInstanced(GL_TRIANGLES, 0, 36, 100) | - `mode`:图元类型- `first`:起始顶点索引- `count`:单实例顶点数- `instancecount`:实例数量 | 无索引缓冲时,直接通过顶点数组实现多实例渲染,适用于简单几何体批量渲染 |
| 硬件实例化 | 实例化多图元渲染 | glDrawArraysInstancedBaseInstance(GL_TRIANGLES,0,36,50,10) | - `baseinstance`:实例数据起始索引其他参数同glDrawArraysInstanced | 多实例渲染时,从实例数组指定位置开始读取数据,实现实例分块渲染 |
| 硬件实例化 | 实例化索引绘制(基础版) | glDrawElementsInstanced(GL_TRIANGLES,36,GL_UNSIGNED_INT,0,200) | - `count`:单实例索引数- `instancecount`:实例数量其他同glDrawElements | 带索引缓冲的基础实例化渲染,适用于复杂几何体批量渲染(如树木、建筑) |
| 硬件实例化 | 实例化绘制(带索引+基顶点+基实例) | glDrawElementsInstancedBaseVertexBaseInstance(GL_TRIANGLES, 36, GL_UNSIGNED_INT, 0, 150, 5, 20) | - `basevertex`:顶点基索引- `baseinstance`:实例基索引其他同glDrawElementsInstanced | 复杂批量渲染中,从顶点/实例数组的指定位置开始渲染,实现分块实例化 |
| 硬件实例化 | 实例化间接绘制 | glDrawElementsInstancedIndirect(GL_TRIANGLES,GL_UNSIGNED_INT,0) | 通过缓冲存储绘制参数,实现运行时动态调整实例数量、索引范围 | 海量实例渲染(如植被、粒子)时,动态修改实例参数,无需重新调用绘制API |
| 硬件实例化 | 实例化多图元批量渲染 | glMultiDrawElementsInstanced(GL_TRIANGLES,counts,GL_UNSIGNED_INT,offsets,drawCount,instanceCounts) | - `counts/offsets`:多图元索引数/偏移数组- `drawCount`:绘制次数- `instanceCounts`:各图元实例数数组 | 海量物体批量渲染中,一次调用渲染多种图元的多实例,最大化减少绘制调用 |
| 硬件实例化 | 设置实例化顶点属性步长 | glVertexAttribDivisor(4, 1) | - `index`:顶点属性索引- `divisor`:实例步长(1为每实例更新一次) | 将指定顶点属性标记为实例属性,每渲染一个实例更新一次数据(如实例位置、旋转) |
| 硬件实例化 | 批量设置实例属性步长 | glVertexAttribDivisorArrayv(4, 2, (GLint[]){1,1}) | - `first`:起始属性索引- `count`:属性数量- `divisors`:步长数组 | 一次性为多个顶点属性设置实例步长,简化多实例属性的配置流程 |
| 原子操作(Atomic Operation) | 原子递增缓冲中的整数 | // 着色器中调用:atomicAdd(buffer[0], 1) | - `address`:缓冲数据的地址- `value`:要递增的值 | 多线程着色器(如计算着色器)中,安全地修改共享数据(如统计像素数量、碰撞检测计数) |
| 着色器操作(Shader) | 获取着色器编译日志 | char infoLog[512]; glGetShaderInfoLog(shaderID, 512, NULL, infoLog) | - `shader`:着色器对象ID- `maxLength`:日志缓冲区最大长度- `length`:实际日志长度(NULL则忽略)- `infoLog`:存储日志的字符数组指针 | 着色器编译失败时,读取详细错误信息(如语法错误、变量未定义),辅助调试 |
| 着色器操作(Shader) | 编译着色器源代码 | glCompileShader(shaderID) | - `shader`:要编译的着色器对象 ID(由glCreateShader生成) | 着色器源码绑定后,编译源码生成可执行的着色器程序 |
| 着色器操作(Shader) | 创建着色器对象 | glCreateShader(GL_VERTEX_SHADER) | - `type`:着色器类型(完整可选值):✅ GL_VERTEX_SHADER:顶点着色器✅ GL_FRAGMENT_SHADER:片段(像素)着色器✅ GL_GEOMETRY_SHADER:几何着色器✅ GL_TESS_CONTROL_SHADER:细分控制着色器✅ GL_TESS_EVALUATION_SHADER:细分评估着色器✅ GL_COMPUTE_SHADER:计算着色器 | 构建着色器程序的第一步,创建对应类型的着色器对象 |
| 着色器操作(Shader) | 删除着色器对象 | glDeleteShader(shaderID) | - `shader`:要删除的着色器对象ID | 着色器程序链接完成后,删除单个着色器对象(已无用途),释放资源 |
| 着色器操作(Shader) | 获取着色器二进制代码 | GLint binSize; glGetShaderiv(shaderID, GL_SHADER_BINARY_LENGTH, &binSize); char* binData = new char[binSize]; glGetShaderBinary(1, &shaderID, binSize, NULL, binData) | - `count`:着色器数量- `shaders`:着色器ID数组- `bufSize`:二进制缓冲区大小- `binaryFormat`:二进制格式(NULL忽略)- `binary`:存储二进制代码的缓冲区 | 预编译着色器为二进制格式,后续程序启动时直接加载二进制代码,提升着色器编译速度 |
| 着色器操作(Shader) | 获取着色器编译状态信息 | GLint compileStatus; glGetShaderiv(shaderID, GL_COMPILE_STATUS, &compileStatus) | - `shader`:着色器对象ID- `pname`:查询参数(完整可选值):✅ GL_COMPILE_STATUS(编译状态)、✅ GL_INFO_LOG_LENGTH(日志长度)、✅ GL_SHADER_TYPE(着色器类型)- `params`:存储查询结果的指针 | 着色器编译后,检查是否编译成功,为调试编译错误提供依据 |
| 着色器操作(Shader) | 从二进制代码创建着色器 | glShaderBinary(1, &shaderID, binaryFormat, binData, binSize) | - `count`:着色器数量- `shaders`:着色器ID数组- `binaryFormat`:二进制格式(与获取时一致)- `binary`:着色器二进制代码- `length`:二进制代码长度 | 程序启动时跳过源码编译步骤,直接加载预编译的着色器二进制代码,加速程序启动 |
| 着色器程序 | 释放着色器对象 | glDetachShader(program, shaderID); glDeleteShader(shaderID) | 先从程序解绑着色器,再删除,避免资源泄漏 | 着色器程序链结完成后,删除无用的着色器对象,释放GPU内存 |
| 着色器程序(Shader Program) | 获取着色器程序链接日志 | char programLog[512]; glGetProgramInfoLog(shaderProgram, 512, NULL, programLog) | - `program`:着色器程序对象ID- `maxLength`:日志缓冲区最大长度- `length`:实际日志长度(NULL则忽略)- `infoLog`:存储日志的字符数组指针 | 着色器程序链接失败时,读取错误信息(如顶点与片段着色器变量类型不匹配) |
| 着色器程序(Shader Program) | 将着色器对象附加到着色器程序 | glAttachShader(shaderProgram, vertexShaderID) | - `program`:着色器程序对象ID- `shader`:要附加的着色器对象ID(顶点/片段等着色器) | 着色器程序链接前,将编译好的各个着色器模块(如顶点+片段着色器)附加到程序中,形成完整渲染管线 |
| 着色器程序(Shader Program) | 创建着色器程序对象 | glCreateProgram() | 无参数 | 用于链接多个编译好的着色器(顶点+片段)为完整的渲染程序 |
| 着色器程序(Shader Program) | 删除着色器程序对象 | glDeleteProgram(shaderProgram) | - `program`:要删除的着色器程序ID | 场景切换或程序结束时,删除不再使用的着色器程序,释放GPU程序内存 |
| 着色器程序(Shader Program) | 获取着色器程序链接状态 | GLint linkStatus; glGetProgramiv(shaderProgram, GL_LINK_STATUS, &linkStatus) | - `program`:着色器程序对象ID- `pname`:查询参数(完整可选值):✅ GL_LINK_STATUS(链接状态)、✅ GL_INFO_LOG_LENGTH(日志长度)、✅ GL_ATTACHED_SHADERS(附加的着色器数量)- `params`:存储查询结果的指针 | 着色器程序链接后,检查是否链接成功(如着色器接口不匹配问题) |
| 着色器程序(Shader Program) | 获取着色器程序的验证状态 | GLint validateStatus; glGetProgramiv(shaderProgram, GL_VALIDATE_STATUS, &validateStatus) | - `program`:着色器程序ID- `pname`:固定为GL_VALIDATE_STATUS- `params`:存储验证状态的指针 | 验证着色器程序后,检查验证结果(GL_TRUE为通过),排查程序在当前硬件上的兼容性问题 |
| 着色器程序(Shader Program) | 链接着色器程序,生成可执行的GPU程序 | glLinkProgram(shaderProgram) | - `program`:着色器程序对象ID | 所有着色器附加完成后,链接程序以解析着色器间的接口(如顶点着色器输出与片段着色器输入的匹配),生成可执行代码 |
| 着色器程序(Shader Program) | 激活指定的着色器程序 | glUseProgram(shaderProgram) | - `program`:着色器程序对象ID(0表示禁用所有着色器程序) | 渲染物体前激活对应的着色器程序,后续的绘制操作将使用该程序的渲染逻辑 |
| 着色器程序(Shader Program) | 验证着色器程序的可执行性 | glValidateProgram(shaderProgram) | - `program`:着色器程序ID | 链接完成后,验证程序是否能在当前硬件上正确执行(如是否支持程序中的扩展功能) |
| 着色器存储缓冲(SSBO) | 绑定着色器存储缓冲到指定绑定点 | glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, ssboID) | - `target`:固定为GL_SHADER_STORAGE_BUFFER- `index`:绑定点索引(与着色器中binding匹配)- `buffer`:着色器存储缓冲ID | 着色器(如计算着色器)需要读写大量数据时,通过SSBO实现GPU与GPU间的数据共享 |
| 帧缓冲 | 启用帧缓冲多重采样 | glEnable(GL_MULTISAMPLE); glBindFramebuffer(GL_FRAMEBUFFER, msaaFboID) | GL_MULTISAMPLE为全局启用,配合多重采样FBO实现全屏抗锯齿 | 为离屏渲染帧缓冲启用多重采样,实现抗锯齿后再解析到普通纹理 |
| 帧缓冲 | DSA-检查帧缓冲完整性 | GLenum status = glCheckNamedFramebufferStatus(fboID, GL_FRAMEBUFFER) | - `framebuffer`:FBO ID- `target`:帧缓冲目标返回值:同glCheckFramebufferStatus | DSA模式无绑定检查FBO完整性,适配批量FBO验证,减少状态切换 |
| 帧缓冲 | 设置帧缓冲颜色编码 | glFramebufferParameteri(GL_FRAMEBUFFER, GL_FRAMEBUFFER_SRGB, GL_TRUE) | 启用后,帧缓冲自动进行sRGB线性空间转换 | 为帧缓冲启用sRGB颜色编码,实现正确的gamma校正,提升色彩还原度 |
| 帧缓冲 | 绑定帧缓冲附件图层 | glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, texArrayID,0,8) | - `layer`:纹理数组/立方体贴图层索引其他参数同glFramebufferTexture | 将纹理数组的单个图层绑定为FBO颜色附件,实现单图层离屏渲染 |
| 帧缓冲 | 设置帧缓冲视口(多视口) | glFramebufferViewport(fboID, 0, 0, 0, 400, 300) | - `framebuffer`:FBO ID- `index`:视口索引- `xy/width/height`:视口参数 | 为指定FBO设置独立视口,多FBO渲染时无需全局修改视口,避免状态污染 |
| 帧缓冲 | 绑定渲染缓冲到FBO(DSA) | glNamedFramebufferRenderbuffer(fboID, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, rboID) | 参数同glFramebufferRenderbuffer,仅首参为FBO ID | DSA模式无绑定为FBO绑定深度/模板渲染缓冲附件,提升FBO配置效率 |
| 帧缓冲 | 绑定帧缓冲附件(DSA) | glNamedFramebufferTexture(fboID, GL_COLOR_ATTACHMENT0, texID, 0) | - `framebuffer`:FBO ID- `attachment`:附件类型- `texture`:纹理ID- `level`:mipmap层级 | DSA模式无绑定为FBO绑定纹理附件,减少状态切换,适配批量FBO配置 |
| 帧缓冲(FBO) | 绑定帧缓冲对象 | glBindFramebuffer(GL_FRAMEBUFFER, fboID) | - `target`:帧缓冲目标(完整可选值):✅ GL_FRAMEBUFFER:常规帧缓冲(默认)✅ GL_READ_FRAMEBUFFER:读取用帧缓冲✅ GL_DRAW_FRAMEBUFFER:绘制用帧缓冲- `framebuffer`:要绑定的帧缓冲ID(0为默认窗口帧缓冲) | 离屏渲染(如阴影贴图、后处理)时,绑定自定义帧缓冲替代默认窗口缓冲 |
| 帧缓冲(FBO) | 解析多重采样帧缓冲 | glBlitFramebuffer(0,0,800,600,0,0,800,600,GL_COLOR_BUFFER_BIT,GL_LINEAR) | 将MSAA FBO的颜色缓冲解析到普通FBO,实现抗锯齿后处理 | 多重采样离屏渲染后,解析为普通纹理,适配后处理管线 |
| 帧缓冲(FBO) | 复制FBO深度缓冲到纹理 | glBlitFramebuffer(0,0,w,h,0,0,w,h,GL_DEPTH_BUFFER_BIT,GL_NEAREST) | 仅复制FBO的深度缓冲数据到目标纹理,实现深度图提取 | 阴影映射、后期深度检测中,快速提取渲染结果的深度数据,无需重新渲染 |
| 帧缓冲(FBO) | 检查帧缓冲完整性 | glCheckFramebufferStatus(GL_FRAMEBUFFER) | - `target`:帧缓冲目标(同glBindFramebuffer的target) | 自定义帧缓冲配置后,验证是否完整可用(避免渲染异常) |
| 帧缓冲(FBO) | 删除帧缓冲对象 | glDeleteFramebuffers(1, &fboID) | - `n`:要删除的帧缓冲数量- `framebuffers`:要删除的帧缓冲ID数组/指针 | 程序结束或帧缓冲不再使用时,释放帧缓冲占用的GPU资源,避免内存泄漏 |
| 帧缓冲(FBO) | 设置帧缓冲读/写掩码(深度) | glDepthMask(GL_FALSE); glStencilMask(GL_FALSE) | - `flag`:GL_TRUE/GL_FALSE,是否允许深度/模板缓冲写入 | 只读帧缓冲数据时禁用写入,避免意外修改深度/模板缓冲,提升性能 |
| 帧缓冲(FBO) | 启用FBO完整性检查 | glEnable(GL_FRAMEBUFFER_COMPLETE_CHECK) | 启用FBO完整性自动检查,创建/修改FBO时触发错误提示 | 开发阶段启用,快速定位FBO附件不匹配、格式错误等配置问题 |
| 帧缓冲(FBO) | 启用帧缓冲多视图渲染 | glEnable(GL_MULTIVIEW); glFramebufferTextureMultisampleMultiview(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, texID, 0, 0, 2) | - 支持多视图纹理,同时渲染多个视图(如VR双目),提升渲染效率 | VR/AR开发中,通过多视图渲染同时生成左右眼图像,减少绘制调用次数 |
| 帧缓冲(FBO) | 获取帧缓冲的附件信息 | GLenum attachmentType; glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, &attachmentType) | - `target`:帧缓冲目标- `attachment`:帧缓冲附件- `pname`:查询参数(如GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE)- `params`:存储结果的指针 | 调试帧缓冲时,查询附件的类型(纹理/渲染缓冲)、格式等信息,排查帧缓冲不完整问题 |
| 帧缓冲(FBO) | 设置多渲染目标绘制缓冲区 | GLenum bufs[]={GL_COLOR_ATTACHMENT0,GL_COLOR_ATTACHMENT1}; glDrawBuffers(2,bufs) | - `n`:缓冲区数量- `bufs`:颜色附件数组 | MRT渲染时,指定多个颜色附件作为绘制目标,实现多数据同时输出 |
| 帧缓冲(FBO) | DSA-设置多绘制缓冲区 | GLenum bufs[]={GL_COLOR_ATTACHMENT0,GL_COLOR_ATTACHMENT1}; glNamedFramebufferDrawBuffers(fboID,2,bufs) | DSA无绑定为FBO设置多个绘制缓冲区,实现MRT多目标渲染 | PBR/MRT渲染中,无绑定配置多颜色附件,减少状态切换,提升渲染效率 |
| 帧缓冲(FBO) | 将渲染缓冲附加到帧缓冲 | glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, rboID) | - `target`:帧缓冲目标(同glBindFramebuffer的target)- `attachment`:帧缓冲附件类型(同glFramebufferTexture2D的attachment)- `renderbuffertarget`:固定为GL_RENDERBUFFER- `renderbuffer`:要附加的渲染缓冲ID | 帧缓冲需要深度/模板测试时,附加渲染缓冲作为深度模板附件(比纹理附件更高效) |
| 帧缓冲(FBO) | 将纹理附加到帧缓冲作为颜色附件 | glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textureID, 0) | - `target`:帧缓冲目标(同glBindFramebuffer的target参数)- `attachment`:帧缓冲附件类型(完整可选值):✅ GL_COLOR_ATTACHMENT0~GL_COLOR_ATTACHMENTn(颜色附件)、✅ GL_DEPTH_ATTACHMENT(深度附件)、✅ GL_STENCIL_ATTACHMENT(模板附件)、✅ GL_DEPTH_STENCIL_ATTACHMENT(深度模板联合附件)- `textarget`:纹理类型(如GL_TEXTURE_2D)- `texture`:要附加的纹理对象ID- `level`:纹理的mipmap层级(0为基础层级) | 离屏渲染时,将渲染结果输出到纹理中,用于后续的纹理采样(如阴影贴图、后处理效果) |
| 帧缓冲(FBO) | 生成帧缓冲对象ID | glGenFramebuffers(1, &fboID) | - `n`:要生成的帧缓冲数量- `framebuffers`:存储帧缓冲ID的数组/指针 | 创建自定义帧缓冲的第一步,生成唯一标识用于后续绑定和配置 |
| 帧缓冲(FBO) | 查询FBO附件纹理ID | GLint tex; glGetNamedFramebufferAttachmentParameteriv(fboID,GL_COLOR_ATTACHMENT0,GL_FRAMEBUFFER_ATTACHMENT_TEXTURE, &tex) | DSA模式查询FBO附件绑定的纹理ID,验证FBO配置正确性 | 调试MRT渲染时,确认FBO各附件的纹理绑定是否正确,排查渲染结果错误 |
| 帧缓冲(FBO) | DSA-绑定多重采样渲染缓冲 | glNamedFramebufferRenderbuffer(fboID,GL_DEPTH_STENCIL_ATTACHMENT,GL_RENDERBUFFER,msRboID) | DSA无绑定为FBO绑定多重采样RBO,实现MSAA深度/模板测试 | 批量配置MSAA FBO时,无绑定设置深度/模板附件,减少状态切换 |
| 帧缓冲(FBO) | DSA-绑定立方体贴图面作为附件 | glNamedFramebufferTextureLayer(fboID,GL_COLOR_ATTACHMENT0,cubeTexID,0,GL_TEXTURE_CUBE_MAP_POSITIVE_X) | - `layer`:立方体贴图面(正负X/Y/Z) | DSA无绑定为FBO绑定立方体贴图单个面,实现天空盒/环境图的分面渲染 |
| 帧缓冲(FBO) | 设置FBO视口裁剪 | glScissor(100,100,600,400);glEnable(GL_SCISSOR_TEST) | - `x/y`:裁剪区域左上角- `widthheight`:裁剪区域尺寸 | 仅在FBO的指定区域内渲染,实现局部画面更新、分区域后处理 |
| 直接状态访问(DSA) | DSA-映射缓冲到CPU内存 | float* bufPtr = (float*)glMapNamedBuffer(bufferID, GL_WRITE_ONLY) | - `buffer`:缓冲ID- `access`:访问模式(GL_READ_ONLY/WRITE_ONLY/READ_WRITE) | DSA模式无绑定将GPU缓冲映射到CPU内存,实现数据直接读写,无需拷贝 |
| 直接状态访问(DSA) | DSA-创建缓冲并分配存储 | glBufferStorage(bufferID, sizeof(float)*1024, NULL, GL_DYNAMIC_STORAGE_BIT) | - `buffer`:缓冲ID- `size`:缓冲内存大小- `data`:初始化数据(NULL为空白)- `flags`:存储标志(如GL_DYNAMIC_STORAGE_BIT可动态更新) | DSA模式无绑定创建缓冲,分配不可变存储并指定使用权限,适配不同数据更新频率 |
| 直接状态访问(DSA) | DSA-更新缓冲数据 | glBufferSubData(bufferID, 0, sizeof(float)*512, newData) | - `buffer`:缓冲ID- `offset`:缓冲内偏移量- `size`:更新数据大小- `data`:待更新数据指针 | DSA模式无绑定更新缓冲局部数据,适用于顶点/实例数据的动态更新 |
| 直接状态访问(DSA) | DSA-更新纹理子区域(压缩格式) | glCompressedTextureSubImage3D(tex3DID,0,0,0,0,64,64,64,GL_COMPRESSED_RGBA_BPTC_UNORM,size,data) | 3D压缩纹理更新,参数同压缩2D纹理,增加depth维度 | DSA无绑定更新3D压缩纹理局部数据,减少体素纹理传输带宽 |
| 直接状态访问(DSA) | DSA-复制纹理子区域 | glCopyTextureSubData(srcID,GL_TEXTURE_2D,0,10,10,0,dstID,GL_TEXTURE_2D,0,20,20,0,50,50,1) | 跨纹理复制指定区域数据,无绑定操作,支持不同纹理间的局部数据迁移 | 纹理后处理中,快速复制纹理局部区域,实现纹理裁剪、拼接 |
| 直接状态访问(DSA) | DSA-复制纹理到帧缓冲 | glCopyTextureToImage(texID, 0, GL_TEXTURE_2D, 0, 0, 0, 0, 800, 600, 1) | DSA原生方法,直接将纹理数据复制到帧缓冲图像,无需绑定状态 | 快速将纹理内容渲染到帧缓冲,适用于纹理预览、后处理中间结果展示 |
| 直接状态访问(DSA) | DSA-初始化缓冲数据 | glNamedBufferData(bufID, size, data, GL_STATIC_DRAW) | 参数同glBufferData,首参为缓冲ID,无绑定初始化缓冲数据 | 批量创建缓冲时,无绑定初始化数据,提升缓冲创建效率 |
| 直接状态访问(DSA) | DSA-设置缓冲使用提示 | glNamedBufferParameteri(bufID,GL_BUFFER_USAGE,GL_DYNAMIC_DRAW) | DSA无绑定为缓冲设置使用提示,指导GPU优化内存布局与访问策略 | 批量创建缓冲后,单独调整个别缓冲的使用提示,适配动态/静态数据差异 |
| 直接状态访问(DSA) | DSA-设置纹理LOD范围 | glTextureParameterf(texID, GL_TEXTURE_MIN_LOD, 0.0f); glTextureParameterf(texID, GL_TEXTURE_MAX_LOD, 5.0f) | - `pname`:GL_TEXTURE_MIN_LOD/GL_TEXTURE_MAX_LOD- `param`:最小最大LOD值 | DSA无绑定限制纹理采样的LOD范围,避免采样到过低精度的mipmap层级 |
| 直接状态访问(DSA) | DSA-设置纹理各向异性过滤 | glTextureParameterf(texID,GL_TEXTURE_MAX_ANISOTROPY,16.0f) | - `texture`:纹理ID- `param`:各向异性级别(1.0~16.0) | DSA无绑定为单个纹理设置高等级各向异性过滤,不影响全局采样器 |
| 直接状态访问(DSA) | DSA-设置纹理采样器 | glTextureSampler(texID, samplerID) | - `texture`:纹理ID- `sampler`:采样器ID | DSA无绑定为纹理关联采样器,实现纹理与采样规则的永久绑定,减少渲染状态切换 |
| 直接状态访问(DSA) | DSA-创建立方体贴图并分配存储 | glTextureStorage2D(cubeTexID, 5, GL_RGBA8, 512, 512) | 立方体贴图以2D纹理存储,target隐式为GL_TEXTURE_CUBE_MAP | DSA模式无绑定创建不可变存储立方体贴图,用于天空盒/环境映射 |
| 直接状态访问(DSA) | DSA-创建2D纹理并分配存储 | glTextureStorage2D(texID, 4, GL_RGBA8, 512, 512) | - `texture`:纹理ID(无需绑定)- `levels`:mipmap总层级数- `internalformat`:纹理内部格式- `width/height`:纹理尺寸 | OpenGL4.5+DSA模式,无绑定创建2D纹理并分配不可变存储,减少状态切换,提升渲染性能 |
| 直接状态访问(DSA) | DSA-创建2D纹理数组并分配存储 | glTextureStorage2DArray(texArrayID, 4, GL_SRGB8_ALPHA8, 256,256,32) | - `texture`:纹理数组ID- `depth`:图层数量其他参数同glTextureStorage2D | DSA模式无绑定创建不可变存储2D纹理数组,批量存储同尺寸SRGB纹理 |
| 直接状态访问(DSA) | DSA-创建多重采样2D纹理 | glTextureStorage2DMultisample(msTexID,4,GL_RGBA8,800,600,GL_TRUE) | - `texture`:多重采样纹理ID- `samples`:采样数- `fixedsamplelocations`:是否固定采样位置其他同glTextureStorage2D | DSA无绑定创建不可变存储多重采样纹理,适配MSAA离屏渲染 |
| 直接状态访问(DSA) | DSA-创建3D纹理并分配存储 | glTextureStorage3D(tex3DID, 3, GL_RGBA8, 128, 128, 128) | - `texture`:3D纹理ID- `levels`:mipmap层级数- `internalformat`:内部格式- `widthheight/depth`:3D纹理尺寸 | OpenGL4.5+DSA模式,无绑定创建不可变存储3D纹理,适配体素数据存储 |
| 直接状态访问(DSA) | DSA-更新2D纹理数据 | glTextureSubImage2D(texID, 0, 0, 0, 256, 256, GL_RGBA, GL_UNSIGNED_BYTE, pixelData) | - `texture`:纹理ID- `level`:mipmap层级- `xoffsetyoffset`:纹理内偏移- 其他参数同glTexSubImage2D | |
| 直接状态访问(DSA) | DSA-批量启用VAO属性 | GLuint attrs[]={0,1,2};glEnableVertexArrayAttribs(vaoID,3,attrs) | - `vao`:VAO ID- `count`:属性数量- `attrs`:属性索引数组 | 复杂VAO配置时,批量启用多个顶点属性,减少多次API调用的开销 |
| 直接状态访问(DSA) | DSA-创建缓冲视图 | GLuint bufView = glCreateBufferViews(1, &bufViewCreateInfo, NULL) | - `n`:缓冲视图数量- `pCreateInfos`:缓冲视图创建信息(格式/偏移/大小) | 为单个缓冲创建多个不同格式的视图,实现同一数据的多格式访问,节省内存 |
| 直接状态访问(DSA) | DSA-解除缓冲内存映射 | glUnmapNamedBuffer(bufferID) | - `buffer`:缓冲ID返回值:GL_TRUE=映射有效,GL_FALSE=数据损坏 | 解除CPU与GPU缓冲的映射关系,让GPU重新获得缓冲访问权 |
| 直接状态访问(DSA) | DSA-设置VAO实例属性步长 | glVertexArrayAttribDivisor(vaoID,4,1) | - `vao`:VAO ID- `index`:顶点属性索引- `divisor`:实例步长 | DSA无绑定为VAO配置实例属性,实现VAO与实例化配置解耦 |
| 直接状态访问(DSA) | DSA-批量绑定VAO缓冲 | glVertexArrayVertexBuffers(vaoID,0,2,bufs,offsets,strides) | - `first`:起始绑定点- `count`:缓冲数量- `buffers`:缓冲ID数组- `offsetsstrides`:偏移/步长数组 | DSA无绑定批量为VAO关联多个顶点缓冲,简化复杂顶点格式的VAO配置 |
| 直接状态访问(DSA) | DSA-映射纹理缓冲 | void* ptr=glMapNamedBuffer(texBufferID,GL_READ_ONLY) | DSA无绑定将纹理缓冲(TBO)映射到CPU内存,实现纹理数据的CPU读写 | 动态更新TBO中的大尺寸数据(如顶点列表),无需重新创建纹理 |
| 状态查询(State Query) | 查询OpenGL当前状态(如是否启用深度测试) | GLboolean isDepthEnabled; glGetBooleanv(GL_DEPTH_TEST, &isDepthEnabled) | - `pname`:要查询的状态参数(如GL_DEPTH_TEST、GL_BLEND)- `params`:存储查询结果的布尔值指针 | 调试程序时,验证当前OpenGL状态是否符合预期,排查状态设置错误 |
| 状态查询(State Query) | 查询当前视口参数 | GLint viewport[4]; glGetIntegerv(GL_VIEWPORT, viewport) | - `pname`:固定为GL_VIEWPORT- `params`:4个int数组,依次存储视口x、y、width、height | 多窗口渲染或窗口大小变化后,获取当前视口配置,用于后续渲染计算 |
| 状态管理 | 保存/恢复矩阵模式(固定管线) | glPushMatrixMode(GL_MODELVIEW); glPopMatrixMode() | 保存当前矩阵模式,恢复时无需重新指定,适配固定功能管线的矩阵操作 | 使用固定功能管线时,简化矩阵模式的切换与恢复,减少状态错误 |
| 状态设置(State Setup) | 设置清除颜色缓冲区的颜色 | glClearColor(0.2f, 0.3f, 0.3f, 1.0f) | - `red/green/blue/alpha`:清除颜色的RGBA分量(范围0.0~1.0) | 设置每一帧开始时清空颜色缓冲区的背景色(如游戏的天空色、UI的背景色) |
| 状态设置(State Setup) | 设置清除深度缓冲区的值 | glClearDepthf(1.0f) | - `depth`:清除深度缓冲的值(范围0.0~1.0,默认1.0,代表最远) | 自定义深度缓冲的初始值,适用于特殊深度测试场景(如反向深度测试) |
| 状态设置(State Setup) | 设置清除模板缓冲区的值 | glClearStencil(0) | - `s`:清除模板缓冲的值(范围0~255,默认0) | 设置模板缓冲区的初始值,为后续模板测试提供基准值 |
| 资源管理 | 删除着色器程序对象 | glDeleteProgram(programID) | - `program`:着色器程序ID | 着色器程序不再使用时,释放程序资源,包括链接的着色器、统一变量等 |
| 资源管理 | 批量删除帧缓冲 | GLuint fbos[]={fbo1,fbo2,fbo3}; glDeleteFramebuffers(3,fbos) | - `n`:FBO数量- `framebuffers`:FBO ID数组 | 场景销毁/程序退出时,批量释放FBO资源,避免GPU内存泄漏 |
| 资源管理 | 批量删除渲染缓冲 | GLuint rbos[]={rbo1,rbo2}; glDeleteRenderbuffers(2,rbos) | - `n`:RBO数量- `renderbuffers`:RBO ID数组 | 批量释放深度/模板渲染缓冲,配合FBO清理,完成离屏渲染资源释放 |
| 资源管理 | 批量删除VAO对象 | GLuint vaos[]={vao1,vao2,vao3};glDeleteVertexArrays(3,vaos) | - `n`:VAO数量- `arrays`:VAO ID数组 | 场景销毁时,批量释放VAO资源,避免逐个删除的冗余API调用,提升资源释放效率 |