AI 协作日志

学生 Web 实验作品平台

学号:202412211402011 · 来源:ai-log.md

# 实验一 AI协作记录
---
## AI协作1:程序调试
### 现象
任务3 中,第一个图形(左侧三角形)能正常显示,第二个图形(右侧四边形)没有显示,或者颜色不对。
### 我的初步判断
我一开始以为是四边形顶点坐标写错了,或者顶点数量给错了,想着是不是 `TRIANGLE_STRIP` 的 4 个顶点顺序有问题。
### 给AI的提示词
> 下面是一段 WebGL2 代码。第一个图形正常,第二个图形没有显示。请不要重写完整程序,只列出最可能的3个原因,并告诉我应该通过什么现象、Console 信息或代码检查逐一验证。
### AI给出的关键建议
AI 列了 3 个最可能的原因:
1. 绑定第二个 Buffer 后,没有重新调用 `vertexAttribPointer`,导致 GPU 仍按旧 Buffer 的地址读数据;
2. 绘制第二个对象前没有重新设置 `uColor`,或 `getUniformLocation` 拿到的是 `null`;
3. `drawArrays` 的顶点数量或 draw mode 写错(例如四边形仍用 `TRIANGLES` 但只给了 4 个顶点,无法组成完整图形)。
并建议通过 Console 是否有 uniform 相关报错、逐个打印 Buffer 绑定顺序来验证。
### 我实际进行的测试
- 在 `task3.js` 的 `render()` 里,分别给两次绘制加了 `console.log`,打印当前 `uColor` 的值;
- 检查了第二个对象的 `vertexAttribPointer` 是否在 `bindBuffer(quadBuffer)` 之后执行;
- 把四边形绘制前的 `gl.uniform4f` 注释掉一次,看颜色是否恢复成上一个对象(紫色)。
### 测试结果
- 第二次绘制前我没有重新设置 `uColor` 时,四边形显示成了和三角形一样的颜色,Console 打印确认 uniform 位置有效、但值是上一次设置的紫色;
- 重新在第二个对象绘制前调用 `gl.uniform4f(uColor, 0.2, 0.7, 0.9, 1.0)` 后,四边形颜色正常变为浅蓝。
### 最终原因
`uColor` 是 WebGL 的**全局状态**,它不会在两次 `drawArrays` 之间自动重置。绘制第二个对象前我没有更新 uniform,导致第二个对象沿用了第一个对象的颜色。同时也确认了:绑定新 Buffer 后确实需要重新调用 `vertexAttribPointer`,这一步我代码里本来就写了,所以真正的坑在 uniform 状态。
### 是否采纳AI建议及理由
采纳。AI 把"状态未更新"列在原因里,我通过注释掉 `uniform4f` 的对照测试验证了现象,和它的判断一致。这次让我真正理解了"当前 WebGL 状态会影响后续绘制"的含义。
## AI协作2:顶点顺序
### 我的疑问
任务2 / 任务3 / 任务5 里,四边形的顶点我都写成了"左下 → 右下 → 左上 → 右上",并且任务5 特别要求"顶点顺序不变"。我不太理解:为什么必须是这个顺序?如果换一种顺序,是不是就画不出四边形了?
### 提示词
> 在 WebGL2 中,用 gl.TRIANGLE_STRIP 画四边形时,顶点顺序为什么重要?4 个顶点是怎么组成四边形的?如果我把顺序打乱会得到什么结果?请结合 drawArrays 的解释方式说明,不要改我的代码。
### AI关键回答摘要
AI 给出了 `TRIANGLE_STRIP` 的核心规则:
- 它按我给定的顺序,**每连续 3 个顶点组成一个三角形**,所以 N 个顶点会得到 N−2 个三角形(4 个顶点 → 2 个三角形);
- 我的顺序 `v0(左下), v1(右下), v2(左上), v3(右上)`,实际是"锯齿形"排列,两个三角形是:
  - 三角1 = v0, v1, v2(左下、右下、左上);
  - 三角2 = v1, v2, v3(右下、左上、右上);
- 这两个三角形共用一条对角线 v1–v2,正好拼成一个完整的四边形;
- 顺序一旦打乱,GPU 还是"每连续 3 个顶点取一个三角形",但拼接关系变了,就可能出现三角形交叉、自交,或者根本不是四边形。
### 我的判断与验证
我原本以为顺序只是美观问题。为了验证,我在任务3 里把四边形顺序临时改成交叉排列 `v0, v1, v3, v2`(即"左下、右下、右上、左上"),其余数据不动,运行观察。
### 实际现象
改成交叉顺序后,画面里不再是规整的四边形,两个三角形发生了交叉重叠,出现了一个自交的、扭曲的形状,明显不是我想要的四边形。
### 最终结论
`TRIANGLE_STRIP` 的顶点顺序决定了 GPU 如何把顶点连成三角形,也决定了这些三角形的拼接关系。正确的"锯齿形"顺序(左下→右下→左上→右上)能让两个三角形共享一条对角线、拼成完整四边形;顺序错了,GPU 依然按"每连续 3 个顶点"取三角形,但拼出来的图形就会交叉、自交。所以任务5 要求保持顶点顺序不变,正是为了只改变 draw mode 这一个变量。
## AI协作3:图元类型的区别与使用
### 我的疑问
任务2 要求把 `gl.TRIANGLE_STRIP` 临时改成 `gl.POINTS`、`gl.LINE_STRIP`、`gl.TRIANGLES` 观察结果。我不太清楚这几种 draw mode 到底有什么区别、什么时候该用哪个,为什么同一组顶点只改一下模式,画出来的东西就差这么多。
### 提示词
> gl.POINTS、gl.LINES、gl.LINE_STRIP、gl.LINE_LOOP、gl.TRIANGLES、gl.TRIANGLE_STRIP、gl.TRIANGLE_FAN 这些 draw mode 有什么区别?用同一组 4 个顶点举例分别会画出什么?各自适合什么场景?不要只列参数定义。
### AI关键回答摘要
AI 把 draw mode 分成三类:
- **点类**:`POINTS` —— 每个顶点画一个点,N 个顶点 → N 个点;
- **线类**(只描边不填充):
  - `LINES`:每 2 个顶点一条独立线段(0-1、2-3…),奇数顶点忽略;
  - `LINE_STRIP`:顶点按顺序连成连续折线,N 个顶点 → N−1 条线段,**不闭合**;
  - `LINE_LOOP`:在 STRIP 基础上把末顶点连回首顶点,**闭合**,N 个顶点 → N 条线段;
- **三角形类**(填充):
  - `TRIANGLES`:每 3 个顶点一个独立三角形(0-1-2、3-4-5…),多余顶点忽略;
  - `TRIANGLE_STRIP`:每连续 3 个顶点一个三角形(0-1-2、1-2-3…),N 个顶点 → N−2 个三角形,共享边、省顶点;
  - `TRIANGLE_FAN`:以第 1 个顶点为公共中心组成扇形,N 个顶点 → N−2 个三角形。
关键点:`drawArrays(mode, first, count)` 里 `count` 永远是**顶点数**,`mode` 只决定 GPU 怎么把顶点连起来。
### 我的判断与验证
我理解到核心是"同一组数据,只改连接规则"。为了验证,我在 task2 里保持 4 个顶点和顺序不变,把 `TRIANGLE_STRIP` 依次改成 `POINTS`、`LINE_STRIP`、`TRIANGLES`,各跑一次。
### 实际现象
- `POINTS`:4 个孤立点;
- `LINE_STRIP`:v0-v1-v2-v3 的连续折线(不闭合);
- `TRIANGLES`:只画出 v0v1v2 一个三角形,第 4 个顶点被忽略;
- 改回 `TRIANGLE_STRIP`:两个三角形拼成一个完整四边形。
### 最终结论
相同顶点数据、改变 draw mode 会得到截然不同的图形,因为 draw mode 只决定 GPU 对顶点的"连接/解释方式",顶点本身没有变。所以任务2 的对照实验和任务5 的"只改 draw mode"探究,本质都是在看同一条顶点流在不同解释下的结果。使用时按目标选:散点用 `POINTS`、描边轮廓用 `LINE_LOOP`、独立三角片用 `TRIANGLES`、连续条带/四边形用 `TRIANGLE_STRIP`。