Extra2D/shader/sprite_instanced.vert

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;
}