DirectX笔记.docx
《DirectX笔记.docx》由会员分享,可在线阅读,更多相关《DirectX笔记.docx(10页珍藏版)》请在冰豆网上搜索。
![DirectX笔记.docx](https://file1.bdocx.com/fileroot1/2022-11/23/2a456b8f-4559-4718-ab53-0d331f73e633/2a456b8f-4559-4718-ab53-0d331f73e6331.gif)
DirectX笔记
纹理模式
重叠纹理寻址模式
使用重叠纹理寻址模式时,Direct3D会在每个整数纹理坐标连接处自动重复纹理。
下列示例代码设置纹理层0的u,v方向寻址模式为重叠纹理寻址。
g_device->SetSamplerState(0,D3DSAMP_ADDRESSU,D3DTADDRESS_WRAP);
g_device->SetSamplerState(0,D3DSAMP_ADDRESSV,D3DTADDRESS_WRAP);
重叠纹理寻址是Direct3D中缺省的寻址模式,也是三维系统中最常用的寻址模式之一。
镜像纹理寻址模式
使用镜像纹理寻址模式时,Direct3D会在每个整数纹理坐标连接处自动复制并翻转纹理。
下面的示例代码设置纹理层0的u、v方向寻址模式为镜像纹理寻址模式:
g_device->SetSamplerState(0,D3DSAMP_ADDRESSU,D3DTADDRESS_MIRROR);
g_device->SetSamplerState(0,D3DSAMP_ADDRESSV,D3DTADDRESS_MIRROR);
夹取纹理寻址模式
夹取纹理寻址模式将纹理坐标夹取在[0.0,1.0]范围之内。
也就是说,它将纹理复制一遍,然后将纹理边缘像素的颜色延伸。
下面的示例代码设置纹理层0的u、v方向寻址模式为夹取纹理寻址模式:
g_device->SetSamplerState(0,D3DSAMP_ADDRESSU,D3DTADDRESS_CLAMP);
g_device->SetSamplerState(0,D3DSAMP_ADDRESSV,D3DTADDRESS_CLAMP);
边框颜色纹理寻址模式
边框颜色纹理寻址模式用枚举类型D3DTEXTUREADDRESS的成员D3DTADDRESS_BORDER指定,当纹理坐标超出[0.0,1.0]范围时,Direct3D使用边框颜色代替纹理颜色。
下面的示例代码指定边框颜色为红色,并设置纹理层0的u、v方向寻址模式为边框颜色纹理寻址模式。
g_device->SetSamplerState(0,D3DSAMP_BORDERCOLOR,0xFFFF0000);
g_device->SetSamplerState(0,D3DSAMP_ADDRESSU,D3DTADDRESS_BORDER);
g_device->SetSamplerState(0,D3DSAMP_ADDRESSV,D3DTADDRESS_BORDER);
纹理过滤:
通过给定的uv坐标从纹理贴图中获得图素的一种方法。
为了抗锯齿,D3D中采用了3种技术来实现纹理过滤,它们分别是最近点采样,线性纹理过滤,各向异性(anisotropic)纹理过滤。
而现在游戏中看到的图像高级选项中,一般都有点采样、双线过滤(即D3D的线性纹理过滤),三线过滤(即D3D中的线性过滤加上mipmap),以及各向异性过滤。
点采样设置方式:
将纹理坐标对齐到最接近的整数,再将那个位于整数坐标上的纹理像素作为最终的颜色。
缺点:
容易在图像边界上造成错误;优点:
快。
g_device->SetSamplerState(0,D3DSAMP_MAGFILTER,D3DTEXF_POINT);
g_device->SetSamplerState(0,D3DSAMP_MINFILTER,D3DTEXF_POINT);
g_device->SetSamplerState(0,D3DSAMP_MIPFILTER,D3DTEXF_POINT);
g_device->SetSamplerState(0,D3DSAMP_MAXMIPLEVEL,16);
或者 g_device->SetSamplerState(0,D3DSAMP_MIPFILTER, D3DTEXF_NONE);
双线纹理过滤(即D3D的线性纹理过滤):
计算相对于采样点最近的4个图素(上下左右4个点)的平均值。
缺点:
有各项异性失真可能。
g_device->SetSamplerState(0,D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
g_device->SetSamplerState(0,D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
g_device->SetSamplerState(0,D3DSAMP_MIPFILTER, D3DTEXF_POINT);
g_device->SetSamplerState(0,D3DSAMP_MAXMIPLEVEL,16);
三线过滤(即D3D中的线性过滤加上mipmap(mipmap就是指多级渐进形纹理))
对于每个像素,三线过滤会先选择两张最接近的mipmap,将它们双线过滤为两张理想大小的mipmap,然后根据理想的mip级组合这两张过滤后的mipmap中的对应像素。
缺点:
有各项异性失真可能。
mipmap:
由一系列纹理组成,其中每张纹理的高宽都是前一级高宽的一半。
D3D在渲染时会自动挑选出一个图素与像素的比值最接近于1的mip层级。
g_device->SetSamplerState(0,D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
g_device->SetSamplerState(0,D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
g_device->SetSamplerState(0,D3DSAMP_MIPFILTER, D3DTEXF_LINEAR);
g_device->SetSamplerState(0,D3DSAMP_MAXMIPLEVEL,16);
各向异性过滤:
根据屏幕像素的伸张度来测量各项异性,再将屏幕像素反向映射到纹理空间中。
效果:
在非水平的渲染时要比三线过滤更加锐化。
g_device->SetSamplerState(0,D3DSAMP_MAGFILTER,D3DTEXF_ANISOTROPIC);
g_device->SetSamplerState(0,D3DSAMP_MINFILTER,D3DTEXF_ANISOTROPIC);
g_device->SetSamplerState(0,D3DSAMP_MAXANISOTROPY,4);
设置多级渐进纹理过滤方式:
g_device->SetSamplerState(0,D3DSAMP_MIPFILTER,D3DTEXF_LINEAR);
第一个参数设为纹理层序号;第二个参数设为D3DSAMP_MIPFILTER表示多级渐进纹理过滤;第三个参数设为在相邻纹理级之间的过滤方式:
如果将第三个参数设为D3DTEXF_NONE,那么就会一直使用最高一级的纹理,即禁用多级渐进纹理过滤;如果将其设为D3DTEXF_POINT,就会只使用与图元大小最匹配的一级纹理;如果将其设为D3DTEXF_LINEAR,Direct3D就将与图元大小最匹配的两级纹理以线性方式混合。
设置实际渲染时纹理过滤的最大级数:
g_device->SetSamplerState(0,D3DSAMP_MAXMIPLEVEL,16);
第二个参数设为D3DSAMP_MAXMIPLEVEL,第三个参数设为实际渲染时纹理过滤的最大级数。
键盘控制
附:
VK_LBUTTON 鼠标左键 0x01
VK_RBUTTON 鼠标右键 0x02
VK_CANCEL Ctrl+Break 0x03
VK_MBUTTON 鼠标中键 0x04
VK_BACK Backspace键 0x08
VK_TAB Tab键 0x09
VK_RETURN 回车键 0x0D
VK_SHIFT Shift键 0x10
VK_CONTROL Ctrl键 0x11
VK_MENU Alt键 0x12
VK_PAUSE Pause键 0x13
VK_CAPITAL CapsLock键 0x14
VK_ESCAPE Esc键 0x1B
VK_SPACE 空格键 0x20
VK_PRIOR PageUp键 0x21
VK_NEXT PageDown键 0x22
VK_END End键 0x23
VK_HOME Home键 0x24
VK_LEFT 左箭头键 0x25
VK_UP 上箭头键 0x26
VK_RIGHT 右箭头键 0x27
VK_DOWN 下箭头键 0x28
VK_SNAPSHOT PrintScreen键 0x2C
VK_Insert Insert键 0x2D
VK_Delete Delete键 0x2E
'0'–'9' 数字0-9 0x30-0x39
'A'–'Z' 字母A-Z 0x41-0x5A
VK_LWIN 左WinKey(104键盘才有) 0x5B
VK_RWIN 右WinKey(104键盘才有) 0x5C
VK_APPS AppsKey(104键盘才有) 0x5D
VK_NUMPAD(0-9) 小键盘0-9键 0x60-0x69
VK_F1-VK_F24 功能键F1–F24 0x70-0x87
VK_NUMLOCK NumLock键 0x90
VK_SCROLL ScrollLock键 0x91
颜色设置
函数:
D3DColorARGB
说明:
返回一个ARGB格式的Long类型颜色值
用法:
Se=D3DColorARGB(a,r,g,b)
参数:
aAsInteger a通道,即alpha通道,指定了颜色的透明度。
0最大,255最小
rAsInteger 红色分量,0到255
gAsInteger 绿色分量,0到255
bAsInteger 蓝色分量,0到255
函数:
D3DColorMake
说明:
返回一个ARGB格式的Long类型颜色值
用法:
Se=D3DColorMake(r,g,b,a)
参数:
rAsSingle 红色分量,用百分比表示的值,-1到1
gAsSingle 绿色分量,用百分比表示的值,-1到1
bAsSingle 蓝色分量,用百分比表示的值,-1到1
aAsSingle a通道,用百分比表示的值,-1到1
注意:
D3DColorMake与D3DColorARGB参数的前后位置、参数类型是不同的。
函数:
D3DColorRGBA
说明:
返回一个ARGB格式的Long类型颜色值
用法:
Se=D3DColorRGBA(r,g,b,a)
参数:
rAsInteger 红色分量,用百分比表示的值,0到255
gAsInteger 绿色分量,用百分比表示的值,0到255
bAsInteger 蓝色分量,用百分比表示的值,0到255
aAsInteger a通道,用百分比表示的值,0到255
函数:
D3DColorXRGB
说明:
返回一个xRGB格式的Long类型颜色值(负值),没有a通道
用法:
Se=D3DColorXRGB(r,g,b)
参数:
rAsInteger 红色分量,用百分比表示的值,0到255
gAsInteger 绿色分量,用百分比表示的值,0到255
bAsInteger 蓝色分量,用百分比表示的值,0到255
说明:
D3DColorXRGB(r,g,b)等同于RGB(b,g,r)-&HFFFFFF-1
D3D的颜色有两种表示法:
一、D3DColorValue结构表示法
DimSeD3DAsD3DColorValue
SeD3D有以下4个元素:
SeD3D.RAsSingle 红色分量,用百分比表示的值,-1到1
SeD3D.GAsSingle 绿色分量,用百分比表示的值,-1到1
SeD3D.BAsSingle 蓝色分量,用百分比表示的值,-1到1
SeD3D.AAsSingle 透明度,用百分比表示的值,-1到1
D3D许多对象的属性都是这种表示法,如ambient、diffuse
二、另一种是ARGB格式的Long类型表示法,这与VB表示法类似。
VB颜色型如:
&H010203,等同于函数RGB(3,2,1)的返回值,其中:
1-2位(01)表示b通道
3-4位(02)表示g通道
5-6位(03)表示r通道
ARGB颜色型如:
&H01020304,其中:
1-2位(01)表示a通道
3-4位(02)表示r通道
5-6位(03)表示g通道
7-8位(04)表示b通道
因此,下面几个语句的效果完全一样,Long值都是270544960:
DimAAsLong,RAsLong,GAsLong,BAsLong
A=&H10:
R=&H20:
G=&H30:
B=&H40
s0=&H10203040'270544960
s1=D3DColorARGB(A,R,G,B)
s2=D3DColorMake(R/255,G/255,B/255,A/255)
s3=D3DColorRGBA(R,G,B,A)
窗口类结构体WNDCLASSEX介绍:
一、结构体原型:
typedefstruct
{
UINTcbSize;
UINTstyle;
WNDPROClpfnWndProc;
intcbClsExtra;
intcbWndExtra;
HINSTANCEhInstance;
HICONhIcon;
HCURSORhCursor;
HBRUSHhbrBackground;
LPCTSTRlpszMenuName;
LPCTSTRlpszClassName;
HICONhIconSm;
}WNDCLASSEX,*PWNDCLASSEX;
二、成员介绍
1.cbSizeWNDCLASSEX的大小。
在调用GetClassInfoEx前必须要先设置它值。
我们可以用sizeof(WNDCLASSEX)来获得准确的值。
2.style窗口类的样式,它的值可以是窗口样式值的任意组合。
可以有以下的值:
Constant/value
Description
CS_BYTEALIGNCLIENT0x1000
Alignsthewindow'sclientareaonabyteboundary(inthexdirection).Thisstyleaffectsthewidthofthewindowanditshorizontalplacementonthedisplay.
CS_BYTEALIGNWINDOW0x2000
Alignsthewindowonabyteboundary(inthexdirection).Thisstyleaffectsthewidthofthewindowanditshorizontalplacementonthedisplay.
CS_CLASSDC0x0040
Allocatesonedevicecontexttobesharedbyallwindowsintheclass.Becausewindowclassesareprocessspecific,itispossibleformultiplethreadsofanapplicationtocreateawindowofthesameclass.Itisalsopossibleforthethreadstoattempttousethedevicecontextsimultaneously.Whenthishappens,thesystemallowsonlyonethreadtosuccessfullyfinishitsdrawingoperation.
CS_DBLCLKS0x0008
Sendsadouble-clickmessagetothewindowprocedurewhentheuserdouble-clicksthemousewhilethecursoriswithinawindowbelongingtotheclass.
CS_DROPSHADOW0x00020000
Enablesthedropshadoweffectonawindow.TheeffectisturnedonandoffthroughSPI_SETDROPSHADOW.Typically,thisisenabledforsmall,short-livedwindowssuchasmenustoemphasizetheirZorderrelationshiptootherwindows.
CS_GLOBALCLASS0x4000
Indicatesthatthewindowclassisanapplicationglobalclass.Formoreinformation,seethe"ApplicationGlobalClasses"sectionofAboutWindowClasses.
CS_HREDRAW0x0002
Redrawstheentirewindowifamovementorsizeadjustmentchangesthewidthoftheclientarea.
CS_NOCLOSE0x0200
DisablesCloseonthewindowmenu.
CS_OWNDC0x0020
Allocatesauniquedevicecontextforeachwindowintheclass.
CS_PARENTDC0x0080
Setstheclippingrectangleofthechildwindowtothatoftheparentwindowsothatthechildcandrawontheparent.AwindowwiththeCS_PARENTDCstylebitreceivesaregulardevicecontextfromthesystem'scacheofdevicecontexts.Itdoesnotgivethechildtheparent'sdevicecontextordevicecontextsettings.SpecifyingCS_PARENTDCenhancesanapplication'sperformance.
CS_SAVEBITS0x0800
Saves,asabitmap,theportionofthescreenimageobscuredbyawindowofthisclass.Whenthewindowisremoved,thesystemusesthesavedbitmaptorestorethescreenimage,includingotherwindowsthatwereobscured.Therefore,thesystemdoesnotsendWM_PAINTmessagestowindowsthatwereobscuredifthememoryusedbythebitmaphasnotbeendiscardedandifotherscreenactionshavenotinvalidatedthestoredimage.
Thisstyleisusefulforsmallwindows(forexample,menusordialogboxes)thataredisplayedbrieflyandthenremovedbeforeotherscreenactivitytakesplace.Thisstyleincreasesthetimerequiredtodisplaythewindow,becausethesystemmustfirstallocatememorytostorethebitmap.
CS_VREDRAW0x0001
Redrawstheentirewindowifamovementorsizeadjustmentchangestheheightoftheclient