DirectX9:基础篇 第六章 颜色
一.D3DXCOLOR(颜色结构体)
//全局颜色常量
namespace d3d{
...
const D3DXCOLOR WHITE(D3DCOLOR_XRGB(255,255,255));
const D3DXCOLOR BLACK(D3DCOLOR_XRGB(0,0,0));
const D3DXCOLOR RED(D3DCOLOR_XRGB(255,0,0));
const D3DXCOLOR GREEN(D3DCOLOR_XRGB(0,255,0));
const D3DXCOLOR BLUE(D3DCOLOR_XRGB(0,0,255));
const D3DXCOLOR YELLOW(D3DCOLOR_XRGB(255,255,0));
const D3DXCOLOR CYAN(D3DCOLOR_XRGB(0,255,255));
const D3DXCOLOR MAGENTA(D3DXCOLOR_XRGB(255,0,255));
}
1 2 | D3DCOLOR color=D3DCOLOR_ARGB(255,255,0); D3DCOLOR_XRGB(); |
二.D3DCOLORVALUE(颜色类)
D3DCOLORVALUE相比D3DXCOLOR,不仅拥有相同的数据成员,还提供了一组有用的构造函数和重载运算符,为颜色的运算提供了便利.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | typedef struct D3DXCOLOR{ #ifdef __cplusplus public : D3DXCOLOR(){} D3DXCOLOR( DWORD argb); D3DXCOLOR(CONST FLOAT * ); D3DXCOLOR(CONST D3DXFLOAT16* ); D3DXCOLOR(CONST D3DXCOLORVALUE& ); D3DXCOLOR( FLOAT r, FLOAT g, FLOAT b, FLOAT a); //casting operator DWORD () const ; operator FLOAT * (); operator CONST FLOAT * () const ; operator D3DCOLORVALUE* (); operator CONST D3DCOLORVALUE* () const ; operator D3DCOLORVALUE& (); operator CONST D3DCOLORVALUE& () const ; D3DXCOLOR& operator += (CONST D3DXCOLOR& ); D3DXCOLOR& operator -= (CONST D3DXCOLOR& ); D3DXCOLOR& operator *= ( FLOAT ); D3DXCOLOR& operator /= ( FLOAT ); D3DXCOLOR operator + () const ; D3DXCOLOR operator - () const ; D3DXCOLOR operator + (CONST D3DXCOLOR& ) const ; D3DXCOLOR operator - (CONST D3DXCOLOR& ) const ; D3DXCOLOR operator * ( FLOAT ) const ; D3DXCOLOR operator / ( FLOAT ) const ; friend D3DXCOLOR operator * ( FLOAT ,CONST D3DXCOLOR& ); BOOL operator == (CONST D3DXCOLOR& ) const ; BOOL operator != (CONST D3DXCOLOR& ) const ; #endif //__cplusplus FLOAT r,g,b,a; }D3DXCOLOR,*LPD3DXCOLOR; |
三.像素格式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 | typedef enum _D3DFORMAT { D3DFMT_UNKNOWN = 0, D3DFMT_R8G8B8 = 20, D3DFMT_A8R8G8B8 = 21, D3DFMT_X8R8G8B8 = 22, D3DFMT_R5G6B5 = 23, D3DFMT_X1R5G5B5 = 24, D3DFMT_A1R5G5B5 = 25, D3DFMT_A4R4G4B4 = 26, D3DFMT_R3G3B2 = 27, D3DFMT_A8 = 28, D3DFMT_A8R3G3B2 = 29, D3DFMT_X4R4G4B4 = 30, D3DFMT_A2B10G10R10 = 31, D3DFMT_A8B8G8R8 = 32, D3DFMT_X8B8G8R8 = 33, D3DFMT_G16R16 = 34, D3DFMT_A2R10G10B10 = 35, D3DFMT_A16B16G16R16 = 36, D3DFMT_A8P8 = 40, D3DFMT_P8 = 41, D3DFMT_L8 = 50, D3DFMT_A8L8 = 51, D3DFMT_A4L4 = 52, D3DFMT_V8U8 = 60, D3DFMT_L6V5U5 = 61, D3DFMT_X8L8V8U8 = 62, D3DFMT_Q8W8V8U8 = 63, D3DFMT_V16U16 = 64, D3DFMT_A2W10V10U10 = 67, D3DFMT_UYVY = MAKEFOURCC( 'U' , 'Y' , 'V' , 'Y' ), D3DFMT_R8G8_B8G8 = MAKEFOURCC( 'R' , 'G' , 'B' , 'G' ), D3DFMT_YUY2 = MAKEFOURCC( 'Y' , 'U' , 'Y' , '2' ), D3DFMT_G8R8_G8B8 = MAKEFOURCC( 'G' , 'R' , 'G' , 'B' ), D3DFMT_DXT1 = MAKEFOURCC( 'D' , 'X' , 'T' , '1' ), D3DFMT_DXT2 = MAKEFOURCC( 'D' , 'X' , 'T' , '2' ), D3DFMT_DXT3 = MAKEFOURCC( 'D' , 'X' , 'T' , '3' ), D3DFMT_DXT4 = MAKEFOURCC( 'D' , 'X' , 'T' , '4' ), D3DFMT_DXT5 = MAKEFOURCC( 'D' , 'X' , 'T' , '5' ), D3DFMT_D16_LOCKABLE = 70, D3DFMT_D32 = 71, D3DFMT_D15S1 = 73, D3DFMT_D24S8 = 75, D3DFMT_D24X8 = 77, D3DFMT_D24X4S4 = 79, D3DFMT_D16 = 80, D3DFMT_D32F_LOCKABLE = 82, D3DFMT_D24FS8 = 83, D3DFMT_L16 = 81, D3DFMT_VERTEXDATA =100, D3DFMT_INDEX16 =101, D3DFMT_INDEX32 =102, D3DFMT_Q16W16V16U16 =110, D3DFMT_MULTI2_ARGB8 = MAKEFOURCC( 'M' , 'E' , 'T' , '1' ), // Floating point surface formats // s10e5 formats (16-bits per channel) D3DFMT_R16F = 111, D3DFMT_G16R16F = 112, D3DFMT_A16B16G16R16F = 113, // IEEE s23e8 formats (32-bits per channel) D3DFMT_R32F = 114, D3DFMT_G32R32F = 115, D3DFMT_A32B32G32R32F = 116, D3DFMT_CxV8U8 = 117, D3DFMT_FORCE_DWORD =0x7fffffff } D3DFORMAT; |
四.着色处理
着色处理发生在光栅化和指定图元上的顶点颜色计算成像素颜色
1.平面着色(flat shading)
平面着色的像素颜色是均匀的,就是指定图元第一个顶点的颜色,这样第二个和第三个顶点也都是相同的颜色
1 | Device->SetRenderState(D3DRS_SHADEMODE, D3DSHADE_FLAT); |
2.高洛德着色(Gouraud shading)
高洛德着色也成为平滑着色,指定是图元表面的颜色是由每个顶点通过线性插值来赋予的
1 | Device->SetRenderState(D3DRS_SHADEMODE, D3DSHADE_GOURAUD); |
五.例子
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 | #include "d3dUtility.h" IDirect3DDevice9* Device = 0; const int Width = 640; const int Height = 480; D3DXMATRIX WorldMatrix; IDirect3DVertexBuffer9* Triangle = 0; struct ColorVertex { ColorVertex(){} ColorVertex( float x, float y, float z, D3DCOLOR c) { _x = x; _y = y; _z = z; _color = c; } float _x, _y, _z; D3DCOLOR _color; static const DWORD FVF; }; const DWORD ColorVertex::FVF = D3DFVF_XYZ | D3DFVF_DIFFUSE; bool Setup() { // // 只有一个三角形顶点缓存 // Device->CreateVertexBuffer( 3 * sizeof (ColorVertex), D3DUSAGE_WRITEONLY, ColorVertex::FVF, D3DPOOL_MANAGED, &Triangle, 0); ColorVertex* v; Triangle->Lock(0, 0, ( void **)&v, 0); v[0] = ColorVertex(-1.0f, 0.0f, 2.0f, D3DCOLOR_XRGB(255, 0, 0)); v[1] = ColorVertex( 0.0f, 1.0f, 2.0f, D3DCOLOR_XRGB( 0, 255, 0)); v[2] = ColorVertex( 1.0f, 0.0f, 2.0f, D3DCOLOR_XRGB( 0, 0, 255)); Triangle->Unlock(); D3DXMATRIX proj; D3DXMatrixPerspectiveFovLH( &proj, D3DX_PI * 0.5f, // 90 - degree ( float )Width / ( float )Height, 1.0f, 1000.0f); Device->SetTransform(D3DTS_PROJECTION, &proj); // // 关闭灯光 // Device->SetRenderState(D3DRS_LIGHTING, false ); return true ; } void Cleanup() { d3d::Release<IDirect3DVertexBuffer9*>(Triangle); } bool Display( float timeDelta) { if ( Device ) { Device->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0xffffffff, 1.0f, 0); Device->BeginScene(); Device->SetFVF(ColorVertex::FVF); Device->SetStreamSource(0, Triangle, 0, sizeof (ColorVertex)); // // 画第一个三角形 // D3DXMatrixTranslation(&WorldMatrix, -1.25f, 0.0f, 0.0f); Device->SetTransform(D3DTS_WORLD, &WorldMatrix); // 平面着色 Device->SetRenderState(D3DRS_SHADEMODE, D3DSHADE_FLAT); Device->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1); // // 画第二个三角形 // D3DXMatrixTranslation(&WorldMatrix, 1.25f, 0.0f, 0.0f); Device->SetTransform(D3DTS_WORLD, &WorldMatrix); // 高洛德着色 Device->SetRenderState(D3DRS_SHADEMODE, D3DSHADE_GOURAUD); Device->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1); Device->EndScene(); Device->Present(0, 0, 0, 0); } return true ; } // // WndProc // LRESULT CALLBACK d3d::WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch ( msg ) { case WM_DESTROY: ::PostQuitMessage(0); break ; case WM_KEYDOWN: if ( wParam == VK_ESCAPE ) ::DestroyWindow(hwnd); break ; } return ::DefWindowProc(hwnd, msg, wParam, lParam); } // // WinMain // int WINAPI WinMain( HINSTANCE hinstance, HINSTANCE prevInstance, PSTR cmdLine, int showCmd) { if (!d3d::InitD3D(hinstance, Width, Height, true , D3DDEVTYPE_HAL, &Device)) { ::MessageBox(0, "InitD3D() - FAILED" , 0, 0); return 0; } if (!Setup()) { ::MessageBox(0, "Setup() - FAILED" , 0, 0); return 0; } d3d::EnterMsgLoop( Display ); Cleanup(); Device->Release(); return 0; } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)