欢迎来到皮皮网网首页

【lol选英雄源码】【键盘鼠标同步源码】【视听网源码】uiform源码分析

来源:中军超级赛道指标源码 时间:2024-12-29 13:46:33

1.OpenGL自学笔记(四)(着色器)
2.C++的源码随机数生成器均匀分布算法代码源码
3.CesiumJS 源码杂谈 - 从光到 Uniform
4.OpenGL ES 如何传输一个超大数组给着色器程序?
5.第二章:URL、HTML、分析XPath和JSON简介
6.OpenSees: Plain Pattern命令的源码理解

uiform源码分析

OpenGL自学笔记(四)(着色器)

       这一章节没有太多新内容,主要是分析对之前内容的复述。如果你熟悉shadertoy,源码那么这一部分可能不需要过多解释。分析lol选英雄源码更建议阅读资深人士的源码教程。

       着色器(Shader)是分析一种运行在GPU上的小程序,为图形渲染管道的源码特定部分提供支持。从基本意义上讲,分析着色器是源码一种将输入转换为输出的程序。着色器非常独立,分析它们之间不能相互通信,源码唯一的分析沟通方式是通过输入和输出。

       着色器使用GLSL(类似C语言)编写。源码除了GLSL,还有HLSL、CG等其他语言。GLSL是为图形计算专门设计的,包含针对向量和矩阵的有用特性。

       以下是着色器的基础结构。

       在顶点着色器中,每个输入变量被称为顶点属性。可声明的顶点属性数量有限,通常由硬件决定。一般至少有个(包含4个分量)的顶点属性可用。

       GLSL包含C等其他语言的大部分默认基础类型:int、float、double、unit和bool。同时还有两种容器类型:向量(Vector)和矩阵(Matrix)。

       GLSL中的向量是一个可以包含最高4个分量的容器,分量类型是基础类型之一。大多数情况下,键盘鼠标同步源码使用vecn就足够了。一个拥有4个分量的向量可以通过点访问符号进行访问,分别使用.x、.y、.z和.w来获取第1~4个分量。对于颜色,则使用rgba进行访问,同理对纹理坐标则使用stpq访问相同的分量。

       重组是向量分量的一种灵活用法,允许使用原来向量的分量任意组合形成一个新的向量。但是不允许从vec2中获取.z元素,即2维向量不能获取第四个分量。也可以把一个向量作为一个参数传给不同的向量构造函数。

       着色器是独立的小程序,但也是整体的一部分。因此,每个着色器都有输入和输出,以便进行数据交流和传递。GLSL定义了in和out关键字专门来实现这个目的。每个着色器使用这两个关键字设定输入和输出,只要一个输出变量与下一个着色器阶段的输入匹配,它就会传递下去。但在顶点和片段着色器中会有所不同。

       顶点着色器应该接收特殊形式的输入,否则会效率低下。顶点着色器的输入特殊在于它直接从顶点数据中接收输入。为了定义顶点数据该如何管理,使用location这一元数据指定输入变量,这样我们才可以在CPU上配置顶点属性。我们已经在前面的教程中看过这个了,layout (location = 0)。顶点着色器需要为它的输入提供一个额外的layout标识,以便将其链接到顶点数据。视听网源码也可以通过在OpenGL代码中使用glGetAttribLocation查询属性位置值(Location)。

       另一个例外是片段着色器,它需要一个vec4颜色输出变量,因为片段着色器需要生成一个最终输出的颜色。如果你在片段着色器中没有定义输出颜色,OpenGL会把你的物体渲染为黑色(或白色)。

       因此,如果我们打算从一个着色器向另一个着色器发送数据,我们必须在发送方着色器中声明一个输出,在接收方着色器中声明一个类似的输入。当类型和名字都一样的时候,OpenGL就会把两个变量链接到一起,它们之间就能发送数据了(这是在链接程序对象时完成的)。

       uniform是一种从CPU中的应用向GPU中的着色器发送数据的方式,但uniform和顶点属性有些不同。首先,uniform是全局的(Global)。全局意味着uniform变量必须在每个着色器程序对象中都是独一无二的,而且它可以被着色器程序的任意着色器在任意阶段访问。其次,无论你把uniform值设置成什么,uniform会一直保存它们的数据,直到它们被重置或更新。

       我们可以在一个着色器中添加uniform关键字至类型和变量名前来声明一个GLSL的uniform。从此处开始我们就可以在着色器中使用新声明的uniform了。通过uniform设置三角形的颜色:

       这里在片段着色器中声明了一个uniform的四维向量作为最终颜色输出。因为uniform是全局变量,可以在任何着色器中定义它们,而无需通过顶点着色器作为中介,所以不用在顶点着色器中定义这个uniform。

       如果声明了一个uniform却在GLSL代码中没用过,编译器会静默移除这个变量,导致最后编译出的eterm破解 登录源码版本中并不会包含它,这可能导致几个非常麻烦的错误!

       这个uniform现在还是空的;我们还没有给它添加任何数据,所以下面我们就做这件事。我们首先需要找到着色器中uniform属性的索引/位置值。当我们得到uniform的索引/位置值后,我们就可以更新它的值了。这次我们不去给像素传递单独一个颜色,而是让它随着时间改变颜色:

       glfwGetTime()获取程序运行秒数,使用sin得到[-1,1]区间的值,最后做一个[0-1]区间的规范化,储存为一个变量。用glGetUniformLocation查询uniform变量的位置值。参数就是着色器程序对象和uniform变量名。如果返回-1,意味着没有找到。最后是通过glUniform4f函数设置uniform变量的值(根据位置值设置变量)第一个参数是位置值,后面就是设置的值了。

       查询uniform地址不要求你之前使用过着色器程序,但是更新一个uniform之前你必须先激活程序,因为它是在当前激活的着色器程序中设置uniform的。

       现在写一个着色器类用来读取硬盘中的着色器文件,编译并链接它们。

       这里把所有的着色器类都放在头文件中。第一行的包含是用来防止链接冲突的,once意思是该头文件只被包含一次。着色器类储存了着色器程序的ID。它的构造函数需要顶点和片段着色器源代码的文件路径,这样可以把着色器源码的文本文件储存在硬盘上。use用来激活着色器程序。所有的set…函数能够查询一个uniform的位置值并设置它的值。

       这里我创建了一个新的CPP文件用来定义着色器头文件中的声明内容。

       构造函数中是处理着色器文件的读取并编译和链接着色器。而检查编译和链接的尤果网 源码函数如下。除此之外还有激活程序,自己额外加了个删除的程序。

       uniform的setter函数:

       创建一个着色器对象,读取文件路径即可。

       有可能这一步会出一点问题,不知道具体包含路径。我这里的../表示上级目录,这里是返回到解决方案文件夹了。

       其实可以在构造函数中的catch中打印当前输入的路径,就可以知道路径与资源文件夹中路径是否一致。

       最后在渲染循环中渲染:

C++的随机数生成器均匀分布算法代码源码

       在开发抽奖软件《抽奖软件》时,我需要一个高质量且速度快速的随机数生成器,同时确保生成的随机数具有均匀分布。以下为关键算法代码片段:

       首先,使用高质量的伪随机数生成器 "mt" 替换原始的 "rand" 算法,以提升生成随机数的质量与速度。

       其次,引入 "uniform_int_distribution" 来确保生成的随机数在指定范围内均匀分布。在这段代码中,其范围从0到 "n"。

       通过调用 "uniform_int_distribution" 的 "dist" 函数,并结合 "mt" 的实例 "pGen",可以获取一个位于0到 "n" 之间的均匀分布随机整数。

       整体而言,通过采用 "mt" 与 "uniform_int_distribution",我成功实现了高质量、快速且均匀分布的随机数生成器,为《抽奖软件》提供了理想的随机数支持。

CesiumJS 源码杂谈 - 从光到 Uniform

       CesiumJS 源码探索:光照与Uniform的转换之旅

       CesiumJS 对光照的处理主要依赖于其底层API与WebGL着色器的交互。尽管它默认只支持一个太阳光,但通过DirectionalLight扩展,可模拟各种光照效果。光在CesiumJS中被转换为Uniform值,以统一的形式传递给着色器执行。

       首先,CesiumJS的光照类型主要包括场景默认的太阳光和DirectionalLight,后者允许设定光照方向。例如,官方示例中的《Lighting》展示了如何运用DirectionalLight创建灯光效果。方向光多了一个方向属性,通常表示为单位向量。

       在源码中,光照信息通过UniformState对象在每帧渲染时传递给Renderer。这个过程始于Scene.js模块的render函数,其中的uniformState会更新来自FrameState的光照参数。当Context对象执行DrawCommand时,ShaderProgram的_uniforms列表会填充来自uniformState的值,包括那些由AutomaticUniforms自动更新的,如光的属性。

       光照Uniform在着色器中的应用十分广泛,如点云着色时使用czm_lightColor,冯氏着色法(Phong)材质通过czm_lightColor进行漫反射和高光计算,Globe.js则在GlobeFS片元着色器中使用czm_lightColor。在Model API的PBR着色法中,czm_lightColorHdr变量在光照阶段的计算中扮演重要角色。

       总的来说,CesiumJS的光照系统通过Uniform的转换,确保光照信息在复杂渲染流程中的顺畅传递。然而,深入研究光照材质,特别是在自定义光照效果方面,仍需要进一步学习实时渲染(RealTimeRendering)的知识。

OpenGL ES 如何传输一个超大数组给着色器程序?

       在OpenGL ES中,当需要将一个超大数组传给着色器程序时,可以采用三种方法:加载到纹理、使用uniform缓冲区对象(UBO)或纹理缓冲区对象(TBO)。

       将数组加载到纹理是常用方法。使用texelFetch函数能精确获取每个像素的值,此函数不涉及归一化、过滤和插值等复杂操作,使得直接访问纹理中每个像素内容成为可能。此方法简单直接,但需要考虑渲染结果的细微差异。

       如果使用uniform变量,数量受限于OpenGL ES配置,且管理复杂。此时可以引入UBO,作为专门存储uniform变量数据的缓冲区对象,其数据存储在显存,不受统一变量数量限制,同时与uniform块配合使用,提供更高效的数据传递方式。

       TBO和Buffer Texture的结合允许着色器访问由TBO管理的大型内存表。此方法在OpenGL ES 3.2及以上版本支持,操作类似纹理的使用,通过glTexBuffer绑定TBO,访问Buffer Texture的数据。

       总结三种方法,加载到纹理简单直接,适用于像素级访问;使用UBO灵活高效,突破uniform变量数量限制;TBO与Buffer Texture结合,提供大型数据高效访问途径。选择合适的方法取决于具体应用需求和性能考虑。

       

参考资料:

[1] khronos.org/opengl/wiki...[2] khronos.org/registry/Op...

       如需技术交流和获取源码,可添加微信:Byte-Flow,加入OpenGL ES技术交流群。

第二章:URL、HTML、XPath和JSON简介

       Scrapy是一个用于网络信息请求与提取的强大工具,要熟练使用Scrapy,了解网页的结构和如何有效提取信息是基本前提。

       一、URL简介

       URL(Uniform Resource Locator),统一资源定位符,是互联网上的标准资源地址表示。每一项互联网资源都对应一个唯一的URL,URL分为两部分,首部解析定位目标主机,第二部明确请求主机的资源,如HTML文档、或音乐。

       二、HTML文档

       在浏览器请求页面后,服务器响应的HTML文档是解析页面排版的基础。解析过程实现页面元素的加载、排序,最终在浏览器展示。如百度首页,通过查看网页源代码,能深入HTML文档结构。

       三、XPath语言

       用于在XML文档中定位信息,XPath基于XML树结构,支持元素、属性和文本节点的查找。通过XPath,能便捷地从HTML文档中抽取所需数据,解决正则表达式复杂性。

       四、XPath应用示例

       以获取今日头条的小时热闻为例,利用XPath表达式实现精准元素匹配。

       五、浏览器中的XPath使用与浏览器插件

       Chrome浏览器支持XPath的开发者工具,通过控制台输入XPath表达式即可定位元素。Xpath Helper插件简化了此过程,生成默认的XPath表达式,用户需要进一步优化。

       六、json介绍与应用

       json,轻量级数据交换格式,基于ECMAScript子集,提供简洁高效的数据存储与传输方式。Json类似Python字典,由键值对组成。用于从API接口获取信息,无需浏览网页。

       七、json的浏览器显示与工具

       遇到json格式的数据时,直接在浏览器查看往往不够直观。安装JSON Viewer插件可改进此问题,使json内容的查看和理解更加清晰。

       八、小结

       理解并熟练运用URL、HTML、XPath和json,不仅能够帮助我们高效地从网络上获取和分析所需数据,也能够优化数据处理过程,提升工作效率。

OpenSees: Plain Pattern命令的理解

       OpenSees

       OpenSees中的pattern命令用于指定结构的荷载加载模式。模式分为三种:Plain Pattern(用于静力分析),UniformExcitation Pattern(用于动力分析),和Multi-Support Excitation Pattern(多点激励,用于动力分析)。本文主要解释Plain Pattern的理解和注意事项。

       Plain Pattern包含:

       - patternTag:加载模式编号

       - tsTag:加载模式的时间序列编号

       - cFactor(可选,默认为1.0):常量因子

       - load:结点荷载

       - eleLoad:单元荷载

       - sp(位移加载):单点约束

       Plain Pattern包含三种加载形式:

       1.1 load

       - 形式一:Linear,表示外力随系统时间线性增加。每一步实际外力为系统时间乘以外力系数。例如,使用"integrator LoadControl 0.1"表示加载控制方式为力加载,系统时间步长为0.1s。"analyze "表示分析步长为,即1秒钟加载完成。

       - 形式二:使用给定的时间序列系数表达外力随时间的变化规律。

       - 形式三:与形式二等价,时间序列单独定义。

       1.3 eleLoad

       用于在单元上施加荷载,例如在element 1上施加某方向的均布荷载。

       1.4 sp

       用于位移加载,例如在节点1的2自由度方向(全局坐标系y方向)施加值为1的位移。

       2. 注意问题

       2.1 loadConst -time 0.0的作用:在涉及多个分析阶段(如重力分析后进行地震分析)时,使用此命令使重力负载保持恒定,并使系统时间重置为零,以便在下一阶段的分析中从零开始。

       2.2 sp ... -const:表示在不同步骤中,节点产生的位移值。

       3. 源代码

       使用OpenSees进行结构分析时,可以通过源代码控制荷载加载模式,以实现所需分析的精确控制。