首页
学习
活动
专区
圈层
工具
发布

WebGL2 Shader实现的动态图形效果

前言 本文将介绍如何使用WebGL2创建一个动态的图像效果,该效果基于一个经典的着色器。我们将使用JavaScript和GLSL编写代码,并通过使用顶点着色器和片段着色器将其传递给WebGL上下文。...然后,我们设置一些基本的样式和初始化参数。接下来,我们编写顶点着色器和片段着色器的源代码,并将其编译为WebGL着色器对象。...我们还创建了一个程序对象,并将顶点着色器和片段着色器附加到该程序对象上,并链接它们。 通过使用缓冲区对象,我们将顶点数据发送到顶点着色器中,并通过属性变量将其与顶点着色器关联起来。...这样,我们可以根据鼠标和触摸的位置和数量来改变片段着色器中的图像效果。...` 编译着色器函数和创建程序 定义名为compile的函数用于编译着色器源代码 定义名为setup的函数,用于创建并链接程序对象,并将着色器附加到程序中 function compile(shader

65210
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    基础渲染系列(二)——着色器

    如果发生这种情况,则意味着我们不再有任何着色器编译错误了。但是,你可能仍会在控制台中看到残留的错误。它们往往会残留在哪里,而在着色器无错误重新编译时没有被清除。 ?...着色器编译器现在编译错误,说我们的着色器没有顶点和片段程序。着色器包含两个程序,顶点程序负责处理网格的顶点数据。就像我们在第1部分“矩阵”中所做的那样,这包括从对象空间到显示空间的转换。...在编辑器中选择着色器,然后查看检查器窗口。它显示有关着色器的一些信息,包括当前的编译器错误。还有一个带有“编译并显示代码”按钮和下拉菜单的“已编译代码”条目。...C#类中可以毫无顾及地更改中的字段和方法的顺序,但对于着色器而言并非如此。编译器从上到下工作。它不会向前看。 现在,已编译的片段程序包括tint变量。 ? ? ?...还有一些特殊的颜色语义,但是很少使用,并且并非在所有平台上都可用。 现在,已编译的片段着色器将使用插值数据而不是统一色调了。 ? ? 当然,顶点程序必须输出本地位置才能起作用。

    5.2K20

    OpenGL现代编程第二课——第一个多边形

    片段着色器所做的是计算像素最后的颜色输出,为了方便理解程序,该片段着色器一直输出“橘色”。该例子中片段着色器是一个具有4分量输出的向量。...着色器程序对象(Shader Program Object)是多个着色器合并之后并最终链接完成的版本,如果要使用刚才编译的着色器我们必须把它们链接(Link)为一个着色器程序对象,然后在渲染对象的时候激活这个着色器程序...已激活着色器程序的着色器将在我们发送渲染调用的时候被使用。 最后绘制三角形。...)); //编译 int is_success; //检查是否编译成功,未成功则需返回错误 char infoLog...m_shaderProgram, GLuint(fragmentShader)); glLinkProgram(m_shaderProgram); //之前编译的着色器附加到程序对象上

    1K10

    WebGL学习笔记 | 使用着色器绘制一个点

    顶点着色器程序 完整的着色器程序分为顶点着色器程序和片元着色器程序,我们先看下顶点着色器的程序代码,将它定义为一个JavaScript字符串: //顶点着色器程序 var VSHADER_SOURCE...gl_PointSize:表示点的尺寸(像素,默认为1.0) 上面代码中 gl_Position 内置变量必须被赋值,否则着色器就不能正常工作,gl_PointSize 则不是必须的,它的默认值为1.0...在 JavaScript 启用绘制 在 JavaScript 中初始化好着色器程序,进行编译、链接,最后一步就是进行绘制操作: //看上一篇《WebGL学习笔记 | 创建着色器程序》中有讲解... gl.useProgram...gl.TRIANGLES、gl.TRIANGLESTRIP、gl.TRIANGLEFAN first:指定从那个顶点开始绘制(整型数) count:指定绘制需要用到多少个顶点(整型数) 返回值: 无 错误...gl.getProgramParameter(program, gl.LINK_STATUS)) { var error = gl.getProgramInfoLog(program);

    1.1K30

    进阶渲染系列(一)——平坦和线框着色(导数和几何体)

    (四边形由三角形组成) 在执行此操作的同时,我们实际上已更改了所有依赖“My Lighting”包含文件的着色器的行为。因此,删除我们刚刚添加的代码。 ?...(逐三角形处理顶点) 几何着色器的附加价值是每个图元都将顶点反馈给它,因此在本例中每个三角形三个。网格三角形是否共享顶点无关紧要,因为几何程序会输出新的顶点数据。...要实际使用几何着色器,我们必须添加#pragma geometry指令,就像顶点和片段函数一样。最后,必须包括MyFlatWireframe而不是“My Lighting”。...将这些更改应用到我们的Flat Wireframe着色器的基础,附加和延迟的pass中。 ? 这将导致着色器编译器错误,因为我们尚未正确定义几何函数。必须声明它将输出多少个顶点。...在包含“My Lighting”之前,必须这样做。我们也可以在InterpolatorsGeometry中使用它,因此只需要写一次代码。 ? 为什么会出现转换编译错误?

    3.2K21

    最简WebGL教程,仅需 75 行代码

    编译着色器 OpenGL 的核心是栅格化框架,在这里我们可以决定如何实现除栅格化之外的所有内容。...两种着色器通常都是用 GLSL(OpenGL 着色语言)编写的,然后将其编译为 GPU 的机器代码。机器代码随后被发送到 GPU,因此可以在渲染过程中运行。...首先,我们编译顶点着色器并将其发送到GPU。此处着色器的源代码被存储在字符串中,但是也可以从其他位置加载。最终,该字符串被发送到 WebGL API。...属性本质上是一个输入,并且为每个这样的输入调用着色器。 一种称为 color 的 varying。这既是顶点着色器的输出(每个顶点着色器都有一个),也是片段着色器的输入。...接下来,我们用片段着色器执行相同的操作,将其编译并发送到 GPU。注意,片段着色器现在可以读取顶点着色器中的 color 变量。

    2.3K31

    1.opengl绘制三角形

    要注意蓝色部分代表的是我们可以注入自定义的着色器的部分。 ? 注意:片段着色器也称为片元着色器 ?...在现代OpenGL中,我们必须定义至少一个顶点着色器和一个片段着色器(因为GPU中没有默认的顶点/片段着色器)。...2.4 编译顶点着色器 我们已经写了一个顶点着色器源码,但为了能够让OpenGL使用它,我们必须在运行时动态编译它的源码。 我们首先要做的是创建一个顶点着色器对象,注意还是用ID来引用的。...,否则就是片元shader 下一步我们把这个着色器源码附加到着色器对象上,然后编译它: glShaderSource(vertexShader, 1, &vertexShaderSource, NULL...,该变量值为 vec4(1.0f, 1.0f, 0.0f, 1.0f),表示的是RGBA为(1,1,0,1),所以为黄色,而alpha值为1.0,表示完全不透明 2.6 编译顶点着色器 编译片段着色器的过程与顶点着色器类似

    1.6K30

    基础渲染系列(十七)——混合光照

    (混合光照 实时定向光+烘焙间接光) 我们不必更改着色器来支持此操作,因为前向base pass已将光照数据和主方向光照结合在一起。与往常一样,附加的灯光会从附加 pass里获得。...但是,这会产生编译器错误,因为该宏需要附加参数。从Unity 5.6开始,仅将方向阴影的屏幕空间坐标放入插值器中。现在可以在片段程序中计算点光源和聚光灯的阴影坐标。...为此,必须为宏提供来自第二个UV通道的数据,其中包含光照贴图坐标。 ? 这再次产生编译器错误。...随着着色器编译器随意移动代码,这不会告诉我们任何信息。如果有这种特殊情况的充分理由,则很难找到,因为Unity的着色器代码很复杂。所以我不知道。 对于我们的延迟光照着色器,已经有执行阴影淡出的代码。...(在两个定向光下 正确的衰减) 完全依靠UNITY_LIGHT_ATTENUATION是个好主意吗? 宏代码已稳定很长时间了。一直以来,都是与Unity自定义着色器的照明设置配合使用的最佳方法。

    3.4K40

    基础渲染系列(十一)——透明度

    (变化Alpha cutoff值) 着色器编译器将剪辑转换为丢弃指令。这是相关的OpenGL Core代码片段。 ? 这是Direct3D 。 ? 那阴影呢?...给此关键字添加一个着色器功能,包括基本pass和附加pass。 ? 在我们的自定义UI脚本中,添加RenderingMode枚举,在不透明和抠图渲染之间进行选择。 ?...现在,我们支持带有两个关键字的三种模式,分别用于基本pass和附加pass。 ? 在Fade模式下,必须将当前片段的颜色与已经绘制的内容混合在一起。这种混合是由GPU在片段程序之外完成的。...使用这些float属性代替必须可变的blend关键字。你需要将它们放在方括号内。这是旧的着色器语法,用于配置GPU。我们不需要在我们的顶点和片段程序中访问这些属性。 ?...在我们的例子中,某些DrawCall显然会产生错误的结果。发生这种情况是因为我们的着色器仍会写入深度缓冲区。深度缓冲区是二进制的,并不关心透明度。如果片段没有被裁剪,其深度最终将写入缓冲区。

    5.3K20

    基础渲染系列(三)多样化的表现——组合纹理

    (硬编码的平铺) 请注意,此时我们正在执行两个纹理采样,但最终仅使用了其中一个。这似乎很浪费。但真是这样嘛?看一下已编译的顶点程序。...看看着色器编译器做了啥? ? ? 这一次也只进行了一次纹理采样。编译器检测到重复的代码并对其进行了优化。因此纹理仅采样一次。结果存储在寄存器中并重新使用。...这意味着我们需要增加一个附加的UV对。 ? 通过使用细节纹理的平铺和偏移来转换原始UV,可以创建新的细节UV。 ? ? ? 注意在两个编译器顶点程序中如何定义两个UV输出。...复杂的着色器可能会受到该限制。 现在,我们可以在片段程序中使用额外的UV对了。 ? ? ? 我们的着色器现在可以正常使用了。根据细节纹理,主纹理现在变得更亮和更暗。 ? ?...但这会需要我们将更多数据从顶点传递到片段着色器,或计算像素着色器中的UV调整。但是通常地形的所有纹理的平铺相同。而且,Splat贴图完全没有平铺。因此,我们只需要一个平铺和偏移来控制实例。

    3.4K10

    Unity通用渲染管线(URP)系列(二)——Draw Calls(Shaders and Batches)

    pragma 一词来自希腊语,指的是一种行动,或一些需要做的事情。在许多编程语言中都使用它来发出特殊的编译器指令。 着色器编译器现在会报错说它找不到已声明的着色器内核。...它将在include指令的位置插入文件的全部内容,因此,如果多次包含同一文件,就会得到重复的代码,这很可能会导致编译器错误。...此时,着色器编译器将会失败,因为我们的函数缺少语义。必须用返回的值表明我们的意思,因为我们可能会产生大量具有不同含义的数据。...进行此工作的第一步是在着色器的Pass块的顶点和片段编译片段上方添加#pragma multi_compile_instancing指令。 ?...必须告诉Unity根据关键字是否已定义来编译着色器的不同版本。为此,我们将#pragma shader_feature _CLIPPING添加到其Pass中的指令中。 ?

    7.6K51

    基础渲染系列(十四)——雾

    (左边是我们的材质,右边是标准材质) 雾模式由着色器关键字控制,因此我们必须添加多编译指令以支持它们。可以为此使用一个预定义的multi_compile_fog指令。...(旋转会改变深度) 让我们向着色器添加对基于深度的雾的支持,以匹配Unity的方法。这需要对我们的代码进行一些更改。现在,我们必须将剪辑空间深度值传递给片段程序。...必须创建自己的着色器通道以渲染有用的东西。从简单的顶点和片段程序开始,这些程序使用顶点位置和全屏四边形的UV数据从源纹理复制RGB颜色。另外,让我们包括雾模式的多重编译指令。 ?...最明显的错误是我们在透明几何图形的顶部绘制了雾。为防止这种情况发生,我们必须在绘制透明对象之前应用雾化效果。可以将ImageEffectOpaque属性附加到我们的方法中,以指示Unity这样做。...接下来,定义FOG_DISTANCE,以表明我们希望将雾化基于实际距离,就像在其他着色器中一样。 ? 当需要距离时,我们必须对光线进行插值并将其发送到片段程序。 ?

    4.1K20

    OpenGL ES 3.0 | 围绕HelloTriangle实战案例 展开 渲染流程分析

    着色器 在OpenGL ES 3.0中, 除非加载有效的顶点和片段着色器,否则不会绘制任何几何形状; OpenGL ES 3.0程序必须至少有 一个顶点着色器 和 一个片段着色器; 着色器示例代码:...` 着色器从它生命的main函数开始执行; 实例着色器代码主题简单, vPosition输入属性 拷贝到 gl_Position的 特殊输出变量上; 每个顶点着色器 必须在 gl_Position变量中输出一个位置..., compiled, 0 ); 查看 着色器编译结果状态; 编译失败,则 报错(打印错误信息) 并 删除着色器实例; 编译成功,则返回 着色器id,后续 用于连接到程序对象; 创建一个程序对象并链接着色器...应用程序 为顶点和片段着色器 创建了 着色器对象 之后, 就需要 创建一个 程序对象; 程序对象 可视为 最终链接的程序; 不同的 着色器 编译为 一个 着色器对象之后, 它们必须连接到 一个 程序对象...1.0f, 1.0f, 1.0f, 0.0f ); } 至此,便完成了 编译着色器、检查编译错误、 创建程序对象、连接着色器、链接程序并检查链接错误等流程; 程序对象 成功链接之后,

    2K10

    基础渲染系列(五)——多灯光

    如果包含的文件又包含相同的其他文件,则最终将导致代码重复。这会导致有关代码重新定义的编译器错误。 为防止此类重新定义的错误,通常使用定义检查来保护包含文件。这是预处理程序,用来检查是否已定义。...Unity会同时渲染这两者,但是附加通道最终会覆盖基本通道的结果。这显然是错的, 附加通道必须将其结果添加到基本通道中,而不是替换它。我们可以通过更改附加通道的混合模式来指示GPU执行此操作。...打开的文件告诉我们,我们有两个片段,每个片段都有一个着色器变体。其实就是我们的基本和附加通道。 我们要为附加通道创建两个着色器变体。一种用于定向光,另一种用于点光源。...为此,我们在pass的代码中添加了多编译的编译指示。该语句定义关键字列表。Unity将为我们创建多个着色器变体,每个变体定义这些关键字之一。 每个变体都是单独的着色器。它们是单独编译的。...我们将在以后的教程中介绍该主题。 为了也支持聚光灯,我们必须将SPOT添加到我们的多编译语句的关键字列表中。 ? 我们的附加着色器现在具有三个变体。 ? 聚光灯的位置与点光源一样。

    3.2K20

    OpenGL ES 着色语言

    统一变量的命名空间在 顶点着色器 和 片段着色器 中都是共享的。如果两者中都声明了一个统一变量,那么两个声明必须匹配。...使用这个是必须查询偏移位置,而且不能在 顶点/片段着色器 或者 程序间共享,覆盖std140 和 shared std140 制定统一变量块的布局基于OpenGL ES 3.0规范的 “标准统一变量块”...language version GL_ES // this will be defined for ES shaders to a values of 1 指令: 指令名 描述 #error 将会导致在着色器编译时出现编译错误...在 片段着色器 中,浮点值 没有默认的精度值。 每个片段着色器必须声明一个默认的 float 精度。...不变性 OpengGL ES着色语言中引入 invariant 关键字可以用于任何可变的顶点着色器输出。 引入不变性的原因 :因为着色器需要编译,编译会导致指令重新排序的优化。

    1K30
    领券