59 lines
1.7 KiB
GLSL
59 lines
1.7 KiB
GLSL
|
|
#version 320 es
|
|||
|
|
precision highp float;
|
|||
|
|
|
|||
|
|
// 全局 UBO (binding = 0) - 每帧更新一次
|
|||
|
|
layout(std140, binding = 0) uniform GlobalUBO {
|
|||
|
|
mat4 uViewProjection;
|
|||
|
|
vec4 uCameraPosition;
|
|||
|
|
float uTime;
|
|||
|
|
float uDeltaTime;
|
|||
|
|
vec2 uScreenSize;
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
// 顶点属性
|
|||
|
|
layout(location = 0) in vec2 aPosition; // 基础顶点位置
|
|||
|
|
layout(location = 1) in vec2 aTexCoord; // 基础 UV
|
|||
|
|
layout(location = 2) in vec4 aColor; // 基础颜色
|
|||
|
|
|
|||
|
|
// 实例属性 (每个实例)
|
|||
|
|
layout(location = 3) in vec2 aInstancePos; // 实例位置偏移
|
|||
|
|
layout(location = 4) in float aInstanceRot; // 实例旋转
|
|||
|
|
layout(location = 5) in vec2 aInstanceScale; // 实例缩放
|
|||
|
|
layout(location = 6) in vec4 aInstanceColor; // 实例颜色
|
|||
|
|
layout(location = 7) in vec4 aInstanceUV; // 实例 UV 区域
|
|||
|
|
|
|||
|
|
// 输出到片段着色器
|
|||
|
|
out vec2 vTexCoord;
|
|||
|
|
out vec4 vColor;
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief 顶点着色器入口(实例化版本)
|
|||
|
|
*
|
|||
|
|
* 计算顶点在裁剪空间中的位置,应用实例的变换
|
|||
|
|
*/
|
|||
|
|
void main() {
|
|||
|
|
// 构建旋转矩阵
|
|||
|
|
float cosRot = cos(aInstanceRot);
|
|||
|
|
float sinRot = sin(aInstanceRot);
|
|||
|
|
mat2 rotation = mat2(
|
|||
|
|
cosRot, -sinRot,
|
|||
|
|
sinRot, cosRot
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
// 应用缩放和旋转
|
|||
|
|
vec2 scaledPos = aPosition * aInstanceScale;
|
|||
|
|
vec2 rotatedPos = rotation * scaledPos;
|
|||
|
|
|
|||
|
|
// 应用实例位置偏移
|
|||
|
|
vec2 worldPos = rotatedPos + aInstancePos;
|
|||
|
|
|
|||
|
|
// 计算裁剪空间位置
|
|||
|
|
gl_Position = uViewProjection * vec4(worldPos, 0.0, 1.0);
|
|||
|
|
|
|||
|
|
// 计算 UV 坐标(应用实例 UV 区域)
|
|||
|
|
vTexCoord = aTexCoord * aInstanceUV.zw + aInstanceUV.xy;
|
|||
|
|
|
|||
|
|
// 混合顶点颜色和实例颜色
|
|||
|
|
vColor = aColor * aInstanceColor;
|
|||
|
|
}
|