D3DXMESHOPT_ATTRSORT

2023-11-15

Mesh的顶点和索引能够被重组以便能更有效的渲染mesh。当我们这样做时,我们说我们优化了一个mesh。我们可以使用下面的方法来进行优化:

HRESULT ID3DXMesh::OptimizeInplace(

       DWORD Flags,

       CONST DWORD* pAdjacencyIn,

       DWORD* pAdjacencyOut,

       DWORD* pFaceRemap,

       LPD3DXBUFFER* ppVertexRemap

);

Flags — 表示执行什么类型的优化方法。它可以是下面的一个或几个的组合:

         D3DXMESHOPT_COMPACT — 从mesh中移除没有用的顶点和索引项。

         D3DXMESHOPT_ATTRSORT — 根据属性给三角形排序并调整属性表,这将使DrawSubset执行更有效。

         D3DXMESHOPT_VERTEXCACHE — 增加顶点缓存的命中率。

         D3DXMESHOPT_STRIPREORDER — 重组顶点索引使三角带尽可能的长。

         D3DXMESHOPT_IGNOREVERTS — 只优化索引信息,忽略顶点信息。

注意:D3DXMESHOPT_VERTEXCACHE和D3DXMESHOPT_STRIPREORDER不能同时使用。

pAdjacencyIn — 指向没有优化的mesh的邻接数组。

pAdjacencyOut — 指向一个DWORD数组,它被用来填充优化好了的mesh邻接信息。该数组必须有ID3DXMesh::GetNumFaces() * 3个元素。如果不需要该信息,可以将其设置为0。

pFaceRemap —指向一个DWORD数组,它被用来填充面重影射信息。该数组必须不小于ID3DXMesh::GetNumFaces()。当一个mesh被优化时,由索引缓存定义的面可能被移动;也就是说,在pFaceRemap中的第i项表示第i个原始面被移动到的面索引值。如果不需要该信息,可以将其设置为0。

ppVertexRemap — 指向ID3DXBuffer指针的地址,它被用来填充顶点重影射信息。这个缓存应该包含ID3DXMesh::GetNumVertices()个顶点。当一个mesh被优化后,顶点可能被移动。顶点重影射信息用来说明原来的顶点被移动到新位置;也就是说,在ppVertexRemap中的第i项表示原来的第i个顶点的新位置。如果不需要该信息,可以将其设置为0。

例子:

// Get the adjacency info of the non-optimized mesh.

DWORD adjacencyInfo[Mesh->GetNumFaces() * 3];

Mesh->GenerateAdjacency(0.0f, adjacencyInfo);

 

// Array to hold optimized adjacency info.

DWORD optimizedAdjacencyInfo[Mesh->GetNumFaces() * 3];

Mesh->OptimizeInplace(D3DXMESHOPT_ATTRSORT | D3DXMESHOPT_COMPACT | D3DXMESHOPT_VERTEXCACHE,

       adjacencyInfo, optimizedAdjacencyInfo, 0, 0);

 

一个更简单的方法是Optimize方法,它输出一个优化的mesh,而不是在原来mesh的基础上进行优化:

Generates a new mesh with reordered faces and vertices to optimize drawing performance.

HRESULT Optimize(
  DWORD Flags,
  CONST DWORD * pAdjacencyIn,
  DWORD * pAdjacencyOut,
  DWORD * pFaceRemap,
  LPD3DXBUFFER * ppVertexRemap,
  LPD3DXMESH * ppOptMesh
);
Parameters
Flags
[in] Specifies the type of optimization to perform. This parameter can be set to a combination of one or more flags from D3DXMESHOPT and D3DXMESH (except D3DXMESH_32BIT, D3DXMESH_IB_WRITEONLY, and D3DXMESH_WRITEONLY).
pAdjacencyIn
[in] Pointer to an array of three DWORDs per face that specifies the three neighbors for each face in the source mesh. If the edge has no adjacent faces, the value is 0xffffffff. See Remarks.
pAdjacencyOut
[in, out] Pointer to an array of three DWORDs per face that specifies the three neighbors for each face in the optimized mesh. If the edge has no adjacent faces, the value is 0xffffffff.
pFaceRemap
[in, out] An array of DWORDs, one per face, that identifies the original mesh face that corresponds to each face in the optimized mesh. If the value supplied for this argument is NULL, face remap data is not returned.
ppVertexRemap
[out] Address of a pointer to an ID3DXBuffer interface, which contains a DWORD for each vertex that specifies how the new vertices map to the old vertices. This remap is useful if you need to alter external data based on the new vertex mapping.
ppOptMesh
[out] Address of a pointer to an ID3DXMesh interface, representing the optimized mesh.
Return Values

If the method succeeds, the return value is D3D_OK. If the method fails, the return value can be one of the following: D3DERR_INVALIDCALL, E_OUTOFMEMORY.

Remarks

This method generates a new mesh. Before running Optimize, an application must generate an adjacency buffer by calling ID3DXBaseMesh::GenerateAdjacency. The adjacency buffer contains adjacency data, such as a list of edges and the faces that are adjacent to each other.

This method is very similar to the ID3DXBaseMesh::CloneMesh method, except that it can perform optimization while generating the new clone of the mesh. The output mesh inherits all of the creation parameters of the input mesh.

D3DXMESHOPT

Specifies the type of mesh optimization to be performed.

typedef enum D3DXMESHOPT
{
    D3DXMESHOPT_COMPACT = 0x01000000,
    D3DXMESHOPT_ATTRSORT = 0x02000000,
    D3DXMESHOPT_VERTEXCACHE = 0x04000000,
    D3DXMESHOPT_STRIPREORDER = 0x08000000,
    D3DXMESHOPT_IGNOREVERTS = 0x10000000,
    D3DXMESHOPT_DONOTSPLIT = 0x20000000,
    D3DXMESHOPT_DEVICEINDEPENDENT = 0x40000000,
} D3DXMESHOPT, *LPD3DXMESHOPT;
Constants
D3DXMESHOPT_COMPACT
Reorders faces to remove unused vertices and faces.
D3DXMESHOPT_ATTRSORT
Reorders faces to optimize for fewer attribute bundle state changes and enhanced ID3DXBaseMesh::DrawSubset performance.
D3DXMESHOPT_VERTEXCACHE
Reorders faces to increase the cache hit rate of vertex caches.
D3DXMESHOPT_STRIPREORDER
Reorders faces to maximize length of adjacent triangles.
D3DXMESHOPT_IGNOREVERTS
Optimize the faces only; do not optimize the vertices.
D3DXMESHOPT_DONOTSPLIT
While attribute sorting, do not split vertices that are shared between attribute groups.
D3DXMESHOPT_DEVICEINDEPENDENT
Affects the vertex cache size. Using this flag specifies a default vertex cache size that works well on legacy hardware.
Remarks

The D3DXMESHOPT_STRIPREORDER and D3DXMESHOPT_VERTEXCACHE optimization flags are mutually exclusive.

The D3DXMESHOPT_SHAREVB flag has been removed from this enumeration. Use D3DXMESH_VB_SHARE instead, in D3DXMESH.


10.5 属性表

当一个mesh被使用D3DXMESHOPT_ATTRSORT参数来优化后,mesh的几何信息将按照属性进行排序,这样各个子集的顶点/索引将组成连续的块(如图10.3)。

除了进行几何信息的排序外,D3DXMESHOPT_ATTRSORT优化项还将创建一个属性表。该表是D3DXATTRIBUTERANGE结构的一个数组。在属性表中的每一项对应mesh的一个子集并指示顶点/索引缓存中的一个连续连续内存块,这个子集的几何信息就包含在这个块中。D3DXATTRIBUTERANGE结构的定义如下:

typedef struct _D3DXATTRIBUTERANGE {

       DWORD AttribId;

       DWORD FaceStart;

       DWORD FaceCount;

       DWORD VertexStart;

       DWORD VertexCount;

} D3DXATTRIBUTERANGE;

AttribId — 子集的ID。

FaceStart — 该子集的面的起始值,FaceStart*3就是起始三角形在索引缓存中的序号。

FaceCount — 在子集中的面(三角形)数。

VertexStart — 该子集的起始顶点在顶点缓存中的序号。

VertexCount — 在子集中的顶点数。


建立了属性表以后,渲染一个子集就很容易了。仅仅查一下属性表就能找出自己的几何信息。注意如果没有属性表,每渲染一个子集就需要对属性缓存进行一次线性搜索来找出子集包含的几何信息。

可以使用下面的方法来访问mesh的属性表:

Retrieves either an attribute table for a mesh, or the number of entries stored in an attribute table for a mesh.

HRESULT GetAttributeTable(
  D3DXATTRIBUTERANGE * pAttribTable,
  DWORD * pAttribTableSize
);
Parameters
pAttribTable
[in, out] Pointer to an array of D3DXATTRIBUTERANGE structures, representing the entries in the mesh's attribute table. Specify NULL to retrieve the value for pAttribTableSize.
pAttribTableSize
[in, out] Pointer to either the number of entries stored in pAttribTable or a value to be filled in with the number of entries stored in the attribute table for the mesh.
Return Values

If the method succeeds, the return value is D3D_OK. If the method fails, the return value can be D3DERR_INVALIDCALL.

Remarks

An attribute table is created by ID3DXMesh::Optimize and passing D3DXMESHOPT_ATTRSORT for the Flags parameter.

An attribute table is used to identify areas of the mesh that need to be drawn with different textures, render states, materials, and so on. In addition, the application can use the attribute table to hide portions of a mesh by not drawing a given attribute identifier when drawing the frame.

这个方法能够做两件事情:它可以返回属性表的属性数,也可以用属性数据来填充一个D3DXATTRIBUTERANGE结构数组。

要得到属性表的元素个数,可以就将第一个参数设置为0:

DWORD numSubsets = 0;

Mesh->GetAttributeTable(0, &numSubsets);

一旦我们知道了属性表的元素个数,我们就能够通过写属性表来填充一个D3DXATTRIBUTERANGE结构数组:

D3DXATTRIBUTERANGE table = new D3DXATTRIBUTERANGE [numSubsets];

Mesh->GetAttributeTable( table, &numSubsets );

 

我们能够使用ID3DXMesh::SetAttributeTable方法来直接设置属性表。

Sets the attribute table for a mesh and the number of entries stored in the table.

HRESULT SetAttributeTable(
  CONST D3DXATTRIBUTERANGE * pAttribTable,
  DWORD cAttribTableSize
);
Parameters
pAttribTable
[in] Pointer to an array of D3DXATTRIBUTERANGE structures, representing the entries in the mesh attribute table.
cAttribTableSize
[in] Number of attributes in the mesh attribute table.
Return Values

If the method succeeds, the return value is D3D_OK. If the method fails, the return value can be one of the following: D3DERR_INVALIDCALL, E_OUTOFMEMORY.

Remarks

If an application keeps track of the information in an attribute table, and rearranges the table as a result of changes to attributes or faces, this method allows the application to update the attribute tables instead of calling ID3DXMesh::Optimize again.

下面的代码就是设置一个有12个子集的属性表:

D3DXATTRIBUTERANGE attributeTable[12];

// ...fill attributeTable array with data

Mesh->SetAttributeTable( attributeTable, 12);


10.6 邻接信息

对于mesh的某些操作,如优化,有必要了解的是三角形之间的邻接信息。Mesh的邻接数组存储了这些信息。

邻接数组是一个DWORD数组,其中的每一项对应了mesh中的一个三角形。例如,第i项对应的三角形由以下三个索引值定义:

A = i x3

B = i x3 + 1

C = i x3 + 2

注意,使用ULONG_MAX = 4294967295表示该边没有邻接三角形。我们也可以用-1来表示,因为-1转换成DWORD就是ULONG_MAX。回想一下,DWORD就是一个unsigned32-bit整数。

因为每个三角形都有三条边,所以它最多有三个邻接三角形(如图10.4)。

因此,邻接数组必须有三项(ID3DXBaseMesh::GetNumFaces()*3)—— 在mesh中每个三角形都可能有三个邻接三角形。

很多D3Dxmesh创造函数都能输出邻接信息,但我们也可以使用下面的方法:

HRESULT ID3DXMesh::GenerateAdjacency(

       FLOAT fEpsilon,

       DWORD* pAdjacency

);

fEpsilon — 指示当两个点距离有多近时,可以认为是一个点。当两点间的距离小于epsilon时,可认为它们是同一个点。

pAdjacency — 一个指向填充了邻接信息的DWORD数组指针。

例子:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

D3DXMESHOPT_ATTRSORT 的相关文章

  • Maven详解之仓库------本地仓库、远程仓库

    Dragon s Life 坚持 完成每一个目标 目录视图 摘要视图 订阅 征文 从高考 到程序员 深度学习与TensorFlow入门一课搞定 每周荐书 Web扫描 HTML 5 Python 评论送书 Maven详解之仓库 本地仓库 远程
  • DevOps面试问题

    DevOps是一组过程 方法与系统的统称 用于促进开发 应用程序 软件工程 技术运营和质量保障 QA 部门之间的沟通 协作与整合 下面为大家分享DevOps系列的面试问题 持续整合问题 问题一 持续集成是什么意思 我将建议您通过给出持续集成
  • seaborn.heatmap操作手册

    本文转自seaborn heatmap官方操作手册 http seaborn pydata org generated seaborn heatmap html heatmap很好 很强大 seaborn heatmap seaborn0
  • IT校招指南——超实用

    http blog csdn net liuqiyao 01 article details 26567237
  • 高并发情况下修改系统参数

    单进程最大打开文件数限制 一般的发行版 限制单进程最大可以打开1024个文件 这是远远不能满足高并发需求的 调整过程如下 在 号提示符下敲入 ulimit n 65535 限制修改失败了 会显示 Operationnotpermitted
  • LaTex中把下标置于文本正下方的方法 (转载)

    转载一篇文章 因为我想打出 H z H 0 J m
  • 优雅的代码命名规范,代码如诗

    优雅的代码命名规范 管理类命名 传播类命名 回调类命名 监控类命名 内存管理类命名 过滤检测类命名 结构类命名 常见设计模式命名 解析类命名 网络类命名 CRUD命名 其他 END 日常编码中 代码的命名是个大的学问 能快速的看懂开源软件的
  • 【转载】Java中将InputStream读取为String, 各种方法的性能对比

    Java中将InputStream读取为String 各种方法的性能对比 原文地址 http www cnblogs com milton p 6366916 html 如下 一共存在11种实现方式及其对应的性能测试结果 1 使用IOUti
  • 从30岁到35岁:为你的生命多积累一些厚度

    你所有不曾料想过的问题 都会随着时间的推移而与你不期而遇 你所有曾经潇洒的随遇而安 同样也会随时间流逝而让你承担那些似乎命中已经注定的代价 在这 个世界上 唯一不可阻挡的是时间 它像一把利刃 无声地切开了坚硬和柔软的一切 恒定地向前推进着
  • 运维技能风向标

    运维介绍 运维是一个融合多学科 网络 系统 开发 安全 应用架构 存储等 的综合性技术岗位 从最初的网络管理 网管 发展到现在的系统运维工程师 网络运维工程师 安全运维工程师 运维开发工程师等 可以看出 运维的分工一直在细化 并且对综合技能
  • S7-1200 PLC的数据类型

    S7 1200 PLC的数据类型 除了基本数据类型之外 还支持一些复杂的数据类型 包括结构数据类型Struct PLC数据类型UDT 数组Array 系统数据类型SDT 硬件数据类型DB ANY 参数数据类型Variant String和C
  • Android 控件 RecyclerView 看这篇就够了

    Android 控件 RecyclerView 概述 RecyclerView是什么 从Android 5 0开始 谷歌公司推出了一个用于大量数据展示的新控件RecylerView 可以用来代替传统的ListView 更加强大和灵活 Rec
  • [转载]QT框架的一个截图工具

    原文标题 Snipaste 开发了三年的截图工具 但不只是截图 原文作者 levie 一直以来都想要入门QT 但是却一直没有付诸行动 昨天在无意间发现了 这个开发者的截图工具 虽然我还没有使用 但是看上去却很能吸引目光 便重新激发了我开始学
  • 什么是to B 业务

    引言 To B or Not to B there is not a question 对于企业而言 数据分析的作用主要体现在三大领域 1 是对业务的改进优化 2 是帮助业务发现机会 3 是创造新的商业价值 数据分析最重要的是基于对业务的理
  • 报这样的错误 error: #35: #error directive: "Please select first th 解决方法

    右键点击工程名 选择第一个options for target 下面选择C C 在define文本框中输入 USE STDPERIPH DRIVER STM32F10X MD MD根据你选择的机种更换为LD或HD
  • jumpserver堡垒机 (资源)

    23 5 jumpserver介绍 官网www jumpserver org 跳板机概述 跳板机就是一台服务器 开发戒运维人员在维护过程中首先要统一登录到这台服务器 然后再登录到目标 设备迚行维护和操作 堡垒机概述 堡垒机 即在一个特定的网
  • Android Rxjava:最简单易懂的诠释 看这篇

    1 前言 Rxjava 具有链式调用 使用简单 事件与结果松耦合的特点 Rxjava 之所以深受欢迎它包含 非常多操作符 能通过 链式形 优雅整洁的代码几乎能实现所有的功能需求 本文特点 图多字少 逻辑简单 之前面试中被问了很多Rxjava
  • T0、T1、TS、D1是什么鬼?一文看懂POS机刷卡到账模式区别和利弊

    经常被一些刚刚接触POS机的朋友问到一个 什么是T0 什么是T1 今天小敏子就和大家来探讨一下几种刷卡到账模式区别和利弊 一 先说一下定义 什么是T T为英文Trade交易的首字母 什么是D D为英文Day 天 的首字母 什么是S S为英文
  • 运维工具

    环境部署 部署软件 如Apache Nginx tomcat JDK PHP MySQL等等 还需要测试吧 那就还需要部署一套测试环境 有些时候 开发环境也是需要运维来部署的 排错和调优 运维的事 尽快定位问题 解决问题才是王道 定位问题
  • web3无法在浏览器远程调用miner.start()

    原文 https bitshuo com topic 58841835fd9ca2790427eb67 web3无法在浏览器远程调用miner start 首先我在启动私链时已经调用了miner模块 代码如下 geth identity s

随机推荐

  • 【CLIP详读】

    个人网站 https tianfeng space 一 前言 OpenAI的CLIP项目自从推出以来 CLIP引起了广泛的关注 它的方法看似简单 但效果非常出色 许多结果令人惊叹 例如 预训练模型可以在任何视觉分类数据集上实现出色的效果 而
  • ubuntu apt-get dpkg应用中的一些问题及解决方法

    一 在用sudo apt get install 安装软件时 由于速度太慢 想换个软件源 直接关闭了终端 apt get但进程没有结束 结果终端提示 E 无法获得锁 var lib dpkg lock open 11 资源暂时不可用 E 无
  • 【Javadoc生成开发文档(Terminal或IDEA中)】

    Javadoc生成开发文档 一 Javadoc工具介绍 二 常用标记 三 使用方式 四 生成文档的两种方式 1 Terminal方式 2 IDE方式 一 Javadoc工具介绍 大家在查看官网文档的时候 会不会感慨人家的帮助文档写的真有逻辑
  • 轻松刷脸是美妙的线下消费体验过程

    刷脸支付的过程非常的简单 你不需要带钱包 信用卡或手机 支付时只需要自己面对刷脸支付pos机屏幕上的摄像头 刷脸支付系统会自动将消费者面部信息与个人账户相关联 整个交易过程十分便捷 在移动支付的快速发展中 消费者逐渐习惯使用移动支付 即使身
  • 交换机的Access口与Trunk口

    基本概念 Access类型的端口只能属于1个VLAN 一般用于连接计算机的端口 Trunk类型的端口可以允许多个VLAN通过 可以接收和发送多个VLAN的报文 一般用于交换机之间连接的端口 处理流程 Acess端口收报文 收到一个报文 判断
  • Python 分割技术提取图像和视频中对象

    计算机视觉是计算机查看和识别对象的媒介 计算机视觉的目标是使计算机能够分析图像和视频中的对象 解决不同的视觉问题 对象分割为方便分析图像和视频中的对象铺平了道路 对不同领域做出了巨大贡献 例如医学 自动驾驶汽车的视觉以及图像和视频的背景编辑
  • vue form 滑动验证码、手机短信验证

    话不多说直接上效果图 vue 注册首页 校验 滑动验证 页面源码
  • mysql explain执行计划

    mysql explain执行计划 mysql gt EXPLAIN SELECT FROM t item i LEFT JOIN t sku s ON i item id s item id LEFT JOIN t sku stock t
  • 楠姐技术漫话:接着唠唠社区发现

    halo 大家好 很开心又和大家见面了 在第一篇技术漫话 图计算的那些事 发布之后 楠姐收到了很多鼓励和支持 非常感谢大家的喜欢 所以楠姐尽自己所能马不停蹄开始第二篇的创作 虽迟但到 也尝试在第二期中 在可读性和观感上尽量做些优化和进步 本
  • Managing Big Data with MySQL学习笔记

    Managing Big Data with MySQL学习笔记 Intro Week 1 How Relational Databases Help Solve Those Problems Database Design Tools E
  • Vue 高德地图实现添加标记,AMap.PlaceSearch 地点搜索,根据页面主题修改地图样式

    Vue 高德地图实现添加标记 AMap PlaceSearch 地点搜索 根据页面主题修改地图样式 效果图 成为开发者并创建key 详细请查阅官方文档 https developer amap com api jsapi v2 guide
  • 分布式锁实现方案3、基于Redis的SET操作实现的分布式锁

    在我的上一篇文章中 关于redis分布式锁的写法 释放锁还有些缺陷 细节见评论部分 本文进一步做了完善 分布式锁实现方案2 基于Redis的SET操作实现的分布式锁 package com alioo common lock import
  • 【leetcode.283】——移动零

    题目 注意 解析 思路 定义left和right指针 都初始化在数组的第一个位置 right指针一直向右走 如果right走到指向的值不为0时 那么right指针指向的值与left指针指向的值进行交换 然后left指针再向后走一步 如此循环
  • c++十大排序——快速排序

    算法基本知识铺垫 有些人可能不知道什么是稳定排序 原地排序 时间复杂度 空间复杂度 我这里先简单解释一下 1 稳定排序 如果 a 原本在 b 的前面 且 a b 排序之后 a 仍然在 b 的前面 则为稳定排序 2 非稳定排序 如果 a 原本
  • nodejs高大上的部署方式-PM2

    如果直接通过node app来启动 如果报错了可能直接停在整个运行 supervisor感觉只是拿来用作开发环境的 再网上找到pm2 目前似乎最常见的线上部署nodejs项目的有forever pm2这两种 使用场合 supervisor是
  • 旋转链表——快慢指针法的实践

    一 题目 给你一个链表的头节点 head 旋转链表 将链表每个节点向右移动 k 个位置 示例1 输入 1 gt 2 gt 3 gt 4 gt 5 gt NULL k 2 输出 4 gt 5 gt 1 gt 2 gt 3 gt NULL 解释
  • matlab灵敏度分析操作,灵敏度分析 使用MATLAB编写.doc

    灵敏度分析 使用MATLAB编写 实验二 线性规划的灵敏度分析 实验目的 1 线性规划求解的单纯形法的灵敏度分析的编程实现 2 掌握使用matlab Lingo Excel的规划求解功能求解 并利用 敏感性报告 进行分析 二 实验内容 课本
  • wazuh中的规则编写以及日志分析

    目录 什么是wazuh 如何搭建wazuh 实验环境 wazuh的规则 配置代理 wazuh中的配置了解 ssh的暴力破解 用户自定义规则 SQL注入的检测 什么是wazuh Wazuh是一个免费 开源和企业级的安全监控解决方案 用于威胁检
  • 【2223sW2】LOG2

    写在前面 好好学习 走出宿舍 走向毕设 一些心路历程记录 很少有代码出现 因为鬼知道哪条代码到时候变成毕设的一部分了咧 还是不要给自己的查重挖坑罢了 23 3 2 检验FFT 早上师兄帮忙看了一眼我画的丑图 说样子应该是对的 增加了检查的精
  • D3DXMESHOPT_ATTRSORT

    Mesh的顶点和索引能够被重组以便能更有效的渲染mesh 当我们这样做时 我们说我们优化了一个mesh 我们可以使用下面的方法来进行优化 HRESULT ID3DXMesh OptimizeInplace DWORD Flags CONST