带你读《2022技术人的百宝黑皮书》——Flutter 新一代图形渲染器 Impeller(3)https://developer.aliyun.com/article/1340789?groupCode=taobaotech
solid_fill.vert.metal:
uniform FrameInfo { mat4 mvp; vec4 color; } frame_info; using namespace metal; struct FrameInfo { float4x4 mvp; float4 color; }; struct solid_fill_vertex_main_out { float4 color [[user(locn0)]]; float4 gl_Position [[position]]; }; struct solid_fill_vertex_main_in { float2 vertices [[attribute(0)]]; }; vertex solid_fill_vertex_main_out solid_fill_vertex_main( solid_fill_vertex_main_in in [[stage_in]], constant FrameInfo& frame_info [[buffer(0)]]) { solid_fill_vertex_main_out out = {}; out.gl_Position = frame_info.mvp * float4(in.vertices, 0.0, 1.0); out.color = frame_info.color; return out; }
solid_fill.vert.h:
struct SolidFillVertexShader { // =========================================================================== // Stage Info ================================================================ // =========================================================================== static constexpr std::string_view kLabel = "SolidFill"; static constexpr std::string_view kEntrypointName = "solid_fill_vertex_main"; static constexpr ShaderStage kShaderStage = ShaderStage::kVertex; // =========================================================================== // Struct Definitions ======================================================== // =========================================================================== struct PerVertexData { Point vertices; // (offset 0, size 8) }; // struct PerVertexData (size 8) struct FrameInfo { Matrix mvp; // (offset 0, size 64) Vector4 color; // (offset 64, size 16) Padding<48> _PADDING_; // (offset 80, size 48) }; // struct FrameInfo (size 128) 21 // =========================================================================== // Stage Uniform & Storage Buffers =========================================== // =========================================================================== static constexpr auto kResourceFrameInfo = ShaderUniformSlot<FrameInfo> { // FrameInfo "FrameInfo", // name 0u, // binding }; // =========================================================================== // Stage Inputs ============================================================== // =========================================================================== static constexpr auto kInputVertices = ShaderStageIOSlot { // vertices "vertices", // name 0u, // attribute location 0u, // attribute set 0u, // attribute binding ShaderType::kFloat, // type 32u, // bit width of type 2u, // vec size 1u // number of columns 44 }; static constexpr std::array<const ShaderStageIOSlot*, 1> kAllShaderStageInputs = { &kInputVertices, // vertices 48 }; // =========================================================================== // Stage Outputs ============================================================= // =========================================================================== static constexpr auto kOutputColor = ShaderStageIOSlot { // color "color", // name 0u, // attribute location 0u, // attribute set 0u, // attribute binding ShaderType::kFloat, // type 32u, // bit width of type 4u, // vec size 1u // number of columns }; static constexpr std::array<const ShaderStageIOSlot*, 1> kAllShaderStageOutputs = { &kOutputColor, // color }; // =========================================================================== // Resource Binding Utilities ================================================ // =========================================================================== /// Bind uniform buffer for resource named FrameInfo. static bool BindFrameInfo(Command& command, BufferView view) { return command.BindResource(ShaderStage::kVertex, kResourceFrameInfo, std::move(view)); } }; // struct SolidFillVertexShader
带你读《2022技术人的百宝黑皮书》——Flutter 新一代图形渲染器 Impeller(5)https://developer.aliyun.com/article/1340787?groupCode=taobaotech