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