linkProgram 和 useProgram 分别执行了什么动作?

在 WebGL 中,linkProgram 和 useProgram 是两个关键的步骤,它们在着色器程序的使用过程中分别执行了不同的动作。

1. gl.linkProgram(program)

linkProgram 将已编译的着色器(Vertex Shader 和 Fragment Shader)链接成一个完整的 WebGL 程序对象。

具体动作:

  • 链接已附加的着色器 :linkProgram 将通过 gl.attachShader 附加到程序对象的顶点着色器和片段着色器链接在一起,形成一个可执行的 GPU 程序。
  • 检查链接状态 :linkProgram 会检查链接过程是否成功。如果链接失败(例如,由于不匹配的输入输出变量),WebGL 会抛出错误。
  • 生成最终的可执行程序:在链接成功后,WebGL 会生成一个完整的可执行程序,该程序可在 GPU 上运行。
javascript 复制代码
// 假设已经创建并编译了 vertexShader 和 fragmentShader
const program = gl.createProgram();
gl.attachShader(program, vertexShader);
gl.attachShader(program, fragmentShader);

// 链接着色器程序
gl.linkProgram(program);

// 检查链接是否成功
if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
    console.error('Program failed to link: ' + gl.getProgramInfoLog(program));
}

简要概括 :linkProgram 主要负责将已编译的着色器对象链接成一个可用于绘制的完整程序。

2. gl.useProgram(program)

useProgram 告诉 WebGL 使用哪个已链接的程序对象进行后续的渲染操作。

具体动作:

  • 激活指定的程序对象 :useProgram 将指定的程序对象设置为当前活动的程序。这意味着接下来的所有绘制调用都会使用这个程序进行渲染。
  • 设置全局状态:WebGL 会为这个程序初始化相应的状态,如 Uniform 变量、Attribute 位置等。
  • 准备 GPU 运行该程序 :在调用 useProgram 后,GPU 准备好使用该程序来执行所有绘制操作。
javascript 复制代码
// 使用之前链接好的程序
gl.useProgram(program);

简要概括 :useProgram 负责激活指定的程序,使其成为当前活动的程序,确保后续的绘制操作使用这个程序。

关系与区别

  • linkProgram 是将着色器链接成一个完整的程序对象,这个操作只需执行一次,除非你更改了着色器代码。
  • useProgram 是指定当前要使用哪个程序,这个操作可以在渲染过程中多次调用,以切换不同的着色器程序。

你可以将 linkProgram 看作是在编译和打包程序,而 useProgram 是在告诉 WebGL 运行哪个打包好的程序。

相关推荐
Flynt25 分钟前
axios 被投毒半年后,我把 npm 的"安全防线"实测了一遍:最信任的 SHA512 是安慰剂
前端·npm·node.js
excel1 小时前
Base62 和 Base64 有什么区别?
前端
风骏时光牛马2 小时前
大模型底层架构与AI源码深度剖析
前端
掘金挖土3 小时前
前端手摸手跑路之 AI 应用开发(九)
前端·后端
中文呀6 小时前
三维 GIS 离线缓存实战:逆向 CesiumOfflineCache,并亲手为它补上"自动更新"能力
前端
前进前进前进6 小时前
TRAE 全链路实战:做了一个警示牌一键生成器:纯 Canvas、单文件、零依赖
前端
小万7427 小时前
God‘s Eye View 深度解析:15 路公开信号 + CesiumJS 的浏览器级 OSINT 控制台,60 帧渲染的“真实间谍卫星模拟器”
前端
IT星宿7 小时前
浏览器标签页全是一个图标:我用名字哈希生成 favicon,让每个项目都有身份标识
前端
全栈项目管理程序猿7 小时前
ArcGIS JS 基础教程(32):体元系列 - VoxelSlice 体元切片
前端·javascript