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中→最后进行片元处理。
灯光渲染:
疑问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的基本概念和技术。 首先,WebGL的基础知识包括理解其工作...
WebGL是一种基于OpenGL标准的JavaScript API,用于在任何兼容的Web浏览器中进行2D和3D图形渲染。它使得开发者可以在网页上实现交互式的、动态的图形效果,无需借助插件或外部应用程序。本资源“WEBGL学习资料-第1-7...
WebGL是一种基于OpenGL标准的JavaScript API,用于在Web浏览器中实现硬件加速的2D和3D图形渲染。它是WebGL学习笔记的重点,特别是在初学者阶段。WebGL的核心是光栅化引擎,它能够根据程序员编写的代码在GPU上绘制点...
WebGL(Web Graphics Library)是一种JavaScript API,用于在任何兼容的Web浏览器中渲染交互式的2D和3D图形,无需插件。它基于OpenGL标准,是WebGL的主要灵感来源,但设计为完全与Web集成,使得开发人员可以利用...
在“WebGL学习笔记(一)”中,我们将会探讨WebGL的基本概念、工作原理以及如何开始编写你的第一个WebGL程序。 1. **WebGL基本概念** - **上下文(Context)**:在HTML5中,WebGL是Canvas元素的一个上下文,通过`...
这个“WEBGL_webgl_”很可能是一份教程或教材,旨在帮助初学者掌握WebGL技术,并随着学习者的进步不断更新内容。 在WebGL中,我们主要通过JavaScript与GPU(图形处理器)进行通信,创建和操纵复杂的几何形状,应用...
WebGL 是一项在网页上渲染三维图形的技术,也是HTML5 草案的一部分。 《WebGL编程指南》的主要篇幅讲解了WebGL ...《WebGL编程指南》适合有一定前端开发基础,希望学习WebGL,但对三维图形学缺乏了解的程序员们阅读。
Unity通用WebGL模板Universal WebGL Template 1.2.1是一个专为开发WebGL游戏或应用程序设计的工具。Unity是一款强大的跨平台游戏引擎,它允许开发者创建高质量的3D和2D游戏,并将其发布到多种设备上,包括浏览器。...
WebGL是一种基于OpenGL标准的JavaScript API,用于在任何兼容的Web浏览器中进行2D和3D图形渲染。它使得开发者可以在无需插件的情况下,在网页上实现高性能的图形处理,为互联网用户提供了丰富的交互式视觉体验。 一...
这个"webgl文档以及工具"的压缩包很可能包含了关于WebGL的学习资料、API参考以及可能的辅助开发工具。 1. **WebGL基础概念**:WebGL是一种JavaScript API,它允许在浏览器中直接进行硬件加速的3D图形编程。通过...
标题中的“免窗nodejs深度学习库基于WebGL”指的是一个专为Node.js设计的库,它允许开发者在没有窗口或者浏览器环境的情况下创建并利用WebGL(Web图形库)进行深度学习运算。WebGL是一种在网页上实现硬件加速的3D...
### WebGL学习颜色与纹理 #### 一、理解Varying变量的作用 在WebGL中,顶点着色器(Vertex Shader)和片段着色器(Fragment Shader)之间通过Varying变量进行通信。当我们想要为每个顶点指定不同的颜色时,就需要用到...
这个“WebGL实战学习代码”压缩包很可能是包含了一系列教程或者示例代码,帮助学习者深入理解和实践WebGL技术。 WebGL基于OpenGL ES 2.0标准,通过JavaScript与HTML5 Canvas元素结合,让开发者能够在网页上直接绘制...
WebGL Inspector是一款强大的WebGL图形调试工具,专为前端开发者设计,用于检查和优化WebGL渲染性能。在浏览器环境中,WebGL是一种...对于学习WebGL或解决3D图形渲染问题的人来说,它是一个非常有价值的资源。
WebGL(Web Graphics Library)是一种JavaScript API,用于在任何兼容的Web浏览器中渲染交互式的2D和3D图形,无需插件。它基于OpenGL ES 2.0标准,并且是HTML5的一个组成部分,使得开发者可以在网页上直接进行图形...
Unity WebGL 是一种强大的工具,允许开发者将他们的3D游戏或应用程序直接嵌入到网页中,无需任何插件或额外...通过使用和学习这个模板,开发者可以更好地理解和掌握Unity WebGL的优化技巧,从而提升他们的项目体验。
本次分享的WEBGL视频教程目录如下, 本次分享的WEBGL最新视频第一季主要包括如下内容,全集49集,主要是WEBGL的基础知识,包括基本的几何基础,着色器,渲染等知识,基本上涉及到了WEBGL的基础知识的方方面面!...
通过Python-WebGLWind项目,开发者可以学习到如何将Python的数据处理能力与WebGL的3D渲染能力相结合,创建出具有高度互动性和实时性的可视化应用。对于想要在Web上实现大规模3D数据可视化的开发者来说,这是一个值得...