DescriptorSets

Coze智能体实战:接口需求分析和接口调试 AI智能体的需求:能根据接口文档提取接口信息以及设计接口测试点,并进行接口调试返回接口测试结果。 阅读详情
layout(set = 0, binding = 0) uniform UboVS {  
    mat4 mvp;  
} uboVS;  

layout(location = 0) in vec3 inPosition;  
layout(location = 0) out vec3 fragColor;  

void main() {  
    gl_Position = uboVS.mvp * vec4(inPosition, 1.0);  
    fragColor = inPosition;  
}
layout(set = 1, binding = 0) uniform UboMaterial {  
    vec4 color;  
    float roughness;  
} material;  

layout(location = 0) in vec3 fragColor;  
layout(location = 0) out vec4 outColor;  

void main() {  
    outColor = material.color * vec4(fragColor, 1.0);  
}

#include <vulkan/vulkan.h>
#include <vector>
#include <stdexcept>
#include <array>

// 假设这些函数和变量已在其他地方定义
VkDevice device;
VkPhysicalDevice physicalDevice;
uint32_t queueFamilyIndex;

// 用于存储 uniform 缓冲的结构体
struct UniformBufferObject {
    glm::mat4 mvp;
};

struct MaterialProperties {
    glm::vec4 color;
    float roughness;
};

// 创建缓冲的辅助函数
VkBuffer createBuffer(VkDeviceSize size, VkBufferUsageFlags usage, VkMemoryPropertyFlags properties, VkDeviceMemory& bufferMemory) {
    VkBuffer buffer;
    // 创建缓冲的代码...
    return buffer;
}

class VulkanMultipleDescriptorSets {
public:
    void setup() {
        createDescriptorSetLayouts();
        createUniformBuffers();
        createDescriptorPool();
        createDescriptorSets();
        createPipelineLayout();
    }

    void cleanup() {
        vkDestroyBuffer(device, uniformBufferMVP, nullptr);
        vkFreeMemory(device, uniformBufferMemoryMVP, nullptr);
        vkDestroyBuffer(device, uniformBufferMaterial, nullptr);
        vkFreeMemory(device, uniformBufferMemoryMaterial, nullptr);
        vkDestroyDescriptorSetLayout(device, descriptorSetLayoutMVP, nullptr);
        vkDestroyDescriptorSetLayout(device, descriptorSetLayoutMaterial, nullptr);
        vkDestroyDescriptorPool(device, descriptorPool, nullptr);
        vkDestroyPipelineLayout(device, pipelineLayout, nullptr);
    }

    void updateUniformBuffer(uint32_t currentImage) {
        // 更新 MVP 矩阵
        UniformBufferObject ubo{};
        // ... 计算 MVP 矩阵 ...
        void* data;
        vkMapMemory(device, uniformBufferMemoryMVP, 0, sizeof(ubo), 0, &data);
        memcpy(data, &ubo, sizeof(ubo));
        vkUnmapMemory(device, uniformBufferMemoryMVP);

        // 更新材质属性(如果需要)
        MaterialProperties material{};
        material.color = glm::vec4(1.0f, 0.0f, 0.0f, 1.0f);
        material.roughness = 0.5f;
        vkMapMemory(device, uniformBufferMemoryMaterial, 0, sizeof(material), 0, &data);
        memcpy(data, &material, sizeof(material));
        vkUnmapMemory(device, uniformBufferMemoryMaterial);
    }

    void bindDescriptorSets(VkCommandBuffer commandBuffer) {
        vkCmdBindDescriptorSets(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayout, 
                                0, 2, descriptorSets.data(), 0, nullptr);
    }

private:
    VkDescriptorSetLayout descriptorSetLayoutMVP;
    VkDescriptorSetLayout descriptorSetLayoutMaterial;
    VkPipelineLayout pipelineLayout;
    VkBuffer uniformBufferMVP;
    VkDeviceMemory uniformBufferMemoryMVP;
    VkBuffer uniformBufferMaterial;
    VkDeviceMemory uniformBufferMemoryMaterial;
    VkDescriptorPool descriptorPool;
    std::array<VkDescriptorSet, 2> descriptorSets;

    void createDescriptorSetLayouts() {
        // MVP 矩阵的描述符集布局
        VkDescriptorSetLayoutBinding mvpLayoutBinding{};
        mvpLayoutBinding.binding = 0;
        mvpLayoutBinding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
        mvpLayoutBinding.descriptorCount = 1;
        mvpLayoutBinding.stageFlags = VK_SHADER_STAGE_VERTEX_BIT;

        VkDescriptorSetLayoutCreateInfo layoutInfoMVP{};
        layoutInfoMVP.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
        layoutInfoMVP.bindingCount = 1;
        layoutInfoMVP.pBindings = &mvpLayoutBinding;

        if (vkCreateDescriptorSetLayout(device, &layoutInfoMVP, nullptr, &descriptorSetLayoutMVP) != VK_SUCCESS) {
            throw std::runtime_error("Failed to create descriptor set layout for MVP!");
        }

        // 材质属性的描述符集布局
        VkDescriptorSetLayoutBinding materialLayoutBinding{};
        materialLayoutBinding.binding = 0;
        materialLayoutBinding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
        materialLayoutBinding.descriptorCount = 1;
        materialLayoutBinding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;

        VkDescriptorSetLayoutCreateInfo layoutInfoMaterial{};
        layoutInfoMaterial.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
        layoutInfoMaterial.bindingCount = 1;
        layoutInfoMaterial.pBindings = &materialLayoutBinding;

        if (vkCreateDescriptorSetLayout(device, &layoutInfoMaterial, nullptr, &descriptorSetLayoutMaterial) != VK_SUCCESS) {
            throw std::runtime_error("Failed to create descriptor set layout for Material!");
        }
    }

    void createUniformBuffers() {
        VkDeviceSize bufferSizeMVP = sizeof(UniformBufferObject);
        uniformBufferMVP = createBuffer(bufferSizeMVP, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, 
                                        VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, 
                                        uniformBufferMemoryMVP);

        VkDeviceSize bufferSizeMaterial = sizeof(MaterialProperties);
        uniformBufferMaterial = createBuffer(bufferSizeMaterial, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, 
                                             VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, 
                                             uniformBufferMemoryMaterial);
    }

    void createDescriptorPool() {
        std::array<VkDescriptorPoolSize, 2> poolSizes{};
        poolSizes[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
        poolSizes[0].descriptorCount = 1;
        poolSizes[1].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
        poolSizes[1].descriptorCount = 1;

        VkDescriptorPoolCreateInfo poolInfo{};
        poolInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
        poolInfo.poolSizeCount = static_cast<uint32_t>(poolSizes.size());
        poolInfo.pPoolSizes = poolSizes.data();
        poolInfo.maxSets = 2;

        if (vkCreateDescriptorPool(device, &poolInfo, nullptr, &descriptorPool) != VK_SUCCESS) {
            throw std::runtime_error("Failed to create descriptor pool!");
        }
    }

    void createDescriptorSets() {
        std::array<VkDescriptorSetLayout, 2> layouts = {descriptorSetLayoutMVP, descriptorSetLayoutMaterial};
        VkDescriptorSetAllocateInfo allocInfo{};
        allocInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
        allocInfo.descriptorPool = descriptorPool;
        allocInfo.descriptorSetCount = static_cast<uint32_t>(layouts.size());
        allocInfo.pSetLayouts = layouts.data();

        if (vkAllocateDescriptorSets(device, &allocInfo, descriptorSets.data()) != VK_SUCCESS) {
            throw std::runtime_error("Failed to allocate descriptor sets!");
        }

        // 更新 MVP 描述符集
        VkDescriptorBufferInfo bufferInfoMVP{};
        bufferInfoMVP.buffer = uniformBufferMVP;
        bufferInfoMVP.offset = 0;
        bufferInfoMVP.range = sizeof(UniformBufferObject);

        VkWriteDescriptorSet descriptorWriteMVP{};
        descriptorWriteMVP.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
        descriptorWriteMVP.dstSet = descriptorSets[0];
        descriptorWriteMVP.dstBinding = 0;
        descriptorWriteMVP.dstArrayElement = 0;
        descriptorWriteMVP.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
        descriptorWriteMVP.descriptorCount = 1;
        descriptorWriteMVP.pBufferInfo = &bufferInfoMVP;

        // 更新材质描述符集
        VkDescriptorBufferInfo bufferInfoMaterial{};
        bufferInfoMaterial.buffer = uniformBufferMaterial;
        bufferInfoMaterial.offset = 0;
        bufferInfoMaterial.range = sizeof(MaterialProperties);

        VkWriteDescriptorSet descriptorWriteMaterial{};
        descriptorWriteMaterial.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
        descriptorWriteMaterial.dstSet = descriptorSets[1];
        descriptorWriteMaterial.dstBinding = 0;
        descriptorWriteMaterial.dstArrayElement = 0;
        descriptorWriteMaterial.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
        descriptorWriteMaterial.descriptorCount = 1;
        descriptorWriteMaterial.pBufferInfo = &bufferInfoMaterial;

        std::array<VkWriteDescriptorSet, 2> descriptorWrites = {descriptorWriteMVP, descriptorWriteMaterial};
        vkUpdateDescriptorSets(device, static_cast<uint32_t>(descriptorWrites.size()), descriptorWrites.data(), 0, nullptr);
    }

    void createPipelineLayout() {
        std::array<VkDescriptorSetLayout, 2> setLayouts = {descriptorSetLayoutMVP, descriptorSetLayoutMaterial};

        VkPipelineLayoutCreateInfo pipelineLayoutInfo{};
        pipelineLayoutInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
        pipelineLayoutInfo.setLayoutCount = static_cast<uint32_t>(setLayouts.size());
        pipelineLayoutInfo.pSetLayouts = setLayouts.data();

        if (vkCreatePipelineLayout(device, &pipelineLayoutInfo, nullptr, &pipelineLayout) != VK_SUCCESS) {
            throw std::runtime_error("Failed to create pipeline layout!");
        }
    }
};

2025华为OD机试真题目录汇总 B+C+D+E卷(570道)(Python语言) 本文是华为OD机试真题(Python 语言)专栏的目录贴(持续更新中…)华为OD是Outsourcing Dispacth模式,是华为和外企德科联合招聘的简称。目前华为大多数是OD招聘。OD模式也是华为提出的一种新的用工形式,每年都会从OD项目挑优秀员工转为正编。所有OD和正式员工一样对待,没有差别,部门平时开会、评审等活动都是一起参加的,是同薪同酬,都是由华为的HR直接定的薪资,看的是我们技术能力。华为是大企业,能到华为上班也是有能力的,每个部门都有好多职位,是金子,在哪都会发光。 阅读详情

相关推荐

【华为鸿蒙3.0/荣耀安卓12使用VMOS Pro的激活方式】

解压激活工具 →连接数据线 轻松搞定激活!

Amy_mumu的博客 142万+

Vulkan教程翻译之十六 绘制立方体

原文链接:https://vulkan.lunarg.com/doc/sdk/1.2.131.2/windows/tutorial/html/15-draw_cube.html 绘制立方体 本章节的代码文件是 15-draw_cube.cpp 你快要完成了! 这是把你的 Vulkan 图像上屏的最终步骤了: 等待一个 Swapchain Buffer 在绘制东西之前,示例程序需要一个目标 swapchain image 来进行渲染。 vkAcquireNextImageKHR()函数是用来获取

Bleach3的博客 1151

华为交换机实战:如何用ACL+流分类精准限制特定IP的网速(附完整命令)

本文详细介绍了华为交换机如何通过ACL+流分类技术实现精准IP限速,包括ACL规则配置、流分类关联、流行为定义及流策略应用等完整步骤。文章提供了实战命令和配置验证方法,帮助网络管理员有效管理带宽资源,解决特定IP占用过多带宽的问题。

weixin_29229055的博客 100

Vulkan Samples 阅读 -- Basics(二): Pipelines & Descriptor Sets & Dynamic Uniform Buffers

目录Introduction Introduction    从运行程序的展示结果来看,Pipelines 主要演示场景的不相同风格的渲染。()

jiamada的博客 458

7 series FPGAs Transceiver Wizard IP核使用和测试

学习FPGA一段时间了,前面一直没有系统的总结,这学期把在项目中用到的IP核和一些调试过程中遇到的问题总结一下发出来,坚持下去,一起进步! 今天总结一下的GTH核的使用和测试。 软件版本:Vivado 2017.4 IP核版本:7 Series FPGAs Transceivers Wizard (3.6) FPGA:xc7vx690tfft1927 实现功能: 四路光纤数据接收,由于GTX IP...

qq_39921762的博客 1万+

手把手教你用MOS管设计双电源自动切换电路(附零压降方案)

本文详细介绍了使用MOS管设计双电源自动切换电路的完整方案,包括基础电路拓扑、零压降优化设计及实战调试技巧。针对外接电源与电池供电的无缝切换需求,提供低损耗MOS管选型建议和性能实测数据,帮助工程师解决传统二极管方案的压降与漏电问题。

h0i1j2k3l的博客 1446

Vulkan 示例解析:descriptorsets.cpp 如何用 Descriptor Set 给不同物体绑定不同资源

本文分析了Vulkan示例descriptorsets.cpp的核心内容。该示例演示了如何使用描述符集(descriptor set)将CPU侧的buffer、image等资源绑定到shader中使用。

wang的博客 337

CAD二次开发(C#版):从零搭建开发环境与核心DLL引用指南

本文详细介绍了使用C#进行CAD二次开发的环境搭建与核心DLL引用指南,涵盖Visual Studio配置、AutoCAD插件项目创建、DLL引用技巧及调试方法。通过实战示例和常见问题排查,帮助开发者快速掌握CAD二次开发的核心技术,提升开发效率。

weixin_28837817的博客 728

Vulkan Samples 阅读 -- Basics(五): Input Attachments & Sub Passes & Offscreen Renderings

目录Input Attachmentspreparerender小结Sub Passespreparerender小结 Input Attachments prepare loadAssets: 加载模型 prepareUniformBuffers updateUniformBuffers setupRenderPass: 重写了父类的方法, 创建 Attachment 创建的数量是: swapChain.imageCount 每个 Attachment 都需要创建 color 和 dept

jiamada的博客 695

Linux V4L2驱动开发实战:手把手教你用I2C摄像头Sensor注册一个v4l2_subdev

本文详细解析了Linux V4L2驱动开发中I2C摄像头Sensor注册v4l2_subdev的全流程,包括初始化、操作集填充、异步匹配等关键环节。通过实战案例和代码示例,帮助开发者掌握V4L2子系统下的摄像头驱动开发技巧,提升嵌入式Linux系统开发能力。

weixin_30328063的博客 418

基于深度学习的异常检测实战:从自编码器到GAN

本文通过一个完整的实战案例,展示了如何使用自编码器和GAN进行异常检测。我们详细介绍了数据准备、模型定义、训练和评估的步骤,并提供了可运行的代码。希望本文能为读者在实际项目中应用异常检测技术提供实用的指导和启发。

Programming Talk 242

【Vulkan入门】22-MVP坐标转换

介绍如何在Vulkan中设置 模型矩阵 视觉矩阵和投影矩阵

愚公 1259

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Vulkan Samples 阅读 -- Advanced(二):Mip-map Generation & Capturing Screenshots & OIT

目录Mip-map Generationpreparerendershader小结Capturing Screenshotspreparerendershader小结Order Independent Transparencypreparerendershader析构小结 Mip-map Generation prepare loadAssets: 加载模型和纹理 loadTexture: mip map设置 level: texture.mipLevels = floor(log2(std::max

jiamada的博客 343

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Vulkan 示例解析:pipelines.cpp 如何在一个 Render Pass 中切换多条 Graphics Pipeline

在 Vulkan 中,如果两个物体使用了不同的 shader,通常意味着它们需要不同的 graphics pipeline。如果两个物体使用了不同的 polygon mode,例如一个填充绘制、一个线框绘制,也通常意味着它们需要不同的 graphics pipeline。

wang的博客 462

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Cocos Creator图形抽象层解析:GFXDeviceManager与GFXDevice源码剖析

在游戏开发与计算机图形学中,渲染引擎的跨平台适配是核心技术挑战。其核心原理在于通过抽象层屏蔽底层图形API(如OpenGL、Metal、Vulkan)的差异,为上层提供统一接口。这项技术的核心价值在于实现“一次编写,多端运行”,大幅提升开发效率并确保渲染效果的一致性。典型的应用场景包括移动端游戏、跨平台应用及WebGL内容开发。本文聚焦于Cocos Creator引擎的图形抽象层实现,深入剖析其核心组件GFXDeviceManager与GFXDevice的设计哲学与工作机制。GFXDeviceManager

weixin_30514745的博客 310

图形渲染性能优化

设置可见性等, 不需要重新build command buffer。

artisans的专栏 1362

textureLod lod的确定

glsl texture lod

artisans的专栏 593

gtx960 有多少wrap

Warp 是一个逻辑上的线程组,包含 32 个线程。Warp 是 GPU 硬件调度的最小单位,而不是由 CUDA 核心直接组成的。每个线程在执行时会映射到一个 CUDA 核心上,因此 一个 Warp 的 32 个线程需要 32 个 CUDA 核心来同时执行。

artisans的专栏 570

sampler2DShadow

需要注意的是,不同版本的GLSL中语法可能略有不同,比如在较老的版本中使用shadow2D()函数,而新版本中使用texture()函数。在GLSL中,针对阴影贴图(Shadow Map)采样有专门的采样器类型。阴影采样器在采样时需要一个额外的比较值(comparison value)2。与普通的sampler2D不同,它会执行深度比较操作2。必须声明为uniform变量或作为函数参数3。返回值范围在[0,1]之间,表示阴影强度。用于立方体阴影贴图采样。适用于全方位的阴影映射。用于2D阴影贴图采样。

artisans的专栏 562

图形学技术博客

主流抗锯齿方案详解(一)MSAA hierarchical-z-map-based-occlusion-culling游戏架构设计:高性能并行编程GAMES001-图形学中的数学

artisans的专栏 558

vulkan renderdoc截帧报错

报这个错是 因为加载不到vulkan的dll copy一份windows目录就行。

artisans的专栏 547

VkDrawIndexedIndirectCommand firstIndex 和 firstInstance 这两个参数区别区别

【代码】VkDrawIndexedIndirectCommand firstIndex 和 firstInstance 这两个参数区别区别。

artisans的专栏 502

vulkan Semaphore和 Fence同步

【代码】vulkan Semaphore和 Fence同步。

artisans的专栏 438

Phong光照

顶点着色器#version 330 core layout (location = 0) in vec3 aPosition; layout (location = 1) in vec2 aCoor; layout (location = 1) in vec3 aNormal;uniform mat4 uModel; uniform mat4 uView; uniform mat4 uProject

artisans的专栏 397

模板测试练习 选中效果

完整程序 https://github.com/WaldenPonder/opengl-test/tree/master/t004#include "stdafx.h" #include "../common/common.out.h"int _tmain(int argc, _TCHAR* argv[]) { GLfloat cubePts[180]; tools::GetCub

artisans的专栏 363

渲染到纹理

/* 帧缓冲, 渲染到纹理 */ #include "stdafx.h" #include "../common/common.out.h"/* VAO VBO EBO 纹理 */ using namespace std;float color1 = 0.1; float color2 = 0.3; float color3 = 0.4;bool g_b_line = false;void

artisans的专栏 330
上一篇: offsetof 宏定义
下一篇: 图形学技术博客
不如学也
博客等级 码龄12年 22粉丝 136原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值