自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(384)
  • 收藏
  • 关注

原创 顶点着色器

顶点着色器(vertex shader)是-一段运行在图形卡GPU中的程序,它可取代固定功能流水线中的(当然,这也不是绝对的,因为在硬件不支持顶点着色器的情况下,Direct3D运行时就会用软件运算方式来模拟顶点着色器)可以看出,顶点是以局部坐标(局部坐标系中的坐标)输入顶点着色器的,而且顶点着色器必须将照亮的(上色的)顶点输出到齐次裁剪空间中。由于顶点着色器其实就是我们用HLSL语言编写的一段定制程序,这样我们在可实现的图形效果上就获得了很大的。

2023-11-15 18:39:31 218

原创 高级着色语言(HLSL)

HLSL中的函数具有以下性质函数使用与C++类似的语法参数总是按值传递的不支持递归函数总是内联的。

2023-11-14 16:43:18 506

原创 Direct3D拾取

假设在屏幕上单击,击中的位置为点s=(x,y)。由图可以看出,用户选中了茶壶。但是仅给出点s,应用程序还无法立即判断出茶壶是否被选中。所以针对这类问题,我们需要采用一项称为“拾取(Picking)”的技术。茶壶和屏幕点s之间的一种联系是茶壶被投影到了一个包含了的区域中。更准确地说,茶壶被投影到了投影窗口中一个包含点(点P位于投影窗口中)的区域中,其中点。我们看到,如果自坐标原点发出一条拾取射线(picking ray)该射线将与那些其投影包围了点p的物体(即茶壶)。

2023-11-13 10:35:43 417

原创 Direct3D粒子系统

例如加了粒子尺寸字段,但是没有给该字段赋值。

2023-11-09 19:34:34 1143

原创 Direct3D地形绘制基础

思路是:地形中海拔较低的部分上色为沙滩色,中等海拔的部分上色为绿色的丘陵颜色,高海拔的部分上色为雪山的颜色。RAW文件本质上是一个连续的字节存储块,其中将字节型向量复制到一个整型向量中,我们就可对高度值进行比例变换从而突破0~255的限制,该方法的唯一限制是。我们对该类的构造函数还传入了与地形相关的设备指针、一个标识了存储高度图数据的文件的字符串,以及一个用于对高度图中各元素实施比例变换的。,所以,如果您要从一个256×256的RAW文件中读取数据,相应地您只能创建一个至多有256×256个顶点的地形。

2023-11-06 15:12:57 473

原创 设计一个灵活的Camera类设计

D3DXMatrixLookAtLH函数可计算出观察矩阵(取景变换矩阵),当在某一固定点固定摄像机方位时,该函数十分有用,但其用户接口对于一个能够根据用户输入做出响应移动的摄像机来说,就会力不从心。我们可以实现一个Camera类以使我们能够较D3DXMatrixLookAtLH函数对摄像机更好的控制,该类特别适合于飞行模拟器、第一人称视角游戏。:右向量、上向量、观察向量、位置向量通过这些向量来定义摄像机相对于世界坐标系的位置和朝向,前3个向量统称为方向向量,方向向量必须是。

2023-10-12 18:36:10 105

原创 Direct3D网格(二)

与纹理中多级渐进纹理类似,如果对一个小而远的图元应用高分辨率的纹理实在是一种浪费,因为观察者不可能注意到这些细节,一个小而远的网格也完全不用像大而近的网格一样使用大量面片,所以在满足要求的条件下,总是用尽量少的面片来表达一个网格,以节省宝贵的绘制时间。如果希望提高精度,可借助外接体快速排除那些显然不能被击中的物体,然后再对那些极有可能被击中的物体使用更精确的方法来检测。,重叠的顶点就会被剔除,如果没有提供邻接信息,则重叠顶点的法向量由该顶点所依附的各面在该点的局部法向量取平均而得到,重要的第一点是传入的。

2023-10-11 18:15:22 460

原创 Direct3D网格(一)

函数创建一个"空"网格对象 ,空网格对象是指我们指定了网格的面片总数和顶点总数,然后由该函数为顶点缓存、索引缓存和属性缓存分配大小合适的内存,之后即可手工填入网格数据。函数来创建空网格,在该函数中并未指定FVF,而是用一个D3DVERTEXELEMENT9类型的结构数组来描述顶点数据的布局方式。:网格将具有的面片总数,该值必须大于0。:网格将具有的顶点总数,该值必须大于0。:存储在该网格中的顶点的灵活顶点格式。:创建网格时所使用的创建标记,枚举。:所创建的网格对象的指针。,一些常用的标记如下。

2023-10-08 18:08:34 328

原创 Direct3D字体

D3DX库提供接口用于在Direct3D应用程序中绘制文本,该接口内部使用GDI(图形设备接口)来绘制文本,因此该接口在性能上略有损失,由于使用GDI所以才能够处理一些复杂的字体和格式。可以用函数来创建一个ID3DXFont的接口对象。一旦获取了ID3DXFont接口的指针,只需要调用方法即可轻而易举地完成文本的绘制。:指定字符串所属的ID3DXSprite对象接口,可设为默认值0或NULL,表示在当前窗口中绘制字符串:指向将要绘制的字符串的指针。

2023-09-27 16:11:40 270

原创 Direct3D模板缓存

模板缓存是一个用于获得某种特效的离屏缓存,模板缓存的分辨率与后台缓存和深度缓存的分辨率完全相同,所以像素也是一一对应的,模板缓存允许我们动态的,有针对性的决定是否将某个像素写入后台缓存中。例如实现镜面效果时,我们只需在在镜子所在平面中绘制某个特定物体的映像,但是如果想只在镜面所对应的子区域中显示物体的映像,这是就可用模板缓存来阻止物体映像在非镜面区域中的绘制,a中镜面和墙壁映像都会被绘制,b中阻止了非镜面区域的绘制。

2023-09-22 18:34:26 477

原创 Direct3D融合技术

该技术能使我们将当前要进行光栅化的像素的颜色与先前已已光栅化并处于同一位置的像素的颜色进行合成,即将正在处理的图元颜色值与存储在后台缓存中的像素颜色值进行合成(混合),利用该技术我们可得到各种各样的效果,尤其是透明效果。在融合运算时需要遵循:首先绘制那些不需要进行融合的物体,然后将需要进行融合的物体按照相对于摄像机的深度值进行排序,如果物体已处于观察坐标系中,该运算的效率会相当高,因为此时只需要对Z分量进行排序,最后按照自后往前的顺序逐个绘制将要进行融合运算的物体。

2023-09-21 18:30:06 311

原创 Direct3D纹理映射

借助纹理映射技术,我们可将图像数据映射到三角形单元中,这种功能可以显著地增加所绘制场景的细节和真实感,例如创建一个立方体然后为其每个面映射一个板条纹理,从而将该立方体变为一个板条箱,在Direct3D中纹理用接口来表示,纹理是类似于表面的一个像素矩阵,与表面不同的是它可被映射到三角形单元中。

2023-09-12 11:33:51 617

原创 Direct3D光照

材质用结构D3DMATERIAL9来表示。

2023-09-06 19:03:31 604

原创 Direct3D颜色

在Direct3D中颜色用RGB三元组来表示,RGB数据可用俩种不同的结构来保存,第一种是,它实际上与类型完全相同,共有32位,D3DCOLOR类型种的各位被分成四个8位项,每项存储了一种颜色分量的亮度值。由于每种颜色分量占一个字节,所以每个分量的亮度值范围在[0,255]区间内,接近0的值表示低亮度,接近255的值表示高亮度。可以使用和来为D3DCOLOR赋值,二者的区别是前者不接收Alpha参数,其实前者试讲Alpha分量设为0xff(255)。在Direct3D中存储颜色的另一种结构是。

2023-09-06 17:27:12 598

原创 Direct3D绘制旋转立方体例程

【代码】Direct3D绘制旋转立方体例程。

2023-09-05 21:02:42 1546

原创 Direct3D中的绘制

参数BaseVertexIndex值得一提,局部索引缓存的内容应与局部顶点缓存中的顶点一致,假定我们想将球、盒以及圆柱体的顶点合并到同一个全局缓存中,对于每个物体我们必须重新计算索引,确保这些索引能正确的指向全局顶点缓存中对应的顶点,新索引的计算方法是为每个索引增加一个指定了物体顶点在全局缓存中存储的起始位置的偏移量,偏移量用顶点个数来度量。另外,对显存和AGP存储区进行。,该标记十分有用,因为这允许在我们访问新分配的内存时,硬件能够继续使用被丢弃的缓存中的数据进行绘制,这样硬件的绘制就不会中止。

2022-10-28 18:21:45 402 1

原创 绘制流水线

绘制流水线

2022-10-12 14:52:40 383

原创 Direct3D的初始化

dx初始化

2022-09-16 13:57:37 496

原创 基本图形学概念

D3D相关基本概念

2022-09-15 17:12:53 332

原创 基础数学知识

d3d数学基础知识

2022-09-15 15:46:14 606

原创 3d测试环境搭建

dx环境

2022-09-07 19:53:49 263

原创 vs项目属性页相关含义与使用

修改命令启动调试如果断点设置在了某个程序的入口,不方便在程序完全启动后附加调试,则可以修改属性页中调试页签下的命令选项,将其修改成某个exe,则可以先打断点然后将该项目设置为启动项目,随后执行调试启动即可项目属性页当前所在目录像属性中常规页签下的输出目录、中间目录等路径,是以该项目的工程文件所在的路径作为当前目录后的相对路径,所谓工程文件也就是以该项目命名.vcxproj文件。vcxproj文件:项目工程文件,描述了工程的各项属性,修改该文件后再重新build时vs会重新b.

2022-04-19 11:50:19 1681

转载 拷贝构造函数的参数为什么是&类型(避免造成循环调用)

转载自:https://www.cnblogs.com/this-543273659/archive/2011/09/18/2180575.html1.人为的规定2.避免造成循环调用(循环调用拷贝构造函数)

2021-04-19 11:07:23 289

原创 严格弱排序

严格弱排序:如果x<y为true,那么!(y<x)为true,可以理解为俩个数据正序逆序传入比较函数中,得到的结果需要一致。如果需要给map自定义key,那么key要支持operator<,并且operator<是严格弱排序的,如果不是严格弱排序,结果是未定义的(可能死循环,可能值被覆盖,windows和linux各种编译器版本之间也不一致)struct SKey{ SKey(int a, int b, int c) :m_a(a), m_b(b), m_c(c)

2021-04-17 18:14:22 671

原创 字符串string中“\0“与‘\0‘的打印、拼接问题

1."\0"为字符串长度为0的字符串指针,它与""等价2.打印"\0"与'\0'相同,cout输出时都会显示为空'\0'在string的初始化和拼接中size大小的不同 string s1 = "aaa\0bbb"; cout << s1.size() << endl; //3 cout << s1 << endl; //aaa cout << s1[3] << endl; //结尾为\0打印空

2021-04-15 19:38:21 3152 1

原创 函数到指针的隐式转换,非静态成员函数的特殊

转载自:https://www.cnblogs.com/Esfog/archive/2012/04/23/2467249.html函数在内存中的分配 首先说一下C/C++在创建一个变量的时候比如int a,相应的在内存就会分配一个4个字节(根据不同机器可能不同)空间来存放这个int变量,而假设这4个字节的起始地址是0XFF0A,那么实际上就存在一种变量名和内存地址的映射,即a可以看做是一个标示符,他只是代表着0XFF0A这个地址,在程序中你对a进行的操作实际上也就是对内存中以0XFF0A...

2021-02-08 11:51:33 588

原创 常量引用、非常量引用、临时对象

转载自:https://www.cnblogs.com/littleant/archive/2012/08/01/2618846.htmlhttps://www.cnblogs.com/BensonLaur/p/5234555.html产生临时对象的情况1.按值进行函数参数传递时2.函数返回对象时3.发生类型转化时,例如为了使函数成功调用而进行隐式类型转换C++中产生的临时对象是不可修改的,及默认为const的,非const引用只能绑定到与该引用同类型的对象,而const引用则可以绑定到不同

2021-02-02 18:25:02 1602 1

转载 C/C++定义全局变量/常量的几种方法的区别

转载自:https://www.cnblogs.com/catkins/p/5270388.html摘要:1.全局变量不要定义在头文件,只能声明在头文件,定义一定要在源文件中2.如果想使用其他文件中的全局变量,最稳妥的方法,就是在common.h中声明,在common.cpp中定义,其他文件include "common.h"来使用全局变量3.static、const修饰的全局变量的作用域只能是本身的编译单元,所以只想在本文件中全局变量,就在源文件中使用const或static来修饰4.全局域

2021-02-01 14:22:35 789 1

原创 float、double怎么判断是否为0

float,double分别遵循R32-24,R64-53的标准。所以float的精度误差在1e-6;double精度误差在1e-15判断float:则是 if(abs(f) <= 1e-6);判断double:则是if(abs(f) <= 1e-15);小于,为0,大于,不为0 。...

2020-12-11 18:55:33 5727

转载 Lua调用原理(Lua虚拟栈)

转载自:https://blog.csdn.net/zhuzhuyule/article/details/41086745一、Lua虚拟机的栈1.1先简单介绍下Lua虚拟机的栈,如图:规则:①若Lua虚拟机堆栈里有N个元素,则可以用 1 ~ N 从栈底向上索引,也可以用 -1 ~ -N 从栈顶向下索引,一般后者更加常用②堆栈的每个元素可以为任意复杂的Lua数据类型,堆栈中没有元素的空位,隐含为包含一个“空”类型数据特性:若有4个元素分别入栈,则:①. 正数索引,栈底是1,然

2020-12-09 11:58:57 1779

原创 移动

转载自:《C++primer》重新分配内存时,使用移动而不是拷贝元素编写reallocate成员函数之前,先思考下此函数需要做什么,该函数可以理解为vector<string>类型成员在当前容量使用光之后进行扩展存储的过程。为一个新的、更大的string数组分配内存 在内存空间的前一部分构造对象,保存现有元素 销毁原内存空间中的元素,并释放这块内存可以看出为一个StrVec重新分配内存空间会引起从旧内存空间到新内存空间逐个拷贝string,当拷贝一个string时,新strin

2020-12-01 22:20:30 507 1

原创 new与allocator

new与allocator类new和delete运算符一次分配/释放一个对象,但某些应用需要一次为很多对象分配内存的功能,例如vector、string都是在连续内存中保存它们的元素,因此当容器需要重新分配内存时,必须一次性为很多元素分配内存,为了支持这种需求C++语言和标准库提供了俩种一次分配一个对象数组的方法。C++语言:new表达式(分配并初始化一个对象数组)标准库:包含一个名为allocator的类(允许我们将分配和初始化分离,使用allocator通常会提供更好的性能和更灵活的内存管理能

2020-12-01 16:57:20 521

原创 右值引用、move函数

右值引用为了支持移动操作,新标准引入了一种新的引用类型----右值引用(rvalue reference),所谓右值引用就是必须绑定到右值的引用。我们通过&&而不是&来获得右值引用,右值引用有一个重要的性质----只能绑定到一个将要销毁的对象。因此,我们可以自由地将一个右值引用的资源“移动”到另一个对象中。一般而言,一个左值表达式表示的是一个对象的身份,而一个右值表达式表示的是对象的值,类似任何引用,右值引用也是某个对象的另一个名字,对于常规引用(左值引用),不能将其绑定到要

2020-11-30 21:56:14 617

原创 可调用对象与function类模板(定义同一调用形式的可调用对象)

C++中的几种可调用对象1.函数2.函数指针3.lambda表达式4.bind创建的对象5.重载了函数调用运算符()的类和其他对象一样,可调用的对象也有类型,每个lambda有它自己唯一的(未命名)类类型,函数及函数指针的类型则由其返回值类型和实参类型决定,然而俩个不同的类型的可调用对象却可能共享同一种调用形式,调用形式指明了返回的类型以及传递给调用的实参类型。不同类型可能具有相同的调用形式,对于几个可调用对象共享同一个调用形式的情况,有时我们会希望把它们看成具有相同的类型。上面这些

2020-11-28 21:06:33 318

原创 参数绑定bind、bind1st、bind2nd以及ptr_fun、mem_fun、mem_fun_ref的使用

对于那种只在一俩个地方使用的简单操作,lambda表达式是最有用的,如果我们需要在很多地方使用相同的操作,通常应该定义一个函数,而不是多次编写相同的lambda表达式,如果一个操作需要很多语句才能完成,通常使用函数更好。标准库bind函数使用场景将函数转换为泛型算法适用的参数:例如用在find_if调用中的lambda比较一个string和一个给定大小,我们可以很容易地编写一个完成同样工作的函数bool check_size(const string& s, string::size

2020-11-28 19:46:37 939

原创 lambda表达式

一个lambda表达式表示一个可调用的代码单元,我们可以将其理解为一个未命名的内联函数,与任何函数类似,一个lambda具有一个返回类型、一个参数列表和一个函数体,但与函数不同,lambda可能定义在函数内部,而且lambda必须使用尾置返回。lambda表达式形式:[capture list] (parameter list) opt-> return type {function body}1. capture list:捕获列表,是一个lambda所在函数中定义的局部变量的列表(通常

2020-11-27 15:35:28 262 1

原创 智能指针的内部实现、循环引用(weak_ptr解决)

转载自:https://blog.csdn.net/i_chaoren/article/details/82586456https://www.jianshu.com/p/11389ccbcf79https://blog.csdn.net/daniel_ustc/article/details/23096229智能指针的内部实现智能指针最终的实现是 两个指针成员:一个指向数据成员,一个指向计数器成员 智能指针里的计数器 维护的是一个指针,指向的 实际内存 在堆上,不是栈上的智能指针拷贝构造的原理

2020-11-25 18:04:45 625

转载 explicit的用法

转载自:https://blog.csdn.net/qq_35524916/article/details/58178072C++提供了关键字explicit,可以阻止不应该允许的经过转换构造函数进行的隐式转换的发生,声明为explicit的构造函数不能在隐式转换中使用,简言之就是防止隐式转换的。C++中,一个参数的构造函数(或者除了第一个参数外其余参数都有默认值的多参构造函数)承担俩个角色:1.是个构造2.默认隐含的类型转换操作符所以, 有时候在我们写下如 AAA = XXX, 这样的代码,

2020-11-24 21:48:49 783

转载 C++STL的容器的底层实现详解

转载自:https://blog.csdn.net/qq_43313035/article/details/89600276文章目录顺序容器 vector(向量容器) deque(双端队列) list 关联容器 set(集合) multiset map(key,value) multimap 顺序容器vector(向量容器)特点 内存可2倍增长的动态数组 数据结构:线性连续空间 维护三个迭代器:start、finish、end_of_st.

2020-11-23 19:26:01 197

转载 STL容器在遍历时迭代器失效问题

转载自:https://blog.csdn.net/hechao3225/article/details/55101344其他文章:https://www.cnblogs.com/qiaoconglovelife/p/5370396.htmlSTL容器根据迭代器的失效问题,其实可以分为两类容器:(1)数组型容器的插入删除操作:vector、string、deque(均为顺序存储) 由于这类容器的插入或删除都会使所有迭代器失效,因此每次插入删除后都需要重新定位(2)结点型数据容器...

2020-11-23 18:41:22 247

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除