精解 WbeGL着色器

2023-12-25 15:43:46

🐱 个人主页:SHOW科技,公众号:SHOW科技
🙋?♂? 作者简介:2020参加工作,专注于前端各领域技术,共同学习共同进步,一起加油呀!
💫优质专栏:前端主流技术分享
📢 资料领取:前端进阶资料可以找我免费领取
🔥 摸鱼学习交流:我们的宗旨是在「工作中摸鱼,摸鱼中进步」,期待大佬一起来摸鱼!
————————————————
版权声明:本文为CSDN博主「SHOW科技」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

WebGL是一种基于OpenGL ES 2.0的图形渲染API,用于在Web浏览器中实时渲染3D和2D图形。着色器是WebGL中一个至关重要的组成部分,它们用于控制图形的渲染过程,包括顶点的位置、颜色和纹理等属性。

WebGL着色器被编写成GLSL ES(OpenGL Shading Language for Embedded Systems)语言,它类似于C语言,并具有一些额外的特性和限制。

WebGL着色器通常包括两个部分:顶点着色器和片元着色器。

顶点着色器是一个程序,用于为每个顶点计算其最终的位置和属性。它接收输入数据,例如顶点的位置和法线,然后根据设置的变换矩阵和其他参数对其进行计算,最终输出变换后的位置。

片元着色器是一个程序,用于为每个像素计算其最终的颜色。它接收输入数据,例如纹理坐标和顶点属性,然后根据设置的光照模型、纹理样本和其他参数对其进行计算,最终输出最终的颜色。

编写WebGL着色器的过程通常包括以下步骤:

  1. 创建顶点着色器和片元着色器的源代码字符串。
  2. 创建WebGL着色器对象,并将源代码字符串分配给每个着色器对象。
  3. 编译和链接着色器,确保没有错误。
  4. 创建WebGL程序对象,并将顶点着色器和片元着色器附加到该程序对象。
  5. 链接和使用该程序对象,以便在渲染时使用。

在编写WebGL着色器时,可以使用GLSL ES语言提供的各种内置函数和变量来实现不同的渲染效果。同时,还可以使用uniform变量和attribute变量来传递和接收外部数据,例如矩阵、纹理和顶点属性等。

示例:

WebGL着色器是一种用于渲染3D场景的代码。它们由顶点着色器和片段着色器组成。顶点着色器处理每个顶点的位置和属性,片段着色器则处理顶点之间的插值颜色。

下面是一个简单的示例,展示如何在WebGL中创建并使用着色器。

首先,创建一个顶点着色器的代码:

attribute vec3 position;

void main() {
    gl_Position = vec4(position, 1.0);
}

这个代码片段定义了一个名为position的属性变量,表示顶点的位置。gl_Position变量表示变换后的顶点位置。这个着色器的功能是将顶点的位置直接传递给片段着色器。

接下来,创建一个片段着色器的代码:

void main() {
    gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
}

这个代码片段定义了一个gl_FragColor变量,表示最终的像素颜色。在这个示例中,我们将像素的颜色设置为红色。

然后,在JavaScript中,我们可以使用以下代码来创建和使用这两个着色器:

// 创建顶点着色器
const vertexShader = gl.createShader(gl.VERTEX_SHADER);
gl.shaderSource(vertexShader, vertexShaderCode);
gl.compileShader(vertexShader);

// 创建片段着色器
const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);
gl.shaderSource(fragmentShader, fragmentShaderCode);
gl.compileShader(fragmentShader);

// 创建程序对象
const program = gl.createProgram();
gl.attachShader(program, vertexShader);
gl.attachShader(program, fragmentShader);
gl.linkProgram(program);

// 使用该程序对象
gl.useProgram(program);

最后,我们可以在渲染循环中使用着色器来绘制图形:

// 绑定顶点属性
const positionLocation = gl.getAttribLocation(program, "position");
gl.enableVertexAttribArray(positionLocation);
gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);
gl.vertexAttribPointer(positionLocation, 3, gl.FLOAT, false, 0, 0);

// 清空画布
gl.clearColor(0.0, 0.0, 0.0, 1.0);
gl.clear(gl.COLOR_BUFFER_BIT);

// 绘制三角形
gl.drawArrays(gl.TRIANGLES, 0, 3);

这个示例只是一个简单的演示,着色器的功能远远超出了这个范围。通过编写更复杂的着色器代码,您可以实现更高级的3D渲染效果。

文章来源:https://blog.csdn.net/weixin_54165147/article/details/135193332
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。