NVIDIA 技术博客:在 HLSL 中解锁 GPU 内部架构

nvdev 2024-03-01 15:05:20

这篇文章最初发表在 NVIDIA 技术博客上。有关此类的更多内容,请参阅最新的 内容创建/渲染 新闻和教程。

NVIDIA GPU 指令集中存在一些标准图形 API 中不包含的有用内部函数。

更新自 2016 年原始博文,添加了有关 DirectX 和 Vulkan 中新的内部结构和跨供应商 API 的信息。

例如,着色器可以使用线程束 shuffle 指令在线程束中的线程之间交换数据,而无需通过共享内存,这在没有共享内存的像素着色器中尤其重要。或者,着色器可以在全局内存中对半精度浮点数执行原子添加。

我们的文章 线程之间的读取:着色器内部函数 向您展示了内部指令的工作原理。现在,我将带您深入了解如何让它们在 DirectX 中运行。

在标准 DirectX 或 OpenGL 中,所有这些内部结构都不可能实现。[2023 年:这不再是事实。更多信息将在本文稍后分享。]但它们在 CUDA 中得到了多年的支持和详细记录。在 DirectX 中支持它们的机制已经推出一段时间,但没有得到广泛的记录。我的系统恰好从 2014 年 10 月开始就有旧的 NVAPI 版本 343,该版本(可能是更早的版本)在 DirectX 中支持内部函数。本文介绍了在 DirectX 中使用它们的机制。

遗憾的是,与 OpenGL 或 Vulkan 不同,DirectX 没有针对特定供应商的扩展程序的原生机制。但是,仍然可以通过自定义内部函数在 DirectX 11 或 12 中使用所有这些功能。这种机制在图形驱动程序中实现,并可通过 NVAPI 库 来访问。

扩展 HLSL 着色器

要使用内部函数,必须将其编码为常规 HLSL 指令的特殊序列,以便驱动识别并转换为预期操作。这些特殊序列在 NVAPI SDK 随附的其中一个头文件中提供:nvHLSLExtns.h.

这些指令序列的一个重要方面是,它们必须在不进行优化的情况下通过 HLSL 编译器,因为编译器不理解它们的真正含义,因此可以修改它们,改变它们的顺序,甚至完全删除它们。

为了防止编译器这样做,序列在 UAV 缓冲区上使用原子操作。HLSL 编译器无法优化这些指令,因为它不知道可能的依赖项,即使没有依赖项。UAV 缓冲区基本上是假的,在通过 NVIDIA GPU 驱动程序后,实际着色器不会使用它。但应用程序仍然必须为其分配 UAV 插槽,并告诉驱动程序哪个插槽。

例如,NvShfl实现 Warp shuffle 的函数类似于以下代码示例,nvHLSLExtns.h:

int NvShfl(int val, uint srcLane, int width = NV_WARP_SIZE) {     uint index = g_NvidiaExt.IncrementCounter();     g_NvidiaExt[index].src0u.x  =  val;          // variable to be shuffled     g_NvidiaExt[index].src0u.y  =  srcLane;      // source lane     g_NvidiaExt[index].src0u.z  =  __NvGetShflMaskFromWidth(width);     g_NvidiaExt[index].opcode   =  NV_EXTN_OP_SHFL; color.r = asfloat(NvShfl(asuint(color.r), 0)); color.b = asfloat(NvShfl(asuint(color.b), 0)); return color; }

这个示例看起来可能是在做一些毫无意义的事情,而且确实如此。图形应用程序中内部函数的真实用例通常很复杂。例如,Warp shuffle 可用于优化算法(如光线消除)中的内存访问。VXGI 中使用浮点原子来在体素化期间累加发射。但是,这些应用程序需要大量着色器和主机代码才能正常工作。另一方面,这个示例几乎可以插入任何像素着色器,效果很明显。

编译此着色器时,每次调用NvShfl扩展到此序列中,指定或获取寄存器名称:

imm_atomic_alloc r1.x, u1 mov r3.yz, l(0,0,31,0) mov r3.x, r2.z store_structured u1.xyz, r1.x, l(76), r3.xyzx store_structured u1.x, r1.x, l(0), l(1) imm_atomic_alloc r0.y, u1

当此着色器通过驱动程序的 JIT 编译器时,NvShfl函数映射到一个 GPU 指令:

SHFL.IDX        PT, R3, R3, RZ, 0x1f;

在 DirectX 11 中创建扩展着色器

要实际使用此着色器,必须以特殊方式创建其运行时对象。定期调用ID3D11Device::CreatePixelShader这还不够,因为驱动程序必须知道着色器打算使用内部函数。它还必须知道使用哪个 UAV 插槽。

如果您使用的是 DirectX 11,请使用NvAPI_D3D11_SetNvShaderExtnSlot函数调用之前和之后CreatePixelShader:

// Do this one time during app initialization. NvAPI_Initialize(); ID3D11PixelShader* pShader = nullptr; HRESULT D3DResult = E_FAIL; // First, enable compilation of intrinsics. // The second parameter is the UAV slot index that is used in the shader: u1. NvAPI_Status NvapiStatus = NvAPI_D3D11_SetNvShaderExtnSlot(pDevice, 1); if(NvapiStatus == NVAPI_OK) {     // Then create the shader as usual...     D3DResult = pDevice->CreatePixelShader(pBytecode, BytecodeLength, nullptr, &pShader);     // And disable again by telling the driver to use an invalid UAV slot.     NvAPI_D3D11_SetNvShaderExtnSlot(pDevice, ~0u); } if(FAILED(D3DResult)) {     // ...Handle the error... }

此方法适用于任何可以引用 UAV 的着色器。因此,在 DirectX 11.0 中,它适用于像素和计算着色器。在 DirectX 11.1 及更高版本中,它应该适用于各种着色器。

在 DirectX 12 中创建扩展的工作流状态对象

如果您使用的是 DirectX 12,则不存在单独的着色器对象,而是创建完整的工作流状态 (PSO).

还有其他各种特定于 NVIDIA 的工作流状态扩展程序可通过 NVAPI 访问,因此为了避免使用各种扩展程序创建 PSO 的功能组合爆炸, NVIDIA 仅制作了两个功能,一个用于图形,另一个用于计算,可接受使用的扩展程序列表:

  • NvAPI_D3D12_CreateGraphicsPipelineState
  • NvAPI_D3D12_CreateComputePipelineState

HLSL 扩展由NVAPI_D3D12_PSO_SET_SHADER_EXTENSION_SLOT_DESC结构。不过,整个工作流状态只有一个,因此,如果工作流中的两个或多个着色器使用内部函数,它们必须为其使用相同的 UAV 插槽。

// Do this one time during app initialization. NvAPI_Initialize(); // Fill the PSO description structure D3D12_GRAPHICS_PIPELINE_STATE_DESC PsoDesc; PsoDesc.VS = { pVSBytecode, VSBytecodeLength }; // ...And so on, as usual... // Also fill the extension structure. // Use the same UAV slot index and register space that are declared in the shader. NVAPI_D3D12_PSO_SET_SHADER_EXTENSION_SLOT_DESC ExtensionDesc;       ExtensionDesc.baseVersion = NV_PSO_EXTENSION_DESC_VER; ExtensionDesc.psoExtension = NV_PSO_SET_SHADER_EXTNENSION_SLOT_AND_SPACE; ExtensionDesc.version = NV_SET_SHADER_EXTENSION_SLOT_DESC_VER; ExtensionDesc.uavSlot = 1; ExtensionDesc.registerSpace = 0; // Put the pointer to the extension into an array. There can be multiple extensions enabled at one time. // Other supported extensions are:       //     - Extended rasterizer state       //  - Pass-through geometry shader, implicit or explicit       //  - Depth bound test       const NVAPI_D3D12_PSO_EXTENSION_DESC* pExtensions[] = { &ExtensionDesc }; // Now create the PSO. ID3D12PipelineState* pPSO = nullptr; NvAPI_Status NvapiStatus = NvAPI_D3D12_CreateGraphicsPipelineState(pDevice, &PsoDesc, ARRAYSIZE(pExtensions), pExtensions, &pPSO); if(NvapiStatus != NVAPI_OK)     {        // ...Handle the error...     } }

查询 GPU 功能支持

最后,在尝试使用内部函数之前,您可能想知道应用所用的设备是否实际上支持这些内部函数。有两个 NVAPI 函数可以告诉您:

  • NvAPI_D3D11_IsNvShaderExtnOpCodeSupported
  • NvAPI_D3D12_IsNvShaderExtnOpCodeSupported

我们opCodeparameter 标识您感兴趣的特定操作。操作代码在nvShaderExtnEnums.hNVAPI SDK 随附的文件。例如,要测试 DirectX 11 设备是否支持 Warp shuffle,请使用以下代码示例:

#include "nvShaderExtnEnums.h" bool bSupported = false; NvAPI_Status NvapiStatus = NvAPI_D3D11_IsNvShaderExtnOpCodeSupported(pDevice, NV_EXTN_OP_SHFL, &bSupported); if(NvapiStatus == NVAPI_OK && bSupported) {     // Yay, the device is no older than 2012! }

2023 年更新:新的内部函数和跨供应商 API

NVIDIA GPU 支持的内部函数并不仅限于线程束 shuffle。事实上,线程束 shuffle 和相关函数现在可以通过 DirectX 12 和 Vulkan 中的跨供应商内部函数获得,因此无需使用 NVAPI。有关 DirectX 12 波内部函数的更多信息,请参阅Wave 内部函数。有关 Vulkan 子组操作的更多信息,请参阅Vulkan 子组教程

NVIDIA GPU 支持的内部函数的完整列表可在名为 nvHLSLExtns.h 的文件中找到,现已在 GitHub 上提供。此文件中声明的函数可细分为几个通用类别:

  • 较旧的线程束运算:shuffle、vote、ballot、通道索引 (NvShfl*, NvAny, NvAll, NvBallot, NvGetLaneId)
  • 更新的线程束运算:波形匹配 (NvWaveMatch). NvWaveMatch返回线程束中活动通道的遮罩,这些通道的参数值与当前通道相同。
  • 特殊寄存器访问权限(NvGetSpecial)
  • FP16、FP32 和 Uint64 变量上的扩展原子运算 (NvInterlocked*)
  • 可变速率着色(NvGetShadingRate, NvEvaluateAttribute*)
  • 纹理足迹评估(NvFootprint*)
  • WaveMultiPrefix 函数(NvWaveMultiPrefix*这些函数只是基于其他内部函数构建的算法。
  • 光线追踪微图扩展程序(NvRtMicroTriangle*, NvRtMicroVertex*)
  • 光线追踪着色器执行重排序(NvHitObject, NvReorderThread)

更新:编译具有正确选项的着色器

目前, NVIDIA GPU 驱动存在一个影响 HLSL 内部函数的已知问题。具体来说,如果着色器使用D3DCOMPILE_SKIP_OPTIMIZATION标志或/Od传递给 FXC 的命令行选项。如果您看到内部函数不起作用,请确保未指定此标志。

结束语

有关 NVAPI 函数和结构的更多信息,请参阅 NVAPI 头文件中的注释。有关更多用例和内部函数示例,请参阅以下资源:

 

阅读原文

...全文
40 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
文名: 精通DirectX 3D图形与动画程序设计 原名: 精通DirectX 3D图形与动画程序设计 别名: 游戏编程, 游戏开发 作者: 王德才 资源格式: PDF 版本: 扫描版 出版社: 人民邮电出版社书号: 9787115159717发行时间: 2007年5月 地区: 大陆 语言: 简体文 简介: 内容介绍:  本书系统全面地介绍了direct3d三维图形程序设计的相关内容。全书共分5个部分。第一部分介绍了direct3d程序设计基础,包括三维坐标变换、光照处理、纹理贴图、雾化效果、文件模型、文本和字体等内容。第二部分介绍了direct3d程序设计的相关高级技术,包括多层纹理映射、纹理坐标自动生成与变换、环境映射、凹凸纹理映射、立体纹理、纹理压缩、.x文件格式分析、网格模型优化、层次细节网格模型、增强网格模型、蒙皮骨骼动画网格模型以及粒子系统等。第三部分介绍了direct3d gpu编程(即可编程流水线),包括hlsl渲染语言、hlsl顶点渲染、hlsl像素渲染、effect及其高级应用、asm顶点渲染、asm像素渲染。第四部分介绍了三维图形程序设计领域目前流行的许多实用技术,包括广告板技术、纹理动画技术、自然现象模拟、三维地形模拟、海浪效果模拟、柔性物体模拟、凹凸纹理应用、短毛发模拟以及体积雾等。第五部分是附录,包括学习direct3d之前所必须掌握的基础知识和directx sdk提供的各种工具的简要说明。   本书配套光盘提供了书所有示例程序的可执行文件、工程文件和完整源代码,以方便读者编译、调试示例程序。   本书主要面向对direct3d三维图形程序设计感兴趣的编程人员、游戏开发人员以及可视化仿真工程技术人员,也可作为高等院校相关专业和培训机构的direct3d程序设计用书。 目录: 第一部分 基础篇 第1章 directx与direct3d简介 1.1 什么是directx和direct3d 1.2 directx的发展历史  1.3 directx 9.0的安装与配置  1.3.1 directx 9.0的安装 1.3.2 选择调试或发布库 1.3.3 在visual studio.net ide配置directx 1.3.4 浏览directx sdk示例程序   1.4 directx功能组件 1.5 directx的几种开发方式 1.6 小结 第2章 direct3d程序设计基础 2.1 相关基础知识 2.2 direct3d体系结构 2.3 direct3d对象 2.4 direct3d设备对象 2.4.1 direct3d设备类型 2.4.2 创建direct3d设备对象 2.5 direct3d程序基本结构 . 2.6 最简单的direct3d程序   2.6.1 工程项目和开发环境设置 2.6.2 创建窗口 2.6.3 初始化direct3d 2.6.4 消息循环 2.6.5 渲染图形 2.6.6 结束direct3d程序   2.7 direct3d设备对象深入探讨 2.8 direct3d表面 2.9 小结 第3章 坐标系与基本图元 3.1 direct3d坐标系 3.2 direct3d基本图元 3.3 使用顶点缓冲区绘制图形 3.3.1 创建顶点缓冲区 3.3.2 渲染顶点缓冲区图形 3.3.3 各种基本图元绘制 3.4 使用索引缓冲区绘制图形 3.5 图形渲染其他相关内容 3.5.1 灵活顶点格式 3.5.2 渲染状态 3.5.3 场景提交 3.5.4 图形反锯齿(antialiasing) 3.5.5 全屏幕显示 3.6 direct3d的颜色表示 3.7 资源的概念 3.8 小结 第4章 顶点坐标变换 4.1 顶点坐标变换和光照流水线概述 4.2 矩阵类型及其操作 4.3 世界变换 4.4 取景变换 4.5 投影变换 4.6 视区变换 4.7 获取direct3d坐标变换矩阵 4.8 三维坐标变换示例程序   4.9 小结 第5章 光照与材质 5.1 光照计算模型 5.2 光源 5.2.1 光源类型 5.2.2 光源属性 5.2.3 设置灯光 5.2.4 对光源的几点说明 5.3 材质 5.3.1 设置材质 5.3.2 获取材质属性 5.4 光照和材质示例程序   5.4.1 简单光照示例程序   5.4.2 多光源光照示例程序   5.4.3 使用灯光的几点说明 5.5 深入理解光照计算模型 5.6 小结 第6章 纹理映射基础 6.1 基本概念 6.2 使用纹理 6.3 纹理过滤方式 6.3.1 最近点采样  6.3.2 线性纹理过滤 6.3.3 各项异性纹理过滤 6.3.4 多级渐进纹理过滤 6.3.5 纹理过滤方式示例程序   6.4 纹理寻址模式 6.4.1 重迭纹理寻址模式 6.4.2 镜像纹理寻址模式 6.4.3 夹取纹理寻址模式 6.4.4 边框颜色纹理寻址模式 6.4.5 纹理寻址模式示例程序   6.5 纹理阶段混合状态 6.5.1 纹理阶段混合状态设置 6.5.2 纹理阶段混合状态示例程序   6.6 纹理包装 6.7 小结 第7章 使用文件模型 7.1 三维模型基础 7.2 模型文件格式转换 7.2.1 ds max制作的模型转换为.x文件模型 7.2.2 maya制作的模型转换为.x文件模型 7.3 在direct3d程序载入模型 7.3.1 网格模型接口id3dxmesh 7.3.2 载入.x文件并生成网格模型 7.4 渲染网格模型 7.5 三维模型旋转 7.5.1 通过矩阵实现模型旋转 7.5.2 通过四元数实现模型旋转 7.6 使用文件模型的几点提示 7.7 小结 第8章 深度测试与alpha混合 8.1 深度测试 8.1.1 深度缓冲区与深度测试 8.1.2 使用深度测试 8.2 半透明物体的绘制 8.2.1 alpha混合原理 8.2.2 利用alpha混合实现半透明效果 8.2.3 alpha混合系数 8.3 alpha测试 8.3.1 alpha测试原理 8.3.2 使用alpha测试 8.4 小结 第9章 雾化 9.1 雾化效果实现原理 9.2 雾化混合因子计算方法 9.3 顶点雾化与像素雾化 9.3.1 顶点雾化与基于范围的雾化 9.3.2 像素雾化和与眼相关深度雾化 9.4 为场景添加雾化效果 9.4.1 顶点雾化示例程序   9.4.2 像素雾化示例程序   9.4.3 基于范围的雾化示例程序   9.5 对雾化效果的几点说明 9.6 小结 第10章 字体与文本显示 10.1 二维文本绘制 10.2 三维文本绘制 10.3 小结 第二部分 高级技术篇 第11章 应用程序框架 11.1 生成一个direct3d程序框架 11.2 使用direct3d程序框架 11.3 direct3d程序框架剖析 11.3.1 dxut简介 11.3.2 初始化dxut 11.3.3 dxut框架与应用程序窗口 11.3.4 dxut框架与direct3d设备 11.3.5 dxut框架与消息循环 11.3.6 dxut框架与错误处理 11.3.7 通过dxut选择高级设备 11.3.8 其他dxut函数 11.4 添加文本 11.4.1 初始化id3dxsprite和id3dxfont对象 11.4.2 绘制文本 11.4.3 处理键盘消息 11.5 添加控件 11.5.1 初始化对话框 11.5.2 渲染控件 11.5.3 处理控件消息 11.5.4 释放对话框 11.6 小结 第12章 高级纹理技术 12.1 多层纹理映射 12.2 纹理阶段混合操作 12.2.1 黑暗映射 12.2.2 黑暗贴图动画 12.2.3 混合纹理与材质漫反射颜色 12.2.4 混合黑暗贴图与材质漫反射颜色 12.2.5 发光映射 12.2.6 细节映射 12.2.7 alpha混合操作 12.3 纹理坐标处理 12.3.1 纹理坐标自动生成 12.3.2 纹理坐标变换 12.4 环境纹理映射 12.4.1 立方体环境映射 12.4.2 球形环境映射 12.5 凹凸纹理映射 12.6 立体纹理 12.7 纹理压缩 12.7.1 dxt纹理压缩格式 12.7.2 使用dxt压缩纹理 12.8 纹理管理 12.9 小结 第13章 网格模型高级技术 13.1 .x文件格式分析 13.1.1 首部 13.1.2 网格 13.1.3 网格材质列表 13.1.4 法向量   13.1.5 纹理 13.1.6 框架和变换矩阵 13.1.7 动画 13.1.8 蒙皮信息 13.2 网格模型优化 13.2.1 网格模型优化函数 13.2.2 网格模型优化方式 13.2.3 示例程序optimizedmesh具体实现 13.3 层次细节网格模型 13.3.1 生成层次细节网格模型前的准备工作 13.3.2 生成层次细节模型 13.3.3 示例程序progressmesh的具体实现 13.4 增强网格模型 13.4.1 增强网格模型的生成 13.4.2 示例程序enhancedmesh的具体实现 13.5 渐变网格模型 13.5.1 实现渐变网格模型的准备工作 13.5.2 生成渐变网格模型 13.5.3 渲染渐变网格模型 13.6 dxut网格模型类 13.6.1 cdxutmesh类 13.6.2 cdxutmeshframe类和cdxutmeshfile类 13.6.3 使用类cdxutmesh和cdxutmeshfile渲染网格模型 13.7 骨骼动画网格模型 13.7.1 骨骼动画基本原理 13.7.2 骨骼动画类的设计与实现  13.7.3 骨骼动画类的使用 13.8 蒙皮骨骼动画网格模型 13.8.1 图形混合 13.8.2 索引顶点混合 13.8.3 顶点混合示例 13.8.4 蒙皮骨骼动画网格模型类的设计与实现 13.8.5 蒙皮骨骼动画网格模型类的使用 13.9 多骨骼动画网格模型 13.10 其他文件格式模型 13.11 小结 第14章 模板测试与模板缓冲区 14.1 模板测试 14.2 模板缓冲区 14.3 模板测试设置 14.4 使用模板测试实现特殊效果 14.5 实时阴影效果 14.6 小结 第15章 粒子系统 15.1 粒子系统技术简介 15.2 粒子系统基本原理 15.3 点精灵(point sprites) 15.4 粒子系统具体实现 15.5 综合开发实例 15.6 小结 第三部分 gpu编程篇 第16章 direct3d gpu编程概述 16.1 可编程流水线 16.2 顶点渲染 16.3 像素渲染 16.4 渲染语言 16.5 小结 第17章 高级渲染语言基础 17.1 数据类型 17.1.1 标准数据类型 17.1.2 向量   17.1.3 矩阵 17.1.4 复杂数据类型 17.2 表达式与运算符 17.3 语句 17.3.1 语句块 17.3.2 返回语句 17.3.3 流程控制语句 17.4 函数 17.5 段落 17.5.1 渲染器段落基本概念 17.5.2 渲染器段落语法 17.6 编写hlsl渲染器 17.6.1 添加文件 17.6.2 编写渲染器代码 17.7 小结 第18章 hlsl顶点渲染 18.1 hlsl顶点渲染基本步骤 18.2 使用hlsl顶点渲染实现基本光照模型 18.2.1 环境光光照模型 18.2.2 漫反射光照模型 18.2.3 镜面反射光照模型 18.3 小结 第19章 hlsl像素渲染 19.1 hlsl像素渲染基本步骤 19.2 使用hlsl实现基本纹理映射 19.3 渲染器的编译与调试 19.3.1 渲染器的编译 19.3.2 渲染器的调试 19.4 小结 第20章 效果(effect) 20.1 效果、技术与通道 20.1.1 效果和direct3d流水线 20.1.2 保存和恢复状态 20.1.3 共享参数 20.2 编写效果 20.3 使用效果 20.4 效果示例程序   20.4.1 光照计算 20.4.2 纹理映射 20.4.3 多技术效果 20.4.4 参数块与共享参数 20.5 建立并渲染段落 20.5.1 从效果建立并渲染段落 20.5.2 不通过效果建立并渲染段落 20.5.3 段落使用示例程序   20.6 小结 第21章 hlsl高级应用 21.1 自身遮蔽阴影 21.2 凹凸纹理映射 21.3 立方体环境映射 21.3.1 立方体贴图  21.3.2 反射环境映射 21.3.3 折射/反射环境映射 21.3.4 动态折射/反射环境映射 21.4 渐变动画  21.5 蒙皮骨骼动画 21.6 小结 第22章 asm顶点渲染 22.1 asm顶点渲染基本步骤 22.2 顶点声明对象 22.3 asm顶点渲染简介 22.3.1 顶点渲染版本声明 22.3.2 顶点渲染寄存器 22.3.3 顶点渲染指令 22.4 asm顶点渲染示例 22.4.1 光照计算 22.4.2 渐变动画 22.4.3 蒙皮骨骼动画 22.5 小结 第23章 asm像素渲染 23.1 asm像素渲染基本步骤 23.2 asm像素渲染简介 23.2.1 版本声明 23.2.2 像素渲染寄存器 23.2.3 像素渲染指令 23.3 asm像素渲染示例 23.4 使用效果 23.4.1 asm效果 23.4.2 利用效果实现hlsl和asm混合编程 23.5 小结 第四部分 实用技术篇 第24章 dxut控件 24.1 dxut控件介绍 24.2 dxut控件使用示例程序   24.3 小结 第25章 广告板技术与十字交叉纹理 25.1 广告板技术 25.1.1 广告板技术介绍 25.1.2 广告板技术示例程序   25.2 十字交叉纹理 25.2.1 十字交叉纹理介绍 25.2.2 十字交叉纹理示例程序   25.3 小结 第26章 纹理动画 26.1 纹理动画原理 26.2 纹理动画示例程序   26.3 小结 第27章 自然现象模拟 27.1 动态云彩效果模拟 27.2 雨景效果模拟 27.3 雪景效果模拟 27.4 小结 第28章 三维地形模拟 28.1 三维地形模拟概述 28.2 三维地形模拟示例程序   28.3 小结 第29章 海浪效果模拟 29.1 使用纹理贴图实现海浪效果 29.2 实时生成海浪效果 29.3 小结 第30章 柔性物体模拟 30.1 柔性物体模拟介绍 30.2 粒子系统和弹簧结构 30.3 定义并实现cflutterflag类 30.4 示例程序的具体实现 30.5 小结 第31章 三维场景交互 31.1 使用鼠标选择三维场景的物体 31.2 使用鼠标控制三维场景角色的运动 31.3 小结 第32章 运动模糊效果 32.1 运动模糊效果的基本原理 32.2 示例程序motionblur 32.3 小结 第33章 凹凸纹理映射应用 33.1 水下效果模拟 33.2 水波效果模拟 33.3 小结 第34章 短毛发实时绘制 第35章 体积雾 第五部分 附录 附录a c++基础知识 a.1 类及其成员和封装 a.2 继承 a.3 this指针 a.4 虚函数、动态绑定和多态 a.5 双指针 a.6 内联函数 a.7 默认函数参数 a.8 声明变量的位置 a.9 const常量表达式   a.10 函数重载 a.11 运算符重载 附录b win32 api程序设计基础 b.1 api和sdk b.2 win32程序框架 b.3 win32 api程序框架分析 附录c com使用基础 c.1 什么是com对象 c.2 创建一个com对象 c.3 使用com接口 c.4 管理com对象的生命期 c.5 使用c访问com对象 c.6 用宏调用directx com方法 附录d 计算机图形学数学基础 d.1 坐标参照系 d.2 点与向量   d.3 矩阵 d.4 四元数 附录e 计算机图形学基础 e.1 概述 e.1.1 计算机图形学的概念 e.1.2 计算机图形学的研究内容 e.2 图形系统与图形设备 e.2.1 图形系统 e.2.2 图形设备 e.3 图形变换 e.3.1 图形的几何变换 e.3.2 形体的投影变换 e.3.3 裁剪 e.3.4 窗口到视口的变换 附录f directx sdk提供的各种工具使用说明 f.1 directx浏览器 f.2 纹理转换工具 f.3 directx纹理工具 f.4 directx性能浏览工具 f.5 directx错误查询工具 f.6 directx诊断工具 f.7 directx ops(dxops.exe)

1,214

社区成员

发帖
与我相关
我的任务
社区描述
NVIDIA 开发者技术交流
人工智能 企业社区
社区管理员
  • nvdev
  • 活动通知
  • AI_CUDA_Training
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧