WebGL - 示例 从文件中加载并使用不同着色器

因为对不同的场景以及不同的材质需要使用不同的着色器,因此需要使用多个着色器,而不是单个,单个着色器是无法绘制出很复杂的场景,因为有的物体没有纹理而有的有纹理以及别的效果

1、外部文件加载着色器

着色器语言就是 GLSL格式的代码,我们可以先把顶点和片元着色器分别写在.glsl后缀名的文件中,如果你的编译器支持这种语法检测,那么代码就会有颜色,而不仅仅是字符串样式显示,尽管着色器代码本身就是字符串

下面是将要绘制的单色立方体的着色器文件

single_vertex_shader.glsl

// 顶点着色器
attribute vec4 a_Position;
attribute vec4 a_Normal;
uniform mat4 u_MvpMatrix;
uniform mat4 u_NormalMatrix;
varying vec4 v_Color;

void main(){

    vec3 lightDirection = vec3(0.0, 0.0, 1.0); // 灯光的位置 在世界坐标系中
    vec4 color = vec4(0.5, 0.5, 0.8, 1.0);// 表面颜色
    gl_Position = u_MvpMatrix * a_Position; // 计算后的顶点坐标
    vec3 normal = normalize(vec3(u_NormalMatrix * a_Normal));//标准化法向量
    float nDot = max(dot(normal, lightDirection), 0.0);
    v_Color = vec4(color.rgb * nDot, color.a);
    
}

single_fragment_shader.glsl

precision mediump float;
varying vec4 v_Color;
void main(){
    gl_FragColor = v_Color
}

从外部文件加载着色器,其实就是加载.glsl文件,读取里面的数据,然后通过顶点着色器和片元着色器创建程序对象

关于如何加载外部文件的方法,在上一篇文章中有介绍,你也可以直接去我的gitee上仓库的lib目录直接下载加载器

2、创建程序对象

加载完.glsl文件之后,就可以使用这两个着色器程序了,创建program对象,下面是两个程序对象,通过四个着色器代码创建得到的

var singleProgram = createProgram(gl, single_vertex_shader, single_fragment_shader);
var textureProgram = createProgram(gl, texture_vertex_shader,texture_fragment_shader);

3、获取变量存储地址

采用javascript对象属性的方式,把每个变量的存储地址挂载到程序对象上,便于使用

// 获取 singleProgram 中的 attribute 和 uniform 变量存储位置
singleProgram.a_Position = gl.getAttribLocation(singleProgram, 'a_Position');
singleProgram.a_Normal = gl.getAttribLocation(singleProgram, 'a_Normal');
singleProgram.u_MvpMatrix = gl.getUniformLocation(singleProgram, 'u_MvpMatrix');
singleProgram.u_NormalMatrix = gl.getUniformLocation(singleProgram, 'u_NormalMatrix');

// 获取 textureProgram 中的 attribute 和 uniform 变量存储位置
textureProgram.a_Position = gl.getAttribLocation(textureProgram, 'a_Position');
textureProgram.a_Normal = gl.getAttribLocation(textureProgram, 'a_Normal');
textureProgram.a_TexCoord = gl.getAttribLocation(textureProgram, 'a_TexCoord');
textureProgram.u_MvpMatrix = gl.getUniformLocation(textureProgram, 'u_MvpMatrix');
textureProgram.u_NormalMatrix = gl.getUniformLocation(textureProgram, 'u_NormalMatrix');
textureProgram.u_Sampler = gl.getUniformLocation(textureProgram, 'u_Sampler');

4、设置顶点颜色以及法线信息

因为创建的是两个立方体,所以它们的顶点数据和顶点索引以及法线数据都是可以共用的

var cube = initVertexBuffers(gl);
if (!cube) {
    console.log('failed to set the vertex information');
    return false;
}

上面通过initVertexBuffers()方法来设置顶点信息

设置完公用的顶点信息后,一个立方体是需要加载贴图的,因此需要把贴图的数据给加载到贴图立方体的片元着色器上,此处是通过initTexture(gl, program)方法来进行设置

var texture = initTextures(gl, textureProgram);
if (!texture) {
    console.log('failed to intialize the texture.');
    return false;
}

设置完以上数据之后,就可以开始绘制

因为是三维物体,有z轴深度,需要开启深度

gl.enable(gl.DEPTH_TEST)
// 设置canvas清空后的颜色
gl.clearColor(0.0, 0.5, 0.5, 1.0)

5、设置视图矩阵参数

var viewProjMatrix = new Matrix4();
viewProjMatrix.setPerspective(30.0, canvas.width / canvas.height, 1.0, 100.0)
viewProjMatrix.lookAt(0.0, 0.0, 15.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);

下面就可以在循环渲染方法中,进行帧刷新渲染

实际上在真正的项目开发过程中,重复这些步骤是很繁琐的,对一些反复的操作封装比较好的引擎例如three.js它隐藏了webgl的内部执行流程,同时也内置了很多的着色器,每一种材质以及灯光的添加都对应了一种着色器,这些着色器是可以进行修改的,并且three.js也支持自己去写着色器以及原生webgl代码

https://ithanmang.gitee.io/webgl-notes/home/07-高级技术示例/08-使用不同着色器.html

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: WebGL 示例 zip 是一个压缩文件,其中包含了一些用于展示 WebGL 技术的示例代码和资源。WebGL 是一种基于 JavaScript 的图形渲染技术,可以在网页上实现高性能的 3D 图形渲染。WebGL 示例 zip 提供了一些实际的代码样例,可以帮助开发者更好地理解和使用 WebGL 技术。 WebGL 示例 zip 中通常包含了一些 HTML 文件、JavaScript 文件和一些资源文件,如纹理图片、着色器代码等。这些示例代码能够展示出一些常见的 WebGL 功能和效果,如加和渲染 3D 模型,实现光照效果,创建交互式的 WebGL 应用等。 使用 WebGL 示例 zip 可以方便地浏览和学习各种 WebGL 技术的实现方法和应用场景。可以通过解压缩示例代码,打开其中的 HTML 文件来查看示例效果。在每个示例中,可以看到对应的 JavaScript 代码,了解实现该效果的具体方法和代码结构。 通过参考和学习这些示例代码,开发者可以更好地理解 WebGL 技术的原理和应用,有助于快速上手和开发自己的 WebGL 应用。同时,WebGL 示例 zip 中的代码和资源也可以作为自己项目中的参考和借鉴,加快项目的开发进展。 总之,WebGL 示例 zip 提供了一种便捷的方式,帮助开发者学习和应用 WebGL 技术。以其丰富的示例代码和资源为基础,可以加速开发者对 WebGL 的理解和实践。 ### 回答2: WebGL 是一种用于在Web浏览器中呈现3D图形的JavaScript API。WebGL 示例 Zip 是一种以压缩包形式提供的WebGL示例合集。这些示例通常包含一些基本的3D图形渲染技术和效果的实现,旨在帮助开发者更好地了解和学习WebGL使用WebGL示例Zip通常包含一个或多个HTML文件、JavaScript文件和图像文件。通过解压缩这个压缩包,开发者可以在本地环境中运行这些示例,并通过查看和修改源代码,学习如何使用WebGL API来创建各种3D场景和效果。 WebGL示例Zip可供初学者和有经验的开发者使用。对于初学者来说,这些示例提供了一个直观的教学工具,可以通过运行和改变示例代码来学习不同WebGL技术和概念。对于有经验的开发者来说,这些示例可以作为参考和灵感的源泉,帮助他们实现自己的创意和项目。 WebGL示例Zip通常涵盖了一系列主题,例如基本3D物体渲染、光照和阴影、纹理贴图、相机和视角控制等。通过研究这些示例,开发者可以学习如何使用WebGL API中的不同函数和方法来实现这些效果。通过调整和修改示例代码,开发者还可以尝试自己的创意和实现独特的3D效果。 总而言之,WebGL示例Zip是一个有用的资源,可以帮助开发者学习和掌握WebGL的基础知识和技术。通过实践和改变示例代码,开发者可以逐渐探索和理解WebGL在Web图形编程中的应用。 ### 回答3: WebGL示例ZIP是一种压缩文件,其中包含了用于展示WebGL技术的示例代码和相关资源。WebGL是一种基于JavaScript的功能强大的图形库,它可以在网页浏览器中实现3D图形渲染。 当您下WebGL示例ZIP文件后,您可以将其解压缩到您的计算机上。解压后,您将会看到一些文件文件夹。通常,这些文件包括HTML文件、JavaScript文件和资源文件(如图像文件、模型文件等)。 在这些示例代码中,您将会发现一些用于创建和渲染3D图形的JavaScript函数和方法。这些示例代码通常包含一些基本的3D图形操作,如创建立方体、球体、平面等等。您还可以在这些示例代码中找到一些用于调整和控制3D图形效果的参数,如旋转、缩放和光照等。 通过运行这些示例代码,您可以在网页浏览器中实时查看并交互这些3D图形。您可以通过键盘和鼠标操作来旋转、平移和缩放这些图形,或者改变其外观和材质。 WebGL示例ZIP提供了一个学习和实验WebGL技术的良好起点。您可以通过查看和分析这些示例代码,了解WebGL编程的基本原理和技巧。同时,您也可以使用这些示例代码作为基础,自己创建和组合各种复杂的3D图形效果。 总之,WebGL示例ZIP是一个方便的资源包,它提供了丰富的示例代码和资源,帮助您更好地学习和掌握WebGL技术。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值