kanzi编写OpenGL

1.创建材质类型

Snipaste_2024-05-07_13-44-51

Snipaste_2024-05-07_13-49-44创建后会生成对应的材质,材质类型,OpenGL代码。

2.修改OpenGL代码

  • 原始的顶点着色器代码
1
2
3
4
5
6
7
8
attribute vec3 kzPosition;
uniform highp mat4 kzProjectionCameraWorldMatrix;

void main()
{
precision mediump float;
gl_Position = kzProjectionCameraWorldMatrix * vec4(kzPosition.xyz, 1.0);
}
  • attributeuniform的区别

在 OpenGL 中,attributeuniform 是两种不同类型的变量,用于在顶点着色器和片段着色器之间传递数据。它们的主要区别在于它们的作用和使用方式:

  1. attribute
    • attribute 变量用于在顶点着色器中传递顶点数据,比如顶点位置、颜色或纹理坐标等。
    • attribute 变量在每个顶点上都有不同的值,因此它们通常用于描述顶点特性。
    • 顶点着色器中的 attribute 变量必须声明为 attribute 类型,并且需要使用顶点数据缓冲对象 (VBO) 来传递数据。
  2. uniform
    • uniform 变量用于在顶点着色器和片段着色器之间传递全局数据,例如变换矩阵、光照属性或纹理对象等。
    • uniform 变量在整个绘制调用期间都保持不变,因此它们通常用于描述全局状态或共享数据。
    • 顶点着色器和片段着色器中的 uniform 变量必须声明为 uniform 类型,并且可以在绘制调用之前使用 OpenGL API 函数设置它们的值。

总的来说,attribute 用于描述每个顶点的局部特性,而 uniform 用于描述全局的状态或共享数据。

  • 在代码中引用变量后,在材质类型的属性窗口中就会显示在代码内部的引用的变量,点击Sync with Uniform按钮生成相应的属性,若不存在则创建。

    Snipaste_2024-05-07_14-11-38

Snipaste_2024-05-07_14-29-16

  • OpenGL使用的是笛卡尔右手坐标系,如下图所示。

Snipaste_2024-05-07_15-36-29

  • 顶点着色器代码

    纹理坐标的取值范围为0-1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
precision mediump float;

// 顶点的纹理坐标
attribute vec2 kzTextureCoordinate0;
// 顶点的位置坐标
attribute vec3 kzPosition;


uniform mediump float Width;
uniform mediump float Height;
// 投影相机世界矩阵
uniform highp mat4 kzProjectionCameraWorldMatrix;

// 合成图片的大小
uniform vec2 TTImageSize;
// 每个TT灯图片在合成图片中的偏移量
uniform vec2 OffsetInTTImage;

// 传递给片段着色器的纹理坐标
varying vec2 vTexCoord;


void main()
{
// X轴向右为正
vTexCoord.x = kzTextureCoordinate0.x * (Width / TTImageSize.x) + (OffsetInTTImage.x / TTImageSize.x * Width);
// Y轴向上为正
vTexCoord.y = kzTextureCoordinate0.y * (Height / TTImageSize.y) + (((TTImageSize.y - OffsetInTTImage.y * Height) - Height) / TTImageSize.y );

gl_Position = kzProjectionCameraWorldMatrix * vec4(kzPosition.xyz, 1.0);
}
  • 片元着色器代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
precision mediump float;

uniform sampler2D Texture;
// 存储主要颜色
uniform vec4 PrimaryColor;
// 存储次要颜色
uniform vec4 SecondaryColor;
// 是否使用次要颜色
uniform bool UseSecondaryColor;

varying vec2 vTexCoord;

void main()
{
// 从纹理 Texture 中使用纹理坐标 vTexCoord 采样出颜色,并将结果存储在 colorIn 变量中
vec4 colorIn = texture2D(Texture, vTexCoord);
gl_FragColor = colorIn * mix(PrimaryColor, SecondaryColor, float(UseSecondaryColor));
}