AI 协作日志
学生 Web 实验作品平台
学号:202412211402001 · 来源:ai-log.md
# 实验一 AI协作记录 > 请记录本人真实的AI协作过程。不要只粘贴AI生成结果,应体现自己的判断、测试和核验。 ## AI协作1:理解数据流 ### 我的目标 搞清楚从 JavaScript 中写好顶点数组,到浏览器屏幕画出三角形整条数据流;分清 Buffer、顶点属性、着色器、光栅化各自做什么,不只是记函数调用。 ### 提示词 从 JavaScript 的 Float32Array 到屏幕上出现一个三角形,中间发生了哪些关键步骤?请结合 WebGL2 解释 Buffer、vertexAttribPointer、Vertex Shader、光栅化和 Fragment Shader 各自负责什么,不要直接修改我的代码。 ### AI关键回答摘要 1. JavaScript 在 CPU 内存创建`Float32Array`存放顶点坐标,此时数据还没有传到显卡; 2. `createBuffer`在 GPU 显存开辟一块存储空间,`bindBuffer`把该 Buffer 设置为当前激活对象,`bufferData`把 CPU 数组拷贝到 GPU 显存; 3. `vertexAttribPointer`依靠当前绑定的 Buffer,规定顶点属性如何读取显存里的连续字节,`enableVertexAttribArray`打开该属性通道; 4. `drawArrays`发出绘制指令,GPU 依次取出每个顶点送入**顶点着色器**; 5. 顶点着色器输出裁剪空间坐标;进行图元装配,把顶点组装成三角形; 6. **光栅化**把三角形几何图形拆解成大量片元(对应潜在像素); 7. 每一个片元送入片元着色器计算颜色,输出颜色写入帧缓冲,最终显示在 Canvas 画布上。 ### 我的判断 AI 讲的整体流程逻辑通顺,但我怀疑`vertexAttribPointer`是否会直接绑定 Buffer 对象,我之前以为调用这个函数的时候要传入 buffer 变量,这点需要对照自己 task1.js 源码验证。 ### 验证方法 打开 task1.html,对照 task1.js 源码逐行比对 AI 描述的每一步;查看`vertexAttribPointer`函数参数列表,看参数里有没有 buffer;阅读代码顺序:先`bindBuffer`,后`vertexAttribPointer`。 ### 验证结果 1. `vertexAttribPointer`函数参数列表**不接收 buffer 对象**;它读取的是上一步`gl.bindBuffer(gl.ARRAY_BUFFER, vBuffer)`绑定的当前 Buffer; 2. 代码流程和 AI 描述完全匹配:CPU 数组→bufferData 上传 GPU→设置读取规则→drawArrays 触发整条流水线; 3. 若忘记`enableVertexAttribArray`,属性通道关闭,图形就黑屏,这是课本也提到的坑。 ### 修正后的结论 `vertexAttribPointer`本身不传入 Buffer,它依赖当前绑定状态;Buffer、属性配置、开启属性三者缺一不可。数据流动是 CPU 内存 → GPU 显存 Buffer → 顶点着色器输入 → 图元装配 → 光栅化片元 → 片元着色器输出像素颜色。 --- ## AI协作2:程序调试 ### 现象 任务 3 代码运行后,左侧三角形可以正常显示,但是右侧四边形完全不显示,画布只有背景色,控制台没有报错。 ### 我的初步判断 猜想 1:四边形顶点坐标超出 NDC 坐标范围,跑到画布外面; 猜想 2:切换到四边形的 Buffer 之后,没有重新设置顶点属性读取规则`vertexAttribPointer`; 猜想 3:drawArrays 绘制时顶点数量参数写错。 ### 给AI的提示词 下面是一段 WebGL2 代码。第一个图形正常,第二个图形没有显示。请不要重写完整程序,只列出最可能的 3 个原因,并告诉我应该通过什么现象、Console 信息或代码检查逐一验证。 ### AI给出的关键建议 1. 更换新 Buffer 之后,忘记调用`vertexAttribPointer`;该函数只对**当前绑定的 Buffer 生效**,切换 Buffer 后属性不会自动更新读取源; 2. `drawArrays`第三个顶点计数参数错误,比如写成 3 而四边形实际需要 4; 3. 修改`uColor`时 Alpha 通道设置为 0,图形完全透明,肉眼看不见。 核验方法:打印顶点数量;临时给四边形写简单测试坐标;检查 uniform4f 的第四个 alpha 值。 ### 我实际进行的测试 1. 在渲染函数加入`console.log(quad.length/2)`打印四边形顶点数量,控制台输出 4,顶点计数没问题; 2. 检查`gl.uniform4f`,alpha 参数写的是 1,不是透明; 3. 在绑定四边形 Buffer 的代码后,补写一行`gl.vertexAttribPointer(vPosition,2,gl.FLOAT,false,0,0)`,刷新页面。 ### 测试结果 补写`vertexAttribPointer`之后,右侧四边形成功渲染出来,两个图形互不重叠,颜色区分正常。 ### 最终原因 WebGL 是状态机。绑定新 Buffer 之后,顶点属性仍然沿用旧 Buffer 的读取配置,没有重新设置`vertexAttribPointer`,GPU 依旧从旧三角形 Buffer 读取数据,四边形得不到正确顶点。控制台不会抛出错误,只会不绘制图形。 ### 是否采纳AI建议及理由 采纳 AI 给出的排查思路。AI 指出 3 种可能性,我通过打印、检查参数一一排除另外两个,定位真实问题;让我理解 WebGL 状态机:绑定 Buffer、属性配置、uniform 都是全局状态,切换绘制对象必须更新对应状态。 --- ## AI协作3:顶点属性与颜色 ### 我的目标 理解任务 4 中两个顶点属性:位置`vPosition`每个顶点读 2 个 float,颜色`vColor`每个顶点读 4 个 float。想搞懂`vertexAttribPointer`的 size 参数如何解析 Buffer 内存,为什么两个 Buffer 互不干扰。 ### 提示词 在 WebGL2 中,位置属性 vPosition 每个顶点提供 2 个 float,而颜色属性 vColor 每个顶点提供 4 个 float。请从 “GPU 怎样按 vertexAttribPointer 的参数读取 Buffer 中连续数据” 的角度解释两个属性的区别,不要只列参数定义。 ### AI关键回答摘要 1. `vertexAttribPointer`的第二个参数`size`:代表**单个顶点下,这个属性占用多少个 float**;GPU 读取缓冲区时,每读完一个顶点,就向后跳过 size 个浮点数读取下一个顶点; 2. 位置属性 size=2:每个顶点消耗 x、y 两个浮点数; 3. 颜色属性 size=4:每个顶点消耗 R、G、B、A 四个浮点数; 4. `vPosition`和`vColor`分别绑定两块不同 Buffer 对象;属性各自保存自己的读取配置(size、步长、偏移),相互独立,互不影响。 ### 对照实验 保持任务 4 其他代码完全不变,将颜色属性的`vertexAttribPointer(vColor, **4**, gl.FLOAT, false, 0, 0);`中的 size 参数,临时修改为`3`,运行观察效果,之后恢复原值 4。 ### 实际现象 三角形不再是平滑的红绿蓝渐变,整体颜色完全错乱,出现奇怪的杂色,没有预期色彩效果。控制台无报错。 ### 我的解释 size=3 告诉 GPU 每个顶点颜色只读取 R、G、B 共 3 个 float,把下一个顶点的 R 分量错误当作当前顶点 Alpha (A)。内存解析错位,颜色 Buffer 的数据被错误解析,所以画面色彩异常。没有语法报错,属于逻辑错误。 ### 最终结论 `size`决定 GPU 对缓冲区内存的解析粒度。不同顶点属性可以拥有不同 size,可以来自完全不同的 Buffer 对象。size 参数写错不会触发 JS 报错,只会渲染结果异常,这是 WebGL 开发中很隐蔽的错误;三角形内部平滑渐变来自光栅化阶段对 out/in 变量的自动插值,片元着色器拿到的不是原始顶点颜色,而是插值之后的颜色。