返回介绍

结构体 struct

发布于 2021-07-10 18:17:39 字数 1538 浏览 975 评论 0 收藏 0

在着色器语言GLSL ES前面内容介绍过浮点数float、整形数int、三维向量vec3、4x4矩阵mat4等各种数据类型,关于结构体主要功能就是利用WebGL着色器已经提供的常见数据类型,自定义一个新的数据类型。

WebGL着色器语言中结构体和C语言类似,结构体是由多个同类或不同类的数据类型构成的一个集合。

// 首先定义一个结构体,也就是自定义一个数据类型
struct DirectionalLight {
  vec3 direction;
  vec4 color;
  float shadowBias;
};
// 使用自定义的结构体,或者说使用自定义的数据类型DirectionalLight声明一个变量
uniform DirectionalLight dirLight;

struct是声明结构体的关键字,DirectionalLight是自定义结构体的名称,可以根据表达的含义自由命名,你可以把自定义的结构体DirectionalLight理解为自定义的数据类型,自定义的数据类型DirectionalLight就像浮点数float、三维向量vec3一样可以用来声明一个变量。

访问分量(点符号.)

三维向量vec3、4x4矩阵mat4等数据类型可以通过点符号.访问自身的变量或元素,对于结构体关键字struct自定义的数据类型也一样可以通过点符号访问自身的变量或元素,你可把webgl着色器的结构体类比javascript的对象,对象可以通过点符号访问对象自身的属性。

vec3 dir = vec3(1.0,0.0,0.0);
dir.x = 100.0// x分量赋值
float x = dir.x;// 访问x分量,赋值给其它变量
struct DirectionalLight {
  vec3 direction;
  vec4 color;
};
uniform DirectionalLight dirLight;
// 结构体成员赋值
dirLight.color = vec4(0.8,0.6,0.1,1.0);
// 访问成员,赋值给其它变量
vec4 newcol = dirLight.color;

结构体uniform变量数据传递

// 获得结构体位置
var lightColor = gl.getUniformLocation(program,'directionalLight.color');
// 结构体的一个属性传递数据
gl.uniform4f(lightColor, 1.0, 0.0, 1.0,0.7);

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文