From 33058f2b292b3a581333bdfb21b8f671898c5060 Mon Sep 17 00:00:00 2001 From: Peter Bengtsson Date: Tue, 8 Dec 2020 14:40:17 -0500 Subject: initial commit --- files/zh-cn/web/api/webglprogram/index.html | 105 ++++++++++++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100644 files/zh-cn/web/api/webglprogram/index.html (limited to 'files/zh-cn/web/api/webglprogram/index.html') diff --git a/files/zh-cn/web/api/webglprogram/index.html b/files/zh-cn/web/api/webglprogram/index.html new file mode 100644 index 0000000000..9113707d67 --- /dev/null +++ b/files/zh-cn/web/api/webglprogram/index.html @@ -0,0 +1,105 @@ +--- +title: WebGLProgram +slug: Web/API/WebGLProgram +tags: + - WebGL + - WebGLProgram + - 着色器使用 + - 着色器程序 +translation_of: Web/API/WebGLProgram +--- +
{{APIRef("WebGL")}}
+ +

WebGLProgram 是 WebGL API 的一部分,它由两个{{domxref("WebGLShader")}}s (webgl 着色器)组成,分别为顶点着色器和片元着色器(两种着色器都是采用 GLSL 语言编写的)。创建一个 WebGLProgram 需要调用 GL 上下文的{{domxref("WebGLRenderingContext.createProgram", "createProgram()")}} 方法,然后调用{{domxref("WebGLRenderingContext.attachShader", "attachShader()")}}方法附加上着色器,之后你才能将它们连接到一个可用的程序。

+ +

WebGLProgram 的创建过程请参考下面的代码:

+ +
var program = gl.createProgram();
+
+// 添加预先存在的着色器
+gl.attachShader(program, vertexShader);
+gl.attachShader(program, fragmentShader);
+
+gl.linkProgram(program);
+
+if ( !gl.getProgramParameter( program, gl.LINK_STATUS) ) {
+  var info = gl.getProgramInfoLog(program);
+  throw 'WebGL program 不能编译. \n\n' + info;
+}
+
+ +

查看 {{domxref("WebGLShader")}} api 了解更多关于创建以上例子中的顶点着色器片元着色器的信息。

+ +

示例

+ +

使用着色器程序

+ +

着色器程序在使用的过程中要分为几步,包括告知 GPU 来使用这段着色器程序,绑定合适的数据缓冲区,配置相关选项,最终把图像绘制到屏幕上。

+ +
// Use the program
+gl.useProgram(program);
+
+// Bind existing attribute data
+gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
+gl.enableVertexAttribArray(attributeLocation);
+gl.vertexAttribPointer(attributeLocation, 3, gl.FLOAT, false, 0, 0);
+
+// Draw a single triangle
+gl.drawArrays(gl.TRIANGLES, 0, 3);
+
+ +

删除着色器程序

+ +

如果在连接着色器程序的过程中发生了错误,或者你希望删除一个已经存在的着色器程序,你可以调用代码 {{domxref("WebGLRenderingContext.deleteProgram()")}},这将释放连接着色器程序的内存。

+ +
gl.deleteProgram(program);
+
+ +

规范

+ + + + + + + + + + + + + + +
规范状态说明
{{SpecName('WebGL', "#5.6", "WebGLProgram")}}{{Spec2('WebGL')}}初始定义。
+ +

浏览器兼容

+ + + +

{{Compat("api.WebGLProgram")}}

+ +

相关链接

+ + -- cgit v1.2.3-54-g00ecf