webgl 23.为正方体添加环境光

上一节我们给正方体添加了漫反射,但物体背光的部分几乎完全是黑色的,我们可以再添加环境光让物体显示的更真实。

ambient light.png

非常简单了,直接把环境光加上就行了

<script id="vertex-shader" type="glsl">
    attribute vec4 a_Position;
    attribute vec4 a_Color;
    attribute vec3 a_Normal;
    uniform vec3 u_LightColor;
    uniform vec3 u_LightDirection;
    uniform vec3 u_AmbientLight;
    uniform mat4 u_mvpMatrix;
    varying vec4 v_Color;

    void main() {
        gl_Position = u_mvpMatrix * a_Position;
        // 标准化(把长度变为 1 )
        vec3 normal = normalize(a_Normal);
        float nDotL = max(dot(u_LightDirection, normal), 0.0);
        vec3 diffuse = u_LightColor * a_Color.rgb * nDotL;
        vec3 ambient = u_AmbientLight * a_Color.rgb;
        v_Color = vec4(diffuse + ambient, a_Color.a);
    }
</script>
var u_AmbientLight = gl.getUniformLocation(gl.program, 'u_AmbientLight');
// 设置环境光
gl.uniform3f(u_AmbientLight, 0.2, 0.2, 0.2);

思考:

  1. 现在我们是针对每个顶点计算光照,光照后的颜色值还是会进行插值。要进行更加逼真的光照效果,可以在 fragment shader 中针对每个 fragment 计算光照,但这样性能肯定会有影响。

查看源码

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • <转>我也忘了转自哪里,抱歉,感谢原作者 什么是Shader Shader(着色器)是一段能够针对3D对象进行操作...
    星易乾川阅读 5,667评论 1 16
  • 1, OpenGL 编程模型 2, 管线流程(重点,每一个细节都要讲清楚) 渲染流水线,就是一系列有序的处理阶段的...
    rogerwu1228阅读 763评论 0 0
  • 转载http://wetest.qq.com/lab/view/315.html 移动平台硬件架构 移动平台无论是...
    李嘉的博客阅读 1,766评论 0 4
  • 转载注明出处:点击打开链接 Shader(着色器)是一段能够针对3D对象进行操作、并被GPU所执行的程序。Shad...
    游戏开发小Y阅读 3,479评论 0 4
  • 前一阵在公司用vue开发webapp,遇到一个用户拍照或者调用手机相册展示图片,然后上传服务器的需求,接触前端仅半...
    45b645c5912e阅读 6,926评论 8 35