- 浏览: 1360226 次
-
文章分类
最新评论
-
极限_裁决:
第一题,a 没有定义全局变量不属于 window
第二题,由于 ...
你真懂JavaScript吗? -
netsupper:
1)a=1,答错了."a" in wind ...
你真懂JavaScript吗?
《OpenGLES 2.0 Programming Guide》学习笔记(持续更新)
《OpenGLES 2.0 Programming Guide》 学习笔记
1 介绍OpenGLES
gles由KhronosGroup创立,目前有3个版本1.0,1.1(统称1.x)和2.0。ES1.0,1.1由OpenGL1.3,1.5继承而来,ES2.0由OpenGL2.0继承而来。
OpenGLES 2.0的specifications有两份:theOpenGL ES 2.0 API specification和theOpenGL ES Shading Language Specification(OpenGL ES SL)。
下图是ES2.0的图形流水线,灰色的方框是可编程阶段。
VertexShader
vs实现了一种作用于顶点的通用可编程方法。Vs的输入由以下几种组成:
1)Attributes– 由顶点数组提供的Per-vertexdata。
2)Uniforms– vs使用的常量数据
3)Samplers– 一种特殊的uniform,用于表示vs使用的纹理。Samplers对于vs是可选的。
4)Shaderprogram – vs程序,源代码或者可执行的,描述了对于顶点进行的操作。
Vs的输出叫做varying变量。在primitiverasterization阶段,varying的值对于每个生成的fragment进行计算,并将结果作为输入传递给fragmentshader。从赋予图元每个顶点的varying值为每个fragment生成一个varying值的机制叫做插值(interpolation)。
下图是vs的输入输出图:
Vs可用来进行传统的基于顶点的操作,例如使用矩阵变换位置、进行光照计算产生一个per-vertex的颜色、生成或变换纹理坐标。然而,因为VS是一个程序,VS可以用来进行任意的自定义顶点变换。
一个简单的VS:
uniformmat4 u_mvpMatrix;
attributevec4 a_position;
attributevec4 a_color;
varyingvec4 v_color;
voidmain()
{
v_color= a_color;
gl_Position= u_mvpMatrix*a_position;
}
其中gl_Position是一个内置的varying,不用声明,vs必须向它写入。Main函数是shader唯一的入口点。
PrimitiveAssembly 图元装配阶段
vs之后的流水线阶段就是图元装配,所谓图元是指可以用OpenGLEs绘制命令绘制的基本几何体。图元由顶点组成,顶点有各种属性,如位置和颜色。vs使用这些属性进行计算。在图元集成阶段,经过shade的顶点被集成进一个个独立的几何图元中,例如三角形,线或点精灵。对于每个图元,必须对其进行viewfrustum裁剪。如果图元部分在viewfrustum中,会被clip,如果图元完全在viewfrustum外则被丢弃。clipping之后,顶点的位置被转换到屏幕坐标系。另外,背面剔除也会在这阶段进行。这之后,图元就准备被传送到下一个阶段-光栅化。
Rasterization光栅化阶段
光栅化将图元转化成二维片段(fragments)的集合,这些片段将被fragmentshader处理。Fragment表示了可以被绘制到屏幕上的像素。(注:图元的属性是之前VS输出的varying,在光栅化阶段,基于图元的varying值被插值计算为基于片段的varying值)
FragmentShader
Fs实现了一种作用于片段的通用可编程方法。FS对光栅化阶段产生的每个片段进行操作。
Fs的输入:
1)Varyingvariables :Vs输出的varying经过光栅化插值后对每个片段产生的值。
2)Uniforms:FS使用的常量数据
3)Samplers:一种特殊类型的uniform,表示FS使用的纹理
4)Shaderprogram:FS程序,代码或可执行的,描述了对于片段的操作。
Fs可以丢弃片段或者为片段生成一个颜色,输出保存到gl_FragColor中。
光栅化阶段生成的color,depth,stencil和窗口坐标(Xw,Yw)将会成为流水线per-fragment操作阶段的输入(FS之后的阶段)。
一个简单的FS程序:
precisionmediump float;
varyingvec4 v_color; // input vertex color from vertex shader,VS必须写这个v_color
voidmain(void)
{
gl_FragColor= v_color; //gl_FragColor是唯一的输出
}
Per-FragmentOperations阶段
Fs之后就是逐片段操作阶段。光栅化产生的一个片段,具有窗口坐标(Xw,Yw),只能修改framebuffer中位置在(Xw,Yw)的像素。
下图是Per-FragmentOperations阶段的操作过程:
其中PixelOwnershipTest是用来决定framebuffer中某个位置的像素是否属于OpenGLES的context,比如如果OpenGLES的显示窗口被其他窗口遮住了,则一些像素就通不过这个测试,也就不会被OpenGLES显示。(似乎程序不需要控制这个)
Scissortest:测试(Xw,Yw)的片段是否在scissor矩形内,如果不在,片段被丢弃。
Stenciland depth test:测试incomingfragment的stencil和depth值,决定片段是否被丢弃。
Blending:将新产生的片段的颜色和framebuffer中相应位置像素的颜色进行混合。
Dithering:抖动
在per-fragment阶段之后,(Xw,Yw)处的片段要么被拒绝要么会产生一个fragmentcolor,depth,stencil值写入到framebuffer的(Xw,Yw)位置。Fragmentcolor, depth, stencil值是否真的写入framebuffer还取决于相应的writemasks是否enable。
另外,OpenGLES2.0也提供了从framebuffer回读像素的接口,但只有colorbuffer可以回读,depth和stencil值是读不到的。
alphatest不再在pre-fragmentstage中支持,需要在fragmentshader中实现
logicOp被去掉了,因为很少使用。(alphatest和logicop在OpenGL2.0和OpenGLES1.x中是存在的)
ES2.0和ES1.1的兼容性
ES2.0不向后兼容ES1.1,2.0不支持1.1中的固定功能流水线。2.0用vertexshader代替了1.1中的固定功能顶点处理单元,即:顶点T&L,纹理坐标生成和变换,顶点颜色计算。fragmentshader代替了1.1的固定功能texturecombine单元,即为每个textureunit实现一个texturecombine stage。
(不同于OpenGL2.0,OpenGL2.0是完全向后兼容的,同时支持可编程流水线和固定流水线。)
EGL简介
OpenGLEs命令需要一个renderingcontext和一个drawingsurface。Renderingcontext存储OpenGLEs状态。Drawingsurface是图元绘制上去的surface,drawingsurface指定了渲染所需的buffer的类型,例如colorbuffer, depth buffer和stencilbuffer,以及每种buffer的位数。
OpenGLES API不提供如何创建renderingcontext并且attach到natviewindow system。EGL是一个在OpenGLEs和native windowsystem之间的接口。然而厂商在实现OpenGLEs时并不一定提供EGL,不同平台可能有各自的接口。
2 Shaders and Programs
-----------创建编译shader---------------------------
Gluintshader = glCreateShader(type);
glShaderSource(shader, 1,&shaderSrc, NULL);
glCompileShader(shader);
-----------program------------------------------------
创建:
Gluintprogram = glCreateProgram();
Attach:
glAttachShader(program,shader);
1)一个programobject必须且仅能attach一个vs和一个 fs
-
attach可以在任意时刻进行,哪怕shader没有compile,甚至没有source。
-
可用glDetachShader从program上移除shader。
-
如果一个shader已经被attach到一个programobject上,调用glDeleteShader不会立即删除这个shader,这个shader会被标记为待删除,一旦这个shader不再attach到任何programobject上,这个shader的内存将被释放。
Link:
当两个shader被attach到program上,并且shader已经成功compile,使用glLinkProgram连接program。
1)linker会检查,确保fs使用的所有varyingvariables会被vs写入,并且被声明成同样的类型
2)linker会检查,确保vs和fs中声明的uniforms具有匹配的类型
3)linker会确保最终的program适合实现的限制(即,attribute,uniform, varying的数量,使用的指令)
link阶段会产生最终的硬件指令(link是在GPU上进行的)
有些问题如纹理没有被绑定到samper,在Link时是不能查到的,可使用glValidateProgram(program);验证program是否可以在当前状态下执行。这个操作很慢,一般只在debug版本中使用。
使用:
glUseProgram(program);
-----------uniformsand attributes------------------------------------
uniform: 应用程序通过通过es2.0API传送给shader的只读变量;uniform在programobject中是共享的,即一个programobject只有一组uniforms。如果uniform同时在vs和fs中声明,必须具有相同的类型,并且在这两个shader中该uniform的值是一样的。在link时,linker会为program中的每个activeuniform分配一个uniformlocation。应用程序使用这个uniformlocation作为标识来载入uniform的值。(location需要手动查询得到)
所谓“active”的uniform是值在program中实际使用的uniform,如果仅仅是声明不算。
载入uniform值,首先使用
glGetActiveUniform(program,index, bufSize, &length, &size, &type, uniform_name);
获得uniform的名字,以及数据类型type,数组元素数size(如果不是数组size就是1)
然后使用
location= glGetUniformLocation(program, uniform_name);
获得uniform的location。这样就可以使用一系列的glUniform*函数载入uniform的值。
使用glUniform*的时候,不用programhandle作为参数,因为这是针对当前use的program的。但是一旦为一个program中的uniform设置了值后,这个值将会保存在这个program中。
Gettingand Setting Attributes:
@seeChapter6 “Vertex Attributes, Vertex Arrays and Buffer Objects”
3 OpenGL ES Shading language (GLESSL)
数据类型
float,int, bool
float,vec2, vec3, vec4
int,ivec2, ivec3, ivec4
bool,bvec2, bvec3, bvec4
mat2,mat3, mat4
变量声明
floatspecularAtten;
vec4vPosition;
mat4mViewProjection;
ivec2vOffset;
变量可以在声明时初始化也可以以后初始化。初始化通过使用构造器完成,构造器也被用作类型转换。
变量构造器
GLESSL的类型转换是很严格的,变量只能被赋值给相同类型的变量或者和相同类型的变量一起计算。为了进行类型转换,语言中有很多构造器。
FloatmyFloat = 1.0;
boolmyBool = true;
intmyInt = 0;
myFloat= float(myBool); //convert from bool-> float
myFloat= float(myInt);
myBool= bool(myInt);
向量的构造:
单标量参数-向量所有分量值设置为该标量
多标量或向量参数构造– 向量分量从左到右赋值,参数必须够用
vec4myVec4 = vec4(1.0); // myVec4={1.0,1.0,1.0,1.0}
vec3myVec3 = vec3(1.0, 0.0, 0.5);
vec3temp = vec3(myVec3);
vec2myVec2 = vec2(myVec3); //myVec2 = {myVec3.x, myVec3.y}
myVec4= vec4(myVec2, temp, 0.0); //myVec4={myVec2.x, myVec2.y, temp.x, 0.0}
矩阵的构造:
如果只提供一个标量参数,这个值被设置在矩阵对角线上,例如mat4(1.0)会构造一个4X4单位阵。
矩阵可用多个向量构造;可用多个标量构造;或者向量和标量混搭构造。
访问向量和矩阵的成员
向量可用点访问(”.”) 或数组下标访问。可以用{x,y,z,w},{r,g,b,a},{s,t,r,q}这几种分量名字,但不可混用。
向量可通过点访问重新排序,如:
vec3myVec3 = vec3(0.0, 1.0, 2.0);
vec3temp;
temp= myVec3.xyz; // temp = {0.0, 1.0, 2.0}
temp= myVec3.xxx; // temp = {0.0, 0.0, 0.0}
temp= myVec3.zyx; // temp = {2.0, 1.0, 0.0}
下标访问,从0开始,[0]=x,[1]=y,[2]=z;下标如果不是常量,gles2.0可能不支持。
矩阵被看出是由很多向量组成。例如mat3是由3个vec3组成。矩阵的列用数组下标选择。
然后每个列向量使用向量访问规则。例如:
mat4myMat4 = mat4(1.0); //单位阵
vec4col0 = myMat4[0];
floatm1_1 = myMat4[1][1];
floatm2_2 = myMat4[2].z;
常量
可定任意基本类型的常量。常量变量在shader中值不改变。常量必须在声明时初始化。
const float zero = 0.0;
constfloat pi = 3.14159;
constvec4 red = vec4(1.0, 0.0, 0.0, 1.0);
constmat4 identity = mat4(1.0);
结构体
structfogStruct
{
vec4color;
floatstart;
floatend;
}fogVar;
fogVar= fogStruct(vec4(0.0,1.0,0.0,0.0), 0.5, 2.0);
数组
floatfloatArrary[4];
vec4vecArray[2];
关于数组的重要事项:
1)很多OpenGLEs实现不允许使用无法在编译时确定值的变量去索引数组。
2)不能在创建时初始化数组-没有这样的语法。因此,数组不能是常量。数组元素需要逐个初始化。
操作符
操作必须使用于具有相同基本类型的变量之间
*, / , + , - (基本类型必须是float或者int,乘法可在floats,vectors,matrices之间组合)
++, --
=
+=,-=, *=, /=
==,!=, <, >, <=, >= (只能作用于标量,要比较向量使用内置函数)
&&
^^(逻辑异或)
||
函数
和c类似,最大的区别在于参数的传入方式。OpenGLES提供了特定的修饰符来定义参数是否可以被函数修改:
in (默认,如果不指定)passedby value,不会被函数修改
inout passed by reference, 如果被修改,函数返回后改变值。
out 变量的值不传入函数,函数返回时变量修改。
例子:
vec4myFunc(inout float myFloat, out vec4 myVec4, mat4 myMat4);
例子,计算diffuse光照的函数:
vec4diffuse(vec3 normal, vec3 light, vec4 baseColor)
{
returnbaseColor * dot(normal, light);
}
另外,函数不可以递归,因为一些实现会以inline的方式实现函数调用。
内置函数
使用例子,计算高光:
floatnDotL = dot(normal, light);
floatrDotV = dot(viewDir, (2.0*normal)*nDotL - light);
floatspecular = specularColor * pow(rDotV, specularPower);
控制流
和c类似,但有很多限制。
1)判断表达式必须是bool类型(bool变量或者比较表达式),因为glessl不支持隐式转换。
2)使用循环有各种限制,归结为:OpenGLES必须在编译时知道迭代数。
必须只有一个循环迭代变量,并且只能使用简单的表达式增加或减少(i++,i--,i+=constant,i-=constant);
循环的结束条件判断必须是循环索引和一个常量表达式之间的比较;
不能在循环中改变迭代变量的值;
基本上,gles2不需要实现真正支持loop,它这样限制loop是为了让编译器可以将loop展开。
Uniforms
uniform变量保存应用程序通过OpenGLES2.0API传给shader的只读值。uniform可以保存shader使用的各种数据,如变换矩阵,光的参数或者颜色。基本上,shader需要使用的任意参数如果对于所有的顶点和片段都是常量(但在编译时不知道)应该传入给uniform。
Uniform变量在全局范围内定义:
uniformmat4 viewProjMatrix;
uniformmat4 viewMatrix;
uniformvec3 lightPosition;
uniform存储于硬件上的“constantstore”, 可使用的数量有限制。OpenGLES2.0至少支持128个vertexuniform vectors和16个fragmentuniform vectors。
Attributes
只在vs中使用,用于指定per-vertex的输入。通常保存位置,法线,纹理坐标,颜色等数据。
attributevec4 a_position;
attributevec4 a_texCoord0;
attribute数量的限制:至少是8。
Varyings
vs的输出,fs的输入(在光栅化时进行了图元内线性插值)。在vs,fs中的声明必须一致。
varyingvec2 texCoord;
varyingvec4 color;
varying在硬件上就是interpolator(插值器),数量至少为8.
Preprocessorand Directives 预处理器和指令
宏定义和测试指令:
#define
#undef
#if
#ifdef
#ifndef
#else
#elif
#endif
宏不能用参数定义;#if,#else,#elif可以使用defined测试某个宏是否定义。
预定义的宏:
__LINE__
__FILE__ //ES2.0中总是0
__VERSION__//OpenGL ES Sl的版本(e.g,100)
GL_ES //1
#error指令会在编译shader时引发一个编译错误并将message写入infolog。
#pragma指定用于编译器实现相关的指令。
#version指令用于表示glesslshader语言的版本,必须写在最上面,目前版本是#version 100
#extension用于厂商对语言的扩展。
Uniformand Varying Packing
存储布局为4Xn网格,packing自动进行。
PrecisionQualifiers
用于指定任意基于float或者int类型的变量。
highpvec4 position;
varyinglowp vec4 color;
mediumpfloat specularExp;
如果变量没有指定精度,则使用默认精度。默认精度在shader代码头部指定:
precisionhighp float; //用于所有基于浮点数值的变量
precisionmediump int; //用于所有基于整型值的变量
在vertexshader中,如果没有指定默认精度,则int和float的默认精度都是highp。对于fragmentshader,float类型的默认精度没有默认值,必须显示的声明。并且在fs中,不一定支持highp,可查询得知是否支持(GL_FRAGMENT_PRECISION_HIGH定义,或者查询OES_fragment_precision_high扩展)。
#ifdefGL_FRAGMENT_PRECISION_HIGH
precisionhighp float;
#else
precisionmediump float;
#endif
Invariance
invariant关键字可以作用于vs输出的任意varying变量上。
shader在编译时,编译器可能进行优化,导致指令被重排。这意味着两个shader间相同的计算,不一定产生精确相等的结果。这对于multipass渲染来说是个问题,一个物体被渲染多次,如果计算出来的位置有差别,就会有瑕疵。比如产生z-fighting。
使用invariant可以在写shader时指定如果使用了相同的计算,输出的结果必须精确一致。
invariant关键字可以使用在varying声明上或者已经声明的varying上。
invariantgl_Position; //内置的已经声明的varying,使用invariant
invariantvarying texCoord; //声明时使用invariant
可以使用#pragma指令器然所有的变量invariant:
#pragmaSTDGL invariant(all)
注意,为了实现invariant,编译器限制了优化,所有仅当需要时才使用invariant。
4 Vertex Attributes, Vertex Arrays, VBO
什么是attributes?
如何指定attributes数据和他们支持的数据类型?
如何将attribute的索引和vertexshader中相应的顶点attribute名字绑定?
什么是attributes?
顶点数据或称为顶点属性,是给每个顶点指定的数据,可以每个顶点逐一指定也可所有顶点使用一个常量值。
在opengles 1.1中,顶点属性有预定义的名字,例如position,normal,color,texturecoordinates。因为固定流水线只需要这些顶点属性,所以预定义这些属性是合理的。在可编程流水线中,开发者需要在vertexshader中使用他们自己的顶点属性名字,因此对于gles2.0,用户自定义顶点属性名是必须的,既然如此,预定义名字也就不需要了。
如何指定顶点属性数据?
逐个顶点指定属性数据使用vertexarray;图元的所有顶点使用相同数据则使用常量值。
查询支持的最大顶点属性数,用glGetIntegerv(GL_MAX_VERTEX_ATTRIBS,&maxVertexAttribs);
这个值至少为8。
图元中所有顶点如果使用相同属性值就只用常量顶点属性
常量顶点属性只能使用GLfloat,通过glVertexAttrib1/2/3/4f[v]指定。例如:
void glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z);
这个函数将(x,y,z,1.0)设定到索引为index的顶点属性上。
顶点数组
vertex arrays为每个顶点指定属性数据,他们是存储在应用程序地址空间的buffer(即client space)。
vertex array提供了一种高效而灵活的方式来指定顶点属性数据。要指定vertex array,需要使用
glVertexAttribPointer函数:
void glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *ptr);
index: 指定通用顶点属性的索引,取值为0到支持的最大顶点属性数-1
size: 顶点数组中,index所引用的顶点属性的组件数。有效值为1-4
type: 数据格式。有效值为:GL_BYTE, GL_UNSIGNED_BYTE, GL_SHORT, GL_UNSIGNED_SHORT, GL_FLOAT, GL_FIXED, GL_HALF_FLOAT_OES
normalized: 用于指出是否非浮点数据格式在被转换为浮点数时是否需要归一化。
stride: size参数所指定的顶点属性组件们是为逐顶点顺序存储在顶点数组中的。stride指出了顶点i和顶点i+1数据之间的差值。如果stride是0,所有顶点的属性数据是序列存储的。如果stride>0,stride作为一个pitch值来获取下一个顶点的数据。
顶点数组存储方式:
1)array of structures: 所有顶点属性存储在同一个单一的buffer中
2)structure of arrays: 每种顶点属性存储在一个独立的buffer中
在vertex shader中定义attribute:
attribute vec4 a_position;
attribute vec2 a_texcoord;
attribute vec3 a_normal;
attribute修饰符只能出现在vertex shader中,在fragment shader中会导致编译错误;attribute只能是float, vec2, vec3, vec4, mat2, mat3, mat4类型的。attribute变量不能是数组或者结构。
ES2.0实现支持GL_MAX_VERTEX_ATTRIBS个vec4类型的vertex attributes。float, vec2, vec3被计算做一个vec4。mat2,mat3,mat4分别计算为2,3,4个vec4。不像uniform和varying变量可以被自动pack,attribute不会被pack。
attribute变量在shader中是只读的。
在vs中定义的attribute如果没有使用是不会被认为激活的,也不会计算为使用的容量。
如果attribute的总量超过了GL_MAX_VERTEX_ATTRIBS,vertex shader会link失败。
一旦program成功被link,我们可以查出这个program的vs使用的active的vertex attribute数量:
glGetProgramiv(program, GL_ACTIVE_ATTRIBUTES, &numActiveAttribs);
相关推荐
《OpenGL ES 2.0 学习笔记》是一份针对英文版《OpenGL ES 2.0 Programming Guide》的阅读总结,旨在帮助读者更好地理解和掌握OpenGL ES 2.0的核心概念和技术要点。以下是对该书中关键知识点的详细解释和归纳。 ####...
压缩包中的"OpenGL ES 2.0 Programming Guide.pdf"很可能是官方或第三方编写的详细教程,涵盖了OpenGL ES 2.0的各个方面,包括基本概念、着色器编程、纹理处理、错误调试等。"新建文本文档.txt"可能包含开发者笔记或...
区块链_智能合约_Solidity_保险应用_基于以太坊的技_1744433266
内容概要:本文档详细介绍了在Windows系统上安装MySQL数据库的具体步骤。首先,需要配置系统环境变量,包括新建MYSQL_HOME变量并将其添加到PATH中;其次,创建并编辑my.ini配置文件,设置MySQL的基本参数如端口、字符集、数据存放目录等;接着,在命令行工具中通过一系列指令完成MySQL的初始化、服务安装、启动以及root用户的密码设置和权限调整。整个流程涵盖了从环境搭建到最终确保MySQL服务正常运行的所有关键环节。 适合人群:适用于有一定计算机操作基础,尤其是对数据库管理有一定兴趣或需求的技术人员。 使用场景及目标:①帮助用户在本地机器上成功部署MySQL数据库环境;②确保用户能够掌握MySQL的基本配置与管理技能,如环境变量配置、服务安装与卸载、用户权限管理等。 其他说明:在安装过程中可能会遇到一些常见问题,例如由于之前版本残留导致的服务安装失败,此时可以通过命令行删除旧服务(sc delete mysql)来解决。此外,为了保证安全性,务必及时修改root用户的初始密码。
内容概要:`STARTUP.A51` 是 Keil C51 编译器自带的启动文件,用于初始化 8051 单片机的硬件和软件环境。该文件主要完成三个任务:初始化堆栈指针、清零内部数据存储器、跳转到主程序。文件中定义了内存模式(如 SMALL),并设置了堆栈指针的初始值为 0x60。接着通过循环将内部数据存储器的所有字节清零,确保程序开始时数据存储器的状态是确定的。此外,文件还列出了 8051 单片机的各个中断向量地址,并为每个中断提供占位符,实际的中断处理程序需要在其他文件中实现。最后,启动代码段初始化堆栈指针和数据段后,跳转到 `MAIN` 函数开始执行主程序。; 适合人群:对嵌入式系统开发有一定了解,尤其是使用 8051 单片机的开发者。; 使用场景及目标:①理解 8051 单片机启动文件的工作原理;②掌握如何初始化堆栈指针和数据段;③熟悉中断向量表的设置及其作用。; 其他说明:此文件为程序正常运行提供了必要的初始化操作,开发者可以根据具体需求修改该文件以适应不同的硬件和软件环境。
内容概要:该论文研究了一种基于行波理论的输电线路故障诊断方法。当输电线路发生故障时,故障点会产生向两侧传播的电流和电压行波。通过相模变换对三相电流行波解耦,利用解耦后独立模量间的关系确定故障类型和相别,再采用小波变换模极大值法标定行波波头,从而计算故障点距离。仿真结果表明,该方法能准确识别故障类型和相别,并对故障点定位具有高精度。研究使用MATLAB进行仿真验证,为输电线路故障诊断提供了有效解决方案。文中详细介绍了三相电流信号生成、相模变换(Clarke变换)、小波变换波头检测、故障诊断主流程以及结果可视化等步骤,并通过多个实例验证了方法的有效性和准确性。 适合人群:具备一定电力系统基础知识和编程能力的专业人士,特别是从事电力系统保护与控制领域的工程师和技术人员。 使用场景及目标:①适用于电力系统的故障检测与诊断;②能够快速准确地识别输电线路的故障类型、相别及故障点位置;③为电力系统的安全稳定运行提供技术支持,减少停电时间和损失。 其他说明:该方法不仅在理论上进行了深入探讨,还提供了完整的Python代码实现,便于读者理解和实践。此外,文中还讨论了行波理论的核心公式、三相线路行波解耦、行波测距实现等关键技术点,并针对工程应用给出了注意事项,如波速校准、采样率要求、噪声处理等。这使得该方法不仅具有学术价值,也具有很强的实际应用前景。
内容概要:本文详细介绍了光伏-混合储能微电网能量管理系统的模型架构及其控制策略。首先探讨了光伏发电模块中的MPPT(最大功率点跟踪)控制,采用扰动观察法和改进型变步长策略来提高光伏板的发电效率。接着重点讲解了混合储能系统的功率分配,利用一阶低通滤波算法将功率需求分为低频和高频两部分,分别由蓄电池和超级电容处理。此外,文中还深入讨论了SOC(荷电状态)管理策略,确保电池和超级电容在不同工作状态下保持最佳性能。仿真结果显示,在光伏出力剧烈波动的情况下,系统能够有效地维持稳定的电压水平,并显著提高了储能设备的使用寿命。 适合人群:对光伏微电网、储能技术和能量管理系统感兴趣的科研人员、工程师和技术爱好者。 使用场景及目标:适用于研究和开发高效、可靠的光伏-混合储能微电网系统,旨在优化能量管理和提高系统稳定性。具体应用场景包括但不限于家庭光伏系统、小型微电网以及工业能源管理系统。 其他说明:文中提供了详细的代码实现和仿真结果,便于读者理解和复现实验。同时,模型设计采用了模块化思路,方便进行个性化修改和扩展。
内容概要:本文详细介绍了基于MATLAB和CVX平台实现的储能调峰调频联合优化模型。该模型不仅涵盖了储能的基本参数设定、负荷不确定性处理、充放电策略制定,还包括了调峰调频的联合调度、功率约束处理、鲁棒优化等方面的内容。通过构建考虑电池退化成本、充放电功率约束以及用户负荷不确定性的储能优化模型,展现了储能系统在电力系统中的高效协同工作。文中提供了详细的代码示例,解释了各个部分的功能和实现方法,强调了模型的深度与创新性。 适合人群:适用于具有一定编程基础和技术背景的研究人员、工程师以及希望深入了解储能系统优化的学生。 使用场景及目标:该模型主要用于电力系统中储能设备的优化调度,旨在提高储能系统的经济效益和社会效益。通过联合调峰调频,能够显著提升储能系统的收益,实现1+1>2的超线性增益效果。此外,该模型还可以用于教学和科研,帮助初学者理解和掌握储能优化的相关技术和理论。 其他说明:代码中包含了丰富的注释和模块化的子程序,使得整个模型易于理解和扩展。对于有经验的开发者,可以在现有基础上进一步改进和定制,以适应不同的应用场景。
大模型技术白皮书2023版
图像增广 PyTorch 版
批量修改文件名可以帮助用户节省大量时间,提高工作效率 里面附带使用教程
《计算机应用基础》第2章--Windows-XP操作系统.ppt
包括:源程序工程文件、Proteus仿真工程文件、电路原理图文件、配套技术手册、论文资料等 1、采用51/52单片机(通用)作为主控芯片; 2、采用1602液晶显示使用过程及状态,液晶屏亮度会随光线自动调整; 3、按键输入6位密码,输入密码正确则锁打开,显示open!输入密码错误次数超过3次,蜂鸣器报警并且锁定键盘; 4、密码可以自己修改,必须是锁打开时才能改密,为防止误操作,修改密码得输入两次; 5、采用24C02保存密码,掉电不丢失; 6、可通过红外遥控器输入密码操作锁的状态;
内容概要:本文深入剖析了2025年全球感知技术的十大发展趋势,涵盖多模态感知融合、3D感知与空间计算、脑机接口中的感知反馈技术、5G/6G赋能的超低延迟感知、语音与情感识别的高级化、生物感知与数字健康、环境感知与自适应智能、增强现实(AR)与触觉反馈技术、气味与化学感知、量子感知与极端条件测量。文章详细介绍了每项技术的技术原理、关键算法、实现方式、商业案例及未来前景,强调了感知技术在智慧城市、自动驾驶、智慧医疗、工业自动化等领域的深刻影响。报告指出,感知技术正从单一传感模式向多模态融合、从二维数据向三维空间重建、从传统网络通信向超低延迟和高可靠性网络升级,实现全场景、全维度的智能感知。; 适合人群:对感知技术感兴趣的科技爱好者、研究人员、决策者、企业管理层和投资人。; 使用场景及目标:①了解感知技术的最新进展和未来发展方向;②为技术研究提供全面、深入的参考;③为商业应用提供具体的案例和前景分析;④推动跨领域协同创新,构建开放共赢的产业生态。; 其他说明:报告基于近年来技术研发的最新进展、业界前沿的技术路线以及各大科技企业在商业落地方面的丰富实践。随着感知技术的不断成熟,数据隐私与安全保护问题也需高度重视,以确保技术进步与社会伦理和谐统一。未来,感知技术将成为推动社会进步和产业升级的重要力量,为实现万物互联、智慧决策和智能体验提供无限可能。
本论文主要论述了如何使用JAVA语言开发一个校园新闻网站 ,本系统将严格按照软件开发流程进行各个阶段的工作,采用B/S架构,面向对象编程思想进行项目开发。在引言中,作者将论述校园新闻网站的当前背景以及系统开发的目的,后续章节将严格按照软件开发流程,对系统进行各个阶段分析设计。 校园新闻网站的主要使用者分为管理员和用户,实现功能包括管理员:首页、个人中心、用户管理、新闻类型管理、校园新闻管理、留言板管理、论坛交流、系统管理,用户前台:首页、校园新闻、论坛交流、留言反馈、个人中心、后台管理等功能。由于本网站的功能模块设计比较全面,所以使得整个校园新闻网站信息管理的过程得以实现。 本系统的使用可以实现本校园新闻网站管理的信息化,可以方便管理员进行更加方便快捷的管理,可以提高管理人员的工作效率。 基于Springboot+vue的校园新闻网站【源码+数据库+参考论文】 感兴趣自行下载学习!
内容概要:本文详细探讨了三相三电平PWM整流器的闭环控制策略及其核心技术——三电平SVPWM算法。文章首先介绍了三相三电平PWM整流器的基本概念和优势,如输出三种电平以降低谐波含量并减少滤波器体积和成本。接着阐述了闭环控制策略的重要性,强调了电压外环和电流内环的双闭环控制机制。随后,文章深入讲解了三电平SVPWM算法的工作原理,包括空间电压矢量的选择、扇区判断、矢量作用时间和死区补偿等关键技术环节。此外,还讨论了中点电位平衡的问题以及PI参数的整定方法。最后,通过示波器测试验证了系统的性能指标,如THD低于3%,直流电压纹波小于1%。 适合人群:从事电力电子领域的工程师和技术人员,尤其是对三相三电平PWM整流器及其控制策略感兴趣的读者。 使用场景及目标:适用于高压大功率场合,旨在提高整流器的性能,降低谐波含量,实现单位功率因数运行。通过合理设计闭环控制策略和优化SVPWM算法,确保整流器在各种工况下都能稳定、高效地工作。 其他说明:文中提供了大量MATLAB和C语言代码片段,帮助读者更好地理解和实现相关算法。同时,针对实际调试过程中遇到的问题给出了实用的解决方案,如中点电位平衡和死区补偿等。
全新红娘本地交友系统定制版源码 相亲婚恋交友小程序源码
内容概要:文章探讨了AI技术,特别是DeepSeek,如何驱动地图生成的变革。首先介绍了地图制图在AI时代的背景与挑战,强调了DeepSeek与地图融合的两种主要方式:嵌入地图制图链和研发地图语言自身的预训练模型。随后详细描述了DeepSeek在地图生成中的具体应用,包括智能化地图生成器DoMapAI的整体框架,地图制图链中的知识图谱推理路径,以及地图语言的Token化过程。最后,文章总结了AI时代地图制图的职业变化和技术变革,指出地图制图正经历“大变局”。 适合人群:从事地图制图及相关领域的研究人员、工程师,以及对AI与地图生成感兴趣的学者。 使用场景及目标:①理解AI技术在地图生成中的应用,特别是DeepSeek的作用;②掌握智能化地图生成器DoMapAI的工作原理及其应用场景;③学习地图语言Token化的方法及其在地图生成中的应用;④探索AI时代地图制图的职业发展方向和技术变革。 阅读建议:本文内容较为专业,建议读者先了解基本的AI技术和地图制图知识。重点关注DeepSeek与地图融合的具体方法和应用场景,理解智能化地图生成器DoMapAI的工作流程,以及地图语言Token化的实现过程。在阅读过程中,可以结合实际案例进行思考,以更好地理解AI技术对地图制图的影响。
chromedriver-mac-arm64-135.0.7049.114.zip
《网络布线与小型局域网搭建(第2版)》第3章-布线系统的设计.ppt