当前位置: 首页 > Web前端 > HTML

《简单易学的游戏引擎》4.2VertexShader

时间:2023-03-28 18:43:44 HTML

《简单易学的游戏引擎》从零开始写的游戏引擎教程,是一本开源电子书,PDF/附带代码/资源下载:https://github.com/ThisisGame...顶点着色器的作用是对输入的顶点坐标进行处理,然后输出。1.简单的顶点着色器让我们写一个简单的顶点着色器来实现上面提到的功能。#version110uniformmat4u_mvp;attributevec3a_pos;att??ributevec4a_color;varyingvec4v_color;voidmain(){gl_Position=u_mvp*vec4(a_pos,1.0);v_color=a_color;};这个简单的着色器将输入的vec3的顶点坐标转换为vec4并输出。2.Vertexshadersyntax2.1版本限制#version110第一行表示当前Shader所需要的GLSL(OpenGLshaderlanguage)的最低版本。如果你的电脑支持OpenGL,不满足Shader的要求,那么Shader就会失效。但是检测软件上一般只能看到OpenGL版本,看不到GLSL版本。这是一个对应的表。OpenGLVersionGLSLVersion2.01.102.11.203.01.303.11.403.21.50>3.3=OpenGLVersion根据表格,第一行110对应OpenGL2.0,电脑至少需要支持OpenGL2.0才能正常运行。2.2uniform变量mat4u_mvp;uniform用于修改uniform变量。GPU是并行的,Shader是在GPU上执行的程序。当我们需要绘制3个顶点时,GPU将这3个顶点数据分发给3个GPU逻辑单元并行处理,每个逻辑单元处理的不同顶点坐标数据称为属性变量。每个逻辑单元也会需要一些相同的数据,这些数据称为统一变量。2.3属性变量attributevec3a_pos;属性vec4a_color;上面已经介绍了属性变量。vec3vPos表示定义vec3的变量vPos。Attribute代表这个变量,每次Shader执行的时候都需要赋值。2.4输出变量varyingvec4v_color;输出变量由varying关键字修饰,用于将数据从vertexshader传输到fragmentshader。2.5函数逻辑voidmain(){gl_Position=vec4(vPos,1.0);}每个Shader都有一个入口函数main(),顶点Shader的主要工作是:计算坐标.得到坐标计算结果后,传递给内置变量gl_Position。GPU获取gl_Position并执行裁剪。参考文档:VertexShader:https://www.khronos.org/opengl/wiki/Vertex_Shader#InputsOPENGLES3.0ProgrammingGuideChapter5OpenGLESShadingLanguage