`

WebGL学习随手记(一)

阅读更多

 

Shader

varying vs 的输出, fs 的输入(在光栅化时进行了图元内线性插值)。在 vs,fs 中的声明必须一致。

uniform应用程序通过通过OpenGL ES 2.0 API 传送给 shader 的只读变量 ;uniform programobject 中是共享的,即一个 programobject 只有一组 uniforms 。如果 uniform 同时在 vs fs 中声明,必须具有相同的类型,并且在这两个 shader 中该 uniform 的值是一样的。在 link 时, linker 会为 program 中的每个 activeuniform 分配一个 uniformlocation 。应用程序使用这个 uniformlocation 作为标识来载入 uniform 的值。

attribute :只在vs中使用,用于指定per-vertex的输入。通常保存位置,法线,纹理坐标,颜色等数据。

 

WebGL渲染流程

JavaScript定义顶点/颜色等值→绑定到uniform和attribute变量上→提交到vertexShader中→顶点Shader进行差值处理→得到Varying变量→提交到fragmentShader中→最后进行片元处理。

 

webgl process

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

灯光渲染

疑问1:

shader-vs中

float directionalLightWeighting = max(dot(transformedNormal, uLightingDirection), 0.0);
疑问2:

setMatrixUniforms()中

        var normalMatrix = mat3.create();
        mat4.toInverseMat3(mvMatrix, normalMatrix);
        mat3.transpose(normalMatrix);
        gl.uniformMatrix3fv(shaderProgram.nMatrixUniform, false, normalMatrix);

 

第13章 片元级光照与多program对象

其中片元级光照的实现,是要对法线进行处理,如果法线和光线平行,那应该是最亮的,如果夹角越大,光线会越暗。

 

 

 

 

在左边的图中,B点将会相当明亮,因为B点的光线几乎是平行于法线的;而A点则会稍微暗一些,因为光线的入射角更大一些。在A点和B点之间的点,将会有一个从明到暗的渐变。这个效果看起来非常好。

 

 

 

 

 

 

 

右图中的那样。A点和C点都会比较暗,因为光线的入射角更大。假设我们仍然使用逐顶点光照,那么B点的明亮程度应该是A点和C点的平均值,所以B点也同样会比较暗。但是,这很明显是错误的!在B点,光线几乎是平行于法线的,所以它应该是其中最明亮的一个点。所以在计算顶点之间的片元光照时,我们必须逐个片元、逐个片元的单独进行计算。

 

 

函数回顾:

提交 uniform

a)    

gl.uniform1i(shaderProgram.useLightingUniform, lighting);

 

b)    

gl.uniform3f(
                shaderProgram.ambientColorUniform,
                parseFloat(document.getElementById("ambientR").value),
                parseFloat(document.getElementById("ambientG").value),
                parseFloat(document.getElementById("ambientB").value)
        );

 

c)  

gl.uniform3fv(shaderProgram.lightingDirectionUniform, adjustedLD);

 

d)   

gl.uniformMatrix4fv(shaderProgram.pMatrixUniform, false, pMatrix);

 

f)    

gl.uniformMatrix3fv(shaderProgram.nMatrixUniform, false, normalMatrix);

 

 

处理纹理

gl.activeTexture(gl.TEXTURE0);
gl.bindTexture(gl.TEXTURE_2D, crateTexture);
gl.uniform1i(shaderProgram.samplerUniform, 0);

 

处理Buffer

gl.bindBuffer(gl.ARRAY_BUFFER, cubeVertexPositionBuffer);
gl.vertexAttribPointer(shaderProgram.vertexPositionAttribute,cubeVertexPositionBuffer.itemSize, gl.FLOAT, false, 0, 0);
 

索引绑定

gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER,cubeVertexIndexBuffer);
gl.drawElements(gl.TRIANGLES,cubeVertexIndexBuffer.numItems,gl.UNSIGNED_SHORT,0); 

 

 

美轮美奂的高光效果

 

 

分享到:
评论

相关推荐

    WEBGL学习资料8-16

    这个“WEBGL学习资料8-16”的压缩包文件显然是一个专门针对WebGL初学者的学习资源集合,涵盖了从第8课到第16课的内容,旨在帮助学习者深入理解和实践WebGL的基本概念和技术。 首先,WebGL的基础知识包括理解其工作...

    WEBGL学习资料-第1-7课

    WebGL是一种基于OpenGL标准的JavaScript API,用于在任何兼容的Web浏览器中进行2D和3D图形渲染。它使得开发者可以在网页上实现交互式的、动态的图形效果,无需借助插件或外部应用程序。本资源“WEBGL学习资料-第1-7...

    webgl学习笔记初学记录00

    WebGL是一种基于OpenGL标准的JavaScript API,用于在Web浏览器中实现硬件加速的2D和3D图形渲染。它是WebGL学习笔记的重点,特别是在初学者阶段。WebGL的核心是光栅化引擎,它能够根据程序员编写的代码在GPU上绘制点...

    WebGL学习之路

    WebGL(Web Graphics Library)是一种JavaScript API,用于在任何兼容的Web浏览器中渲染交互式的2D和3D图形,无需插件。它基于OpenGL标准,是WebGL的主要灵感来源,但设计为完全与Web集成,使得开发人员可以利用...

    WebGL学习笔记(一).rar

    在“WebGL学习笔记(一)”中,我们将会探讨WebGL的基本概念、工作原理以及如何开始编写你的第一个WebGL程序。 1. **WebGL基本概念** - **上下文(Context)**:在HTML5中,WebGL是Canvas元素的一个上下文,通过`...

    WEBGL_webgl_

    这个“WEBGL_webgl_”很可能是一份教程或教材,旨在帮助初学者掌握WebGL技术,并随着学习者的进步不断更新内容。 在WebGL中,我们主要通过JavaScript与GPU(图形处理器)进行通信,创建和操纵复杂的几何形状,应用...

    webGL编程示例源码

    WebGL 是一项在网页上渲染三维图形的技术,也是HTML5 草案的一部分。 《WebGL编程指南》的主要篇幅讲解了WebGL ...《WebGL编程指南》适合有一定前端开发基础,希望学习WebGL,但对三维图形学缺乏了解的程序员们阅读。

    Unity通用WebGL模板Universal WebGL Template 1.2.1

    Unity通用WebGL模板Universal WebGL Template 1.2.1是一个专为开发WebGL游戏或应用程序设计的工具。Unity是一款强大的跨平台游戏引擎,它允许开发者创建高质量的3D和2D游戏,并将其发布到多种设备上,包括浏览器。...

    WebGL 开发介绍.zip

    WebGL是一种基于OpenGL标准的JavaScript API,用于在任何兼容的Web浏览器中进行2D和3D图形渲染。它使得开发者可以在无需插件的情况下,在网页上实现高性能的图形处理,为互联网用户提供了丰富的交互式视觉体验。 一...

    webgl文档以及工具

    这个"webgl文档以及工具"的压缩包很可能包含了关于WebGL的学习资料、API参考以及可能的辅助开发工具。 1. **WebGL基础概念**:WebGL是一种JavaScript API,它允许在浏览器中直接进行硬件加速的3D图形编程。通过...

    免窗nodejs深度学习库基于WebGL

    标题中的“免窗nodejs深度学习库基于WebGL”指的是一个专为Node.js设计的库,它允许开发者在没有窗口或者浏览器环境的情况下创建并利用WebGL(Web图形库)进行深度学习运算。WebGL是一种在网页上实现硬件加速的3D...

    WebGL学习颜色与纹理

    ### WebGL学习颜色与纹理 #### 一、理解Varying变量的作用 在WebGL中,顶点着色器(Vertex Shader)和片段着色器(Fragment Shader)之间通过Varying变量进行通信。当我们想要为每个顶点指定不同的颜色时,就需要用到...

    WebGL实战学习代码

    这个“WebGL实战学习代码”压缩包很可能是包含了一系列教程或者示例代码,帮助学习者深入理解和实践WebGL技术。 WebGL基于OpenGL ES 2.0标准,通过JavaScript与HTML5 Canvas元素结合,让开发者能够在网页上直接绘制...

    WebGL Inspector chrome插件 crx格式

    WebGL Inspector是一款强大的WebGL图形调试工具,专为前端开发者设计,用于检查和优化WebGL渲染性能。在浏览器环境中,WebGL是一种...对于学习WebGL或解决3D图形渲染问题的人来说,它是一个非常有价值的资源。

    WebGL编程指南PDF和源码

    WebGL(Web Graphics Library)是一种JavaScript API,用于在任何兼容的Web浏览器中渲染交互式的2D和3D图形,无需插件。它基于OpenGL ES 2.0标准,并且是HTML5的一个组成部分,使得开发者可以在网页上直接进行图形...

    Better-Minimal-WebGL-Template unity webgl打包模板 支持手机

    Unity WebGL 是一种强大的工具,允许开发者将他们的3D游戏或应用程序直接嵌入到网页中,无需任何插件或额外...通过使用和学习这个模板,开发者可以更好地理解和掌握Unity WebGL的优化技巧,从而提升他们的项目体验。

    webgl视频教程+学习资料

    本次分享的WEBGL视频教程目录如下, 本次分享的WEBGL最新视频第一季主要包括如下内容,全集49集,主要是WEBGL的基础知识,包括基本的几何基础,着色器,渲染等知识,基本上涉及到了WEBGL的基础知识的方方面面!...

    Python-WebGLWind一个WebGL风力动态可视化

    通过Python-WebGLWind项目,开发者可以学习到如何将Python的数据处理能力与WebGL的3D渲染能力相结合,创建出具有高度互动性和实时性的可视化应用。对于想要在Web上实现大规模3D数据可视化的开发者来说,这是一个值得...

Global site tag (gtag.js) - Google Analytics