WebGLShader
Baseline Widely available *
This feature is well established and works across many devices and browser versions. It’s been available across browsers since 2015年7月.
* Some parts of this feature may have varying levels of support.
WebGL API 的 WebGLShader 可以是一个顶点着色器(vertex shader)或片元着色器(fragment shader)。每个 WebGLProgram 都需要这两种类型的着色器。
描述
要创建一个 WebGLShader 需要使用 WebGLRenderingContext.createShader,通过 WebGLRenderingContext.shaderSource() 然后挂接 GLSL 源代码 , 最后调用 WebGLRenderingContext.compileShader() 完成着色器(shader)的编译。此时 WebGLShader 仍不是可用的形式,他需要被添加到一个 WebGLProgram里。
js
function createShader(gl, sourceCode, type) { // Compiles either a shader of type gl.VERTEX_SHADER or gl.FRAGMENT_SHADER var shader = gl.createShader(type); gl.shaderSource(shader, sourceCode); gl.compileShader(shader); if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) { var info = gl.getShaderInfoLog(shader); throw "Could not compile WebGL program. \n\n" + info; } return shader; } 参看 WebGLProgram 关于添加着色器的信息。
范例
>创建一个顶点着色器(vertex shader)
注意,有很多其他方式编译和访问着色器(shader)源代码字符串。这些示例仅用于例证说明。
js
var vertexShaderSource = "attribute vec4 position;\n" + "void main() {\n" + " gl_Position = position;\n" + "}\n"; //从上面例子使用 createShader 函数。 var vertexShader = createShader(gl, vertexShaderSource, gl.VERTEX_SHADER); 创建一个片元着色器(fragment shader)
js
var fragmentShaderSource = "void main() {\n" + " gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);\n" + "}\n"; //从上面例子使用 createShader 函数。 var fragmentShader = createShader(gl, fragmentShaderSource, gl.FRAGMENT_SHADER); 规范
| Specification |
|---|
| WebGL Specification> # 5.8> |
浏览器兼容性
参阅
WebGLProgramWebGLRenderingContext.attachShader()WebGLRenderingContext.bindAttribLocation()WebGLRenderingContext.compileShader()WebGLRenderingContext.createProgram()WebGLRenderingContext.createShader()WebGLRenderingContext.deleteProgram()WebGLRenderingContext.deleteShader()WebGLRenderingContext.detachShader()WebGLRenderingContext.getAttachedShaders()WebGLRenderingContext.getProgramParameter()WebGLRenderingContext.getProgramInfoLog()WebGLRenderingContext.getShaderParameter()WebGLRenderingContext.getShaderPrecisionFormat()WebGLRenderingContext.getShaderInfoLog()WebGLRenderingContext.getShaderSource()WebGLRenderingContext.isProgram()WebGLRenderingContext.isShader()WebGLRenderingContext.linkProgram()WebGLRenderingContext.shaderSource()WebGLRenderingContext.useProgram()WebGLRenderingContext.validateProgram()