2026/11/3 11:08:49

计算机图形学核心:图形流水线、Z-Buffer与Phong光照原理

计算机图形学核心:图形流水线、Z-Buffer与Phong光照原理 简介本资源是山东大学计算机图形学课程期末复习精要整理面向该校及相关高校计算机、数字媒体等专业本科生聚焦核心考点与易混淆概念助力高效备考与知识体系梳理。内容覆盖图形绘制流水线顶点处理、裁剪与图元组装、光栅化、片元处理、双缓冲机制原理与代码实现、投影变换与gluLookAt函数参数解析、全局/局部光照模型对比、光线跟踪基本思想、合成照相机模型、边缘函数与分层光栅化、齐次栅格化优势、走样问题及抗锯齿方案超采样/多重采样等关键模块并附Z-Buffer算法、渲染方程与Phong光照模型等延伸要点。资源为1个6.87MB的Word文档.docx结构清晰、术语准确、公式与伪代码兼备便于打印复习与重点标注。目前已有2313人学习下载是兼顾理论深度与应试实用性的高质量期末复习笔记。1. 计算机图形学到底是什么不是“画图软件”而是让屏幕“凭空造物”的数学引擎你有没有想过为什么打开一个三维游戏角色能转头、光影会流动、远处的山会变小、近处的树叶子还带反光这些画面不是提前录好的视频也不是靠手动画出来的每一帧——它们是电脑在你按下“运行”那一秒从零开始用数学公式“算出来”的。打个比方计算机图形学Computer Graphics就像一位精通几何、光学和线性代数的“数字建筑师”。它不直接搬砖砌墙而是先写一套严密的施工说明书告诉机器——“这个球体中心在哪儿、半径多大、表面是磨砂还是镜面、头顶有几盏灯、每盏灯发什么颜色、光线碰到球后怎么弹、弹到你眼睛里时亮度剩多少……”然后机器照着这份说明书一像素一像素地推演、计算、填色最终拼出你看到的画面。这不是 Photoshop 里的滤镜也不是 PPT 里的动画路径它是现代所有三维视觉体验的底层逻辑——从手机地图的倾斜视角到电影《阿凡达》里的潘多拉森林再到你期末考卷上那道“写出 gluLookAt 参数含义”的题全靠这套体系支撑。山东大学这门课考的从来不是你会不会调 API而是你能不能看懂这张“施工说明书”里每个符号、每步变换、每次插值背后的物理意义和数学必然性。搞懂它你就不再只是调用glutSwapBuffers()的人而是能一眼看出“为什么这里闪屏”“为什么高光跑偏了”“为什么远处纹理糊成一片”的人——这才是期末复习真正要抢回的“认知主权”。2. 图形绘制流水线一张图看懂画面是怎么被“算”出来的图形绘制流水线Graphics Pipeline是计算机图形学最核心的骨架。它不是某段代码而是一套标准化的、分阶段执行的计算流程——就像汽车装配线底盘进来依次经过焊接、喷漆、装发动机、质检最后开出厂门。画面也一样一个三维模型进来经过顶点处理、裁剪、光栅化、片元处理最终变成你屏幕上的一帧像素。理解它等于拿到了整门课的“路线图”。2.1 为什么必须分阶段——并行性与职责分离的硬需求早期显卡没有流水线所有计算挤在一块儿做先算完所有顶点位置再统一裁剪再一起光栅化……结果是 CPU 等 GPU、GPU 等内存、内存等显存效率极低。现代流水线强制“分段作业”带来两个不可替代的好处第一并行加速。顶点处理模块可以同时处理成百上千个顶点因为彼此独立光栅化模块可以同时测试多个像素是否在三角形内片元处理模块能并发计算不同片元的颜色——就像十条流水线同时拧螺丝速度翻十倍。第二硬件专用化。GPU 芯片上顶点处理器Vertex Shader Core专精矩阵乘法光栅化单元Rasterizer Unit专精边缘函数求解片元处理器Fragment Shader Core专精颜色混合与深度比较。如果混在一起芯片设计会臃肿低效功耗飙升。提示考试常考“为什么顶点处理是彼此独立的”答案就藏在这里——每个顶点的坐标变换只依赖自身原始坐标和变换矩阵不读取也不修改其他顶点数据天然适合并行。2.2 四大阶段拆解从“点”到“像素”的完整旅程我们以一个最简单的三角形为例走一遍经典流水线Classic Graphics Pipeline阶段输入核心任务输出关键技术点顶点处理Vertex Processing一组顶点含位置、法向量、纹理坐标对每个顶点执行模型变换Model、视图变换View、投影变换Projection即 MVP 矩阵连乘同时计算顶点颜色、光照初值变换后的齐次裁剪坐标x,y,z,w及附属属性如颜色、纹理坐标glLoadIdentity()清空当前矩阵gluLookAt()构建 View 矩阵glOrtho()或glFrustum()构建 Projection 矩阵裁剪与图元组装Clipping Primitive Assembly变换后的顶点流将顶点按顺序组装成图元如三角形、线段对每个图元执行裁剪——剔除完全在视见体Viewing Frustum外的部分对穿过边界的图元进行分割如把一半在内一半在外的三角形切成两个小三角形裁剪后、位于规范立方体-1~1内的图元集合裁剪目的不是“省事”而是避免后续计算出现除零、无穷大等退化degeneracy错误gluLookAt后必须确保物体在视见体内否则直接消失光栅化Rasterization裁剪后的图元如三角形判断屏幕上哪些像素或片元被该图元覆盖为每个被覆盖的片元生成初始属性位置、重心坐标、深度 z、纹理坐标等一组片元Fragment每个携带(x,y,z, color, texCoord, ...)核心算法是边缘函数Edge Function对三角形三条边分别计算E(x,y) axbyc若三点同号则在内部glEnable(GL_DEPTH_TEST)开启深度测试的前提是光栅化输出了 z 值片元处理Fragment Processing光栅化生成的片元流对每个片元执行光照计算Phong/Gouraud、纹理采样mipmap、Alpha 混合、深度测试Z-Buffer、模板测试等决定该片元是否写入帧缓冲区Frame Buffer更新后的像素颜色与深度值片元 ≠ 像素一个像素可能被多个片元覆盖如多重采样最终颜色是多次片元处理的结果glutSwapBuffers()交换的正是帧缓冲区内容2.3 流水线不是黑匣子一个真实代码片段说明各阶段如何衔接// OpenGL 旧版固定管线示例对应山东大学PPT风格 void display() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 清空颜色深度缓冲 // 【顶点处理】阶段启动设置变换矩阵 glLoadIdentity(); // 重置模型视图矩阵 gluLookAt(0,0,5, 0,0,0, 0,1,0); // View矩阵相机在(0,0,5)看向原点上方向Y轴 glOrtho(-2,2,-2,2,-1,1); // Projection矩阵正交投影视见体x∈[-2,2], y∈[-2,2], z∈[-1,1] // 【图元组装】阶段定义三角形三个顶点 glBegin(GL_TRIANGLES); glVertex3f(-1.0, -1.0, 0.0); // 顶点1 glVertex3f( 1.0, -1.0, 0.0); // 顶点2 glVertex3f( 0.0, 1.0, 0.0); // 顶点3 glEnd(); // 此刻OpenGL驱动已将这三个顶点送入顶点处理器 → 裁剪器 → 光栅化器 → 片元处理器 glutSwapBuffers(); // 【输出】交换前后缓冲显示本帧 }这段代码看似简单但背后是完整的四阶段流水线在运转gluLookAt和glOrtho构建了顶点处理所需的矩阵glBegin/glEnd触发图元组装glVertex3f提供原始顶点glutSwapBuffers完成最终呈现。考试中让你“写出 gluLookAt 三个参数组的物理含义”就是在考你是否看清了 View 矩阵这一环在流水线中的确切位置和作用。2.4 流水线的“默认状态”为什么需要归一化视见体Normalization你可能疑惑为什么glOrtho设定的是[-2,2]这种任意范围而裁剪却总在[-1,1]的规范立方体内进行答案就是视见体归一化Normalization。它的本质是流水线设计者的一个绝妙妥协让所有投影正交、透视最终都映射到同一个标准空间Canonical View Volume这样后续的裁剪、光栅化、深度测试模块就可以用同一套硬件电路、同一段固件代码来处理无需为每种投影写不同逻辑。对正交投影归一化是线性缩放平移对透视投影归一化通过齐次坐标的 w 分量实现z z/w把金字塔形视见体“压扁”成规范立方体。这就是为什么gluLookAt后必须接glOrtho或glFrustum——前者提供 View 矩阵后者提供 Projection 矩阵二者相乘得到最终的 MVP才能把世界坐标正确“塞进”那个-1~1的标准盒子。没这一步顶点坐标就无法被裁剪器识别整个流水线会在第二阶段就卡死。3. 双缓冲、Z-Buffer、走样那些让画面“稳、准、真”的关键机制如果流水线是造车的骨架那么双缓冲、Z-Buffer、抗走样技术就是让这辆车开得稳、不撞墙、看起来像真车的三大底盘系统。它们不直接参与“画什么”但决定了“画得有多好”。山东大学期末考反复出现的glutInitDisplayMode(GLUT_DOUBLE)、glEnable(GL_DEPTH_TEST)、glEnable(GL_MULTISAMPLE)全指向这三个机制。3.1 双缓冲消灭屏幕撕裂的“时间错位”问题想象一下你正在看一段 60 帧/秒的动画。单缓冲模式下显卡一边往同一块内存帧缓冲区里写下一帧画面显示器一边从这块内存里读取当前画面显示。问题来了——当显示器读到一半比如刚读完上半屏显卡恰好把下半屏改成了新帧内容结果屏幕上半是旧帧、下半是新帧出现一道明显的“撕裂线”。这就是屏幕撕裂Screen Tearing。双缓冲Double Buffering用“空间换时间”完美解决它准备两块独立的帧缓冲区——前台缓冲区Front Buffer专供显示器读取显示后台缓冲区Back Buffer专供 GPU 渲染写入。GPU 总是在后台缓冲区画下一帧画完立刻执行glutSwapBuffers()原子性地交换前后台指针不是复制数据。此时显示器无缝切换到新画好的后台缓冲区作为新的前台而 GPU 立刻在刚腾空的旧前台现后台上开始画再下一帧。注意glutInitDisplayMode(GLUT_DOUBLE)必须在glutCreateWindow()之前调用否则窗口创建时未申请双缓冲内存glutSwapBuffers()会无效。这是山东大学实验课常见翻车点。3.2 Z-Buffer解决“谁在前面”的深度战争没有深度测试3D 世界就是一张叠在一起的幻灯片——近处的茶杯会永远盖住远处的桌子哪怕你绕到桌子后面。Z-Buffer深度缓冲区就是这场“深度战争”的裁判。它是一块与帧缓冲区同样大小的内存每个像素位置存储一个z值即该像素对应物体表面到相机的距离。渲染每个片元时GPU 执行两步原子操作比较将当前片元的z值与 Z-Buffer 中对应位置的z值比较更新若当前z更小即更靠近相机则用当前片元颜色更新帧缓冲区该像素并用当前z值更新 Z-Buffer否则丢弃该片元。// 伪代码Z-Buffer核心逻辑 for each fragment F at pixel (x,y): z_current F.z; // 当前片元深度 z_buffer zBuffer[x][y]; // Z-Buffer中该像素历史深度 if (z_current z_buffer) { // 更近才可见 frameBuffer[x][y] F.color; // 更新颜色 zBuffer[x][y] z_current; // 更新深度 }这个算法简洁到极致却解决了隐藏面消除Hidden Surface Removal这一根本难题。考试中问“Z-Buffer 算法为何能正确处理相互遮挡的复杂模型”答案就是它不依赖图元绘制顺序每个片元独立决策天然支持任意拓扑关系。3.3 走样Aliasing数字世界的“阶梯效应”与它的三重解药走样是离散采样像素网格与连续世界真实光线碰撞时必然产生的“数字伤疤”。它有三种典型表现几何走样斜线呈现锯齿状“楼梯效应”纹理走样远处地板纹理闪烁、摩尔纹运动走样旋转的风扇叶片忽隐忽现。根本原因在于奈奎斯特采样定理被违反——当场景中细节变化频率超过像素采样率即每英寸线对数 1/2 像素间距高频信息就会“折叠”成低频假象。解决方案不是提高分辨率成本太高而是在采样前主动模糊预滤波或在采样后智能融合后滤波方法原理代价山东大学考点超级采样Supersampling, SSAA以 4x 分辨率如 3840×2160渲染再降采样box filter到 1920×1080显存计算量 ×4GPU 负载爆炸常考概念辨析“SSAA 与 MSAA 本质区别”答SSAA 对每个子像素都执行完整片元着色MSAA 只对每个子像素做深度/模板测试着色只算一次/像素多重采样Multisampling, MSAA每个像素划分为 4 或 8 个子样本sub-sample共享同一套纹理坐标和颜色计算但独立记录深度/模板值最终颜色是覆盖子样本的加权平均平衡效果与性能现代 GPU 硬件原生支持glEnable(GL_MULTISAMPLE)是启用开关glutInitDisplayMode(GLUT_MULTISAMPLE)是初始化前提各向异性过滤Anisotropic Filtering, AF专治纹理走样当纹理平面与视线夹角极大如地面时传统双线性滤波会拉伸模糊AF 根据纹理坐标梯度dudx, dudy动态选择长方形采样区域保持清晰显存带宽略增但效果显著PPT 中mipmap原理题必延伸至此glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 16.0f)是典型调用提示考试若问“为什么开启 MSAA 后帧率下降不如 SSAA 明显”答案直指核心——MSAA 省去了重复的片元着色Shading计算只增加了深度/模板的子样本存储与混合开销。4. 光照模型与渲染从“亮一块”到“像真光”的进化之路如果说流水线是骨架缓冲机制是底盘那么光照模型就是赋予画面灵魂的“光之语法”。山东大学期末考中“Phong 模型三部分”、“Gouraud vs Phong 着色区别”、“全局光照为何慢”这些题都在考察你是否理解光不是均匀洒下的而是遵循物理定律在物体表面发生反射、折射、散射的复杂过程。4.1 局部光照快速但“近视”的光照快照局部光照Local Illumination模型只考虑光源→物体表面→观察者这一条直射路径忽略环境光二次反射、物体间互反射等全局效应。它快、可控、易于硬件实现是实时渲染的基石。Phong 光照模型三合一的经验公式Phong 模型将物体表面反射光分解为三部分每部分用独立公式计算再线性叠加I_{\text{total}} I_{\text{ambient}} I_{\text{diffuse}} I_{\text{specular}}环境光Ambient模拟全局漫反射底色。I_a K_a * I_{a,\text{light}}K_a是材质环境反射系数0~1I_{a,\text{light}}是环境光强度。它让背光面不纯黑但无方向性。漫反射Diffuse服从 Lambert 定律亮度与入射光和表面法向夹角余弦成正比。I_d K_d * I_{d,\text{light}} * \max(0, \mathbf{N} \cdot \mathbf{L})K_d是漫反射系数L是光源到点的单位向量N是表面法向量。这是“哑光塑料感”的来源。镜面反射Specular模拟光滑表面高光。I_s K_s * I_{s,\text{light}} * (\max(0, \mathbf{R} \cdot \mathbf{V}))^nR是L关于N的反射向量V是视线向量n是高光指数越大越尖锐。这是“金属/陶瓷感”的关键。注意考试常混淆R和V。牢记R是光“怎么弹出去”V是眼“往哪看”只有两者方向一致时R·V ≈ 1才看到强高光。Gouraud vs Phong 着色插值对象决定画质天花板二者都是为多边形网格着色但插值粒度天差地别特性Gouraud 着色Phong 着色插值对象顶点颜色I_{\text{vertex}}顶点法向量N_{\text{vertex}}插值方式在三角形内双线性插值顶点颜色先插值边上的法向量再插值面上的法向量着色时机顶点处理阶段计算I_v光栅化后直接插值光栅化后对每个片元F插值得到N_F再在片元处理阶段用N_F计算I_F效果高光呈多边形轮廓曲面显“棱角”计算快高光圆润自然曲面平滑但需为每个片元重算光照开销大// OpenGL中启用方式固定管线 glShadeModel(GL_SMOOTH); // 启用插值默认 // GouraudglLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, GL_FALSE); // Phong需用可编程管线Shader实现固定管线无法原生支持考试若问“为什么 Phong 着色能产生正确高光而 Gouraud 不能”答案就是高光位置由R·V决定而R依赖于精确的表面法向NGouraud 只插值颜色丢失了N的空间变化导致高光被“抹平”在三角形上。4.2 全局光照追求真实的“物理级”渲染全局光照Global Illumination, GI试图模拟光在场景中无限次反弹的真实行为阳光照到白墙白墙又把光漫反射到红沙发红沙发再反射微弱红光到天花板……这种间接照明让画面拥有真实的空间感和色彩渗透。渲染方程Rendering EquationGI 的终极数学表达Kajiya 在 1986 年提出的渲染方程是 GI 的理论基石L_o(\mathbf{x}, \omega_o) L_e(\mathbf{x}, \omega_o) \int_{\Omega} f_r(\mathbf{x}, \omega_i, \omega_o) \, L_i(\mathbf{x}, \omega_i) \, (\mathbf{n} \cdot \omega_i) \, d\omega_iL_o从点x沿方向ω_o出射的辐射亮度L_e点x自发光亮度积分项所有入射方向ω_i的贡献由 BRDFf_r双向反射分布函数加权(n·ω_i)Lambert 余弦因子表征入射光有效面积。这个方程之所以“难求解”是因为无限递归L_i本身又是另一点的L_o需递归追踪高维积分积分域Ω是半球需对所有方向采样BRDF 复杂真实材质 BRDF如 Cook-Torrance含多个参数解析解不存在。因此实时渲染放弃精确求解转而用光线追踪Ray Tracing或辐射度Radiosity近似。而山东大学考纲中提到的“光线追踪”正是沿着ω_o反向发射光线递归求交、采样光源、累加贡献的蒙特卡洛方法——它效果惊艳但每像素需发射数十至数百条光线远超 60FPS 实时要求故仅用于电影离线渲染。提示考试若问“为什么光线追踪不适合交互应用”不要只答“慢”要指出本质它违背了实时渲染的‘确定性帧率’约束。一帧耗时从 16ms60FPS飙升至数秒用户交互如鼠标移动会严重卡顿。4.3 BRDF描述材质“个性”的物理身份证BRDFBidirectional Reflectance Distribution Function是材质的“光学指纹”定义了给定入射光方向ω_i和出射观察方向ω_o表面在点x处将多少比例的入射光反射到ω_o。理想漫反射LambertianBRDFf_r \frac{\rho}{\pi}ρ即漫反射率K_d是常数。它假设光向所有方向均匀散射符合粗糙表面粉笔、哑光漆。Phong BRDF经验模型f_r \propto (\mathbf{R} \cdot \mathbf{V})^n虽不严格物理但高效模拟镜面高光。Cook-Torrance BRDF物理模型将反射分解为镜面Microfacet 漫反射Diffuse 几何遮蔽Geometry三部分参数多但真实。考试中“BRDF 的物理意义”题核心答点就是它是一个关于方向的函数满足能量守恒反射光 ≤ 入射光和亥姆霍兹互易性f_r(ω_i,ω_o) f_r(ω_o,ω_i)。记住这两条就能判断一个自编 BRDF 是否合理。5. 易混概念辨析终结那些让你考场犹豫的“好像都对”计算机图形学里太多术语长得像、功能近、英文缩写还撞车。山东大学期末卷上一个选项写错字母整道题就丢分。下面这 5 组是历年考生血泪踩坑最多、老师最爱设陷阱的易混点。我们不讲定义只说怎么一眼分清、为什么容易混、考试怎么防坑。5.1 片元Fragment vs 像素Pixel不是同义词是“候选人”与“正式员工”的关系易混点教材常写“光栅化生成片元”代码里又操作glDrawPixels学生误以为片元像素。为什么混中文翻译都带“片”字且一个片元最终常对应一个像素颜色。怎么区分像素Pixel帧缓冲区Frame Buffer中的一个存储单元有固定位置(x,y)和颜色值。它是最终显示在屏幕上的“成品”。片元Fragment光栅化器为潜在覆盖某个像素而生成的临时计算单元携带(x,y,z, color, texCoord, ...)等属性。它可能被深度测试Z-Buffer淘汰也可能被 Alpha 混合Blending修改甚至被多重采样MSAA拆成多个子片元。✅ 考场速记“片元是应聘者像素是录用者”。一个像素位置可能经历多个片元的竞争深度测试、合作MSAA、淘汰模板测试最终只有一个或加权平均胜出成为像素。5.2 正交投影Orthographic vs 透视投影Perspective不是“平行”vs“汇聚”是“距离无关”vs“距离敏感”易混点看到“正交线平行”“透视线汇聚”就认为区别只在视觉效果。为什么混PPT 图常只画线框忽略核心数学差异。怎么区分正交投影不改变物体相对大小。z坐标只用于深度测试不影响x,y。公式本质是线性映射x x, y y, z z经归一化后。适用于 CAD、UI、等距游戏。透视投影模拟人眼近大远小。x,y坐标被z缩放x x/z, y y/z齐次坐标下wz。z不仅管深度还直接扭曲x,y。✅ 考场速记看glFrustum()和glOrtho()的参数。glFrustum(l,r,b,t,n,f)中n,f是近远裁剪面z值但l,r,b,t会随z变化因l/z等glOrtho(l,r,b,t,n,f)中l,r,b,t是绝对坐标与z无关。5.3 Gouraud 着色 vs Phong 着色不是“快”vs“慢”是“插值颜色”vs“插值法向”易混点知道 Gouraud 快、Phong 慢但选错“哪个插值什么”。为什么混名字都带“Phong”且都用于三角形着色。怎么区分Gouraud在顶点计算完整光照I_v然后在三角形内插值I_v得到像素颜色。Phong在顶点计算法向N_v然后在三角形内插值N_v得到片元法向N_f最后在每个片元用N_f计算光照I_f。✅ 考场速记“Gouraud 插颜色Phong 插法向”。题目若说“高光在三角形内部出现”一定是 Phong若说“高光被限制在顶点附近”则是 Gouraud。5.4 模型变换Model vs 视图变换View不是“物体动”vs“相机动”是“坐标系换”vs“视角换”易混点glTranslatef(1,0,0)是物体右移gluLookAt(1,0,0,...)是相机左移效果一样学生困惑“为何要分两个变换”。为什么混数学上等价但概念层级不同。怎么区分模型变换将物体从自身局部坐标系Object Space变换到世界坐标系World Space。描述“物体在世界中怎么摆”。视图变换将世界坐标系中的所有物体变换到相机坐标系Camera Space / Eye Space。描述“从相机视角看世界是什么样”。✅ 考场速记“模型变换是物体搬家视图变换是相机搬家”。gluLookAt(ex,ey,ez,...)的ex,ey,ez是相机在世界坐标中的位置不是相机自身坐标所以它属于视图变换而非模型变换。5.5 齐次坐标Homogeneous vs 普通三维坐标Cartesian不是“多一个数”是“为变换而生”的数学工具易混点(x,y,z,1)和(x,y,z)看起来就差一个1学生不理解为何要引入。为什么混教科书常从代数角度讲“方便矩阵表示”忽略几何本质。怎么区分普通三维坐标只能表示平移以外的变换旋转、缩放、剪切因为平移xxtx无法写成3×3矩阵乘法。齐次坐标[x,y,z,w]表示点当w≠0时对应笛卡尔坐标(x/w,y/w,z/w)w0时表示无穷远点方向向量。关键价值用4×4矩阵统一表示所有仿射变换包括平移[x,y,z,1] × [T] [x,y,z,1]。✅ 考场速记“齐次坐标是给平移发的‘入场券’”。没有它glTranslatef就无法融入 MVP 矩阵连乘gluLookAt生成的 View 矩阵其最后一行[0,0,0,1]正是为了保证w坐标不变维持点的性质。6. 什么时候用、什么时候别用一份来自山东大学考场的实战边界指南复习到最后知识不是堆在脑子里的名词而是能帮你在考场上快速决策的肌肉记忆。我整理了山东大学近年期末卷的 7 类高频题型结合你手头这份复习资料告诉你每个知识点在什么情境下必考、什么条件下绝对不考、遇到陌生题如何用已有知识推导。这不是押题而是建立你的“考点雷达”。6.1 流水线阶段题抓住“输入-输出-职责”铁三角这类题常以“以下操作属于哪个阶段”或“某步骤缺失会导致什么现象”形式出现。必考情境给出gluLookAt、glVertex3f、glutSwapBuffers等函数问所属阶段。解题口诀“顶点进像素出中间裁剪光栅化”。凡涉及glVertex*、glNormal*、glColor*等设置顶点属性 →顶点处理凡涉及glBegin(GL_TRIANGLES)、glEnd()→图元组装凡涉及glEnable(GL_DEPTH_TEST)、glBlendFunc→片元处理glutSwapBuffers()是输出控制不属于流水线内部阶段但考频极高。避坑提醒glClear()清空缓冲区是渲染前准备不属于任何流水线阶段glPushMatrix()/glPopMatrix()是矩阵栈管理服务于顶点处理但本身不是阶段。6.2 矩阵与变换题死磕gluLookAt三组参数的物理坐标系gluLookAt(ex,ey,ez, cx,cy,cz, ux,uy,uz)是山东大学的“送分题”也是“夺命题”。必考情境给出相机位置、目标点、上方向让你写出参数或给出参数问相机朝向。解题核心所有坐标都是世界坐标系World Space下的值。ex,ey,ez相机在世界中的坐标不是相机自己的原点cx,cy,cz相机镜头对准的世界中某点如(0,0,0)本文还有配套的精品资源点击获取