
DirectX
文章平均质量分 52
yaoxinchao
这个作者很懒,什么都没留下…
展开
-
使用位图
前言:载入位图:使用位图:使用8位位图:载入16位位图:载入24位位图:位图总结:原创 2012-07-20 16:36:14 · 572 阅读 · 0 评论 -
如何学好游戏3D引擎编程
《如何学好游戏3D引擎编程》此篇文章献给那些为了游戏编程不怕困难的热血青年,它的神秘要我永远不间断的去挑战自我,超越自我,这样才能攀登到游戏技术的最高峰——阿哲VS自己 QQ79134054多希望大家一起交流与沟通这篇文章是我一年半前,找工作时候写的,那时是发到学校的BBS上。现在我工作了,想法和以前也有不同,但对游戏引擎编程理念还是基本差不多。在我没遇到U3以前,一直研究WI转载 2012-07-17 22:01:06 · 5681 阅读 · 1 评论 -
使用6位高彩模式
16位高彩模式:Alpha.5.5.5---------用D15位存储一个Alpha分量(透明度),其余15位均匀分配给红色、绿色、蓝色。每种色彩产生的变化数位2^5,每个调色板有32*32*32 = 32768种色彩。X.5.5.5-----这种模式同Alpha.5.5.5类似,只是没有用到MSB(最高位),共32768种色彩。5.6.5---------这是16位色彩最常用的模式。原创 2012-07-17 17:37:20 · 3200 阅读 · 0 评论 -
双缓冲页面和后备缓冲页面比较
双缓冲页面创建在Game_Init()中,与主表面无直接联系,双缓冲页面只是充当一个画板然后拷贝显示到主表面,后备缓冲与主表面同时创建,具有相同的尺寸,双缓冲页面显示到主表面是通过内存复制,而后备缓冲显示到主表面一般采用页面切换(这其中有硬件加速).... ................................原创 2012-07-18 10:36:06 · 3284 阅读 · 0 评论 -
创建一个16位全屏DirectDraw模式采取的步骤
LPDIRECTDRAW7 lpdd = NULL; // dd objectLPDIRECTDRAWSURFACE7 lpddsprimary = NULL; // dd primary surfaceDDSURFACEDESC2 ddsd; // a direct draw surface des原创 2012-07-17 20:54:07 · 2132 阅读 · 0 评论 -
24位真彩和32位真彩
24位真彩模式,每通道宽为一个字节,共计三个通道,也就是说每像素占3字节。inline void Plot_Pixel_24(int x, int y, int red, int green, int blue, UCHAR *video_buffer, int lpitch){原创 2012-07-17 21:18:27 · 7904 阅读 · 1 评论 -
一个不完整的总结性程序
int Game_Init(void *parms = NULL, int num_parms = 0){// this is called once after the initial window is created and// before the main event loop is entered, do all your initialization// here原创 2012-07-17 16:06:05 · 612 阅读 · 0 评论 -
如何锁住内存表面(获取对表面的控制权)
访问任何显示表面--------主显示表面、从显示表面 、etc,------必须对内存进行加锁和解锁,原因是:首先,告诉DirectDraw你已经控制内存了(就是说该内存不能被其他进程访问到) 其次,要指示显示设备当你在操作锁住的内存时,它不能够移动任何cache和虚拟内存缓冲区。 加锁函数:HRESULT Lock( LPRECT lpDest原创 2012-07-17 15:49:55 · 591 阅读 · 0 评论 -
创建显示表面
创建一个主显示表面:1、填充一个DDSURFACEDESC2数据结构,描述你所希望创建的显示表面(此结构很重要,详细说明见P210或MSDN)。2、调用IDirectDraw7::CreateSurface()来创建显示表面(注:同创建调色板相似,不需调用QueryInterface()来改变接口) 具体设置:LPDIRECTDRAWSURFACE7 lpddsprimary原创 2012-07-17 14:49:55 · 908 阅读 · 0 评论 -
创建实际的IDirectDrawPalette接口
相对于DirectX 6.0,接口并没有改变,所以你不需要使用QueryInterface()或者别的来查询接口。这里使用IDirectDraw7::CreatePalette()的原型,作用是创建调色板对象。HRESULT CreatePalette(////控制调色板的不同属性control flags DWORD dwFlags,/////palette dat原创 2012-07-17 10:29:49 · 811 阅读 · 0 评论 -
利用双缓冲技术来显示动画
现在,你已经能够对主表面的内容做直接修改了(就是锁住主表面然后绘制像素),也就是通过视频控制器直接将每一帧都光栅化。 什么是光栅化????http://blog.sina.com.cn/s/blog_61ac952e0100fs84.html什么是帧????答:一帧就是一副静止的画面,连续的帧就形成动画,如电视图象等。 我们通常说帧数,简单地说,就是在1秒钟时间里传输的原创 2012-07-18 09:22:24 · 5266 阅读 · 0 评论 -
创建一个关联有"后备缓冲"的"主表面"(即复杂表面,Complex Surface)
离屏表面有两类:第一种叫做后备缓冲(Back Buffer)。后备缓冲是指一些用在动画链中的表面,它们具有和主表面相同的尺寸和色深。后备缓冲表面比较独特,因为当你创建主表面时也创建也它们(通过设置一系列属性指示系统创建主表面同时也创建任意数量的后备缓冲)。 创建后备缓冲的目的是用DirectDraw的方式来实现双缓冲功能的仿真。如果创建了DirectDraw后备缓冲(通常它在VR原创 2012-07-18 10:26:05 · 2446 阅读 · 0 评论 -
使用硬件blitter来移动位图和填充像素
通常,当你想绘制位图或者对视频表面进行填充时,你只能手工一个像素一个像素地进行。例如:UCHAR *video_buffer; ///points to VRAM or offscreen surface(离屏表面) UCHAR *bitmap[8*8] ;////holds our bitmap in row major form///curde(粗) b原创 2012-07-20 16:10:46 · 1792 阅读 · 0 评论 -
位图旋转和缩放
。。。。。。。。原创 2012-07-20 16:38:59 · 580 阅读 · 1 评论 -
使用Blitter
代码演示:原创 2012-07-20 16:38:22 · 726 阅读 · 0 评论 -
色彩键
源色彩键:目标色彩键:原创 2012-07-20 16:37:49 · 645 阅读 · 0 评论 -
利用硬件Blitter实现表面间位图复制
说明:Blitter的使命就是从源内存向目标内存复制矩形位图。可以是复制整个屏幕,或者是代表游戏物体的小位图。两种情况下,都需要通知Blitter从一个表面向另外一个表面复制数据。 现在,你知道如何创建一个主表面和一个充当后备缓冲的备用表面,但是你还不知道如何创建同主表面相联系的离屏表面。如果你不能够创建它们,就不能够Blit它们。离屏表面:创建离屏表面:在离屏表面上进行B原创 2012-07-20 16:30:23 · 917 阅读 · 0 评论 -
DirectDraw的庐山真面目
前言:主DirectDraw对象:关于表面:使用调色板:....。。。。。。。。。。。。 窗口模式下使用DirectDraw,下节待续...............原创 2012-07-20 16:39:55 · 601 阅读 · 0 评论 -
窗口模式下使用DirectDraw
。。。。。。。。。。。。。。。。原创 2012-07-20 16:40:50 · 1317 阅读 · 0 评论 -
基础裁剪知识
将像素按视口裁剪:位图裁剪:使用IDirectDrawClipper进行DirectDraw裁剪:原创 2012-07-20 16:34:04 · 657 阅读 · 0 评论 -
页面切换
当你创建了一个具有一个主表面和一个后备缓冲表面的复杂表面,就可以进行页面切换了!标准动画循环需要以下几步:1、清除后备缓冲(后备缓冲清0)2、将场景渲染到后备缓冲(在后备缓冲表面绘制像素)3、用后备缓冲表面切换掉主表面(调用Filp()函数进行页切换)4、锁定在某个帧速率(例如30fps)5、重复第一步 一些难以理解的细节:首先,后备缓冲切换到了主缓冲,后备缓冲原创 2012-07-18 13:01:45 · 2012 阅读 · 2 评论 -
创建一个调色板
调色板数据结构:typedef struct tagPALETTEENTRY { BYTE peRed; BYTE peGreen; BYTE peBlue; BYTE peFlags; } PALETTEENTRY; /////palette storagePALETTEENTRY palette[256];然后用你希望的方式填满它们:// bui原创 2012-07-17 09:55:58 · 1076 阅读 · 0 评论 -
什么是颜色深度(色深)
颜色深度简单说就是最多支持多少种颜色。一般是用“位”来描述的。颜色深度举个例子,如果一个图片支持256种颜色(如GIF格式),那么就需要256个不同的值来表示不同的颜色,也就是从0到255。用二进制表示就是从00000000到11111111,总共需要8位二进制数。所以颜色深度是8。 如果是BMP格式,则最多可以支持红、绿、蓝各256种,不同的红绿蓝组合可以构成25原创 2012-07-17 09:36:27 · 19790 阅读 · 0 评论 -
为什么要使用高彩模式
1、什么是高彩模式?答:每像素需要超过8位表示的色彩模式。2为什么要使用高彩模式?答:高彩模式的视觉效果无疑比256色(8位)模式更好。////////可参见前面博客文章《色彩深度》原创 2012-07-17 16:20:43 · 3581 阅读 · 0 评论 -
HEL和HAL
HAL:hardware abstraction layer ,硬件抽象层,直接和硬件对话的一层。HAL是一种设备驱动程序,通常由设备生产厂商提供,你可以通过常规DirectX调用直接和他进行通信。条件是当硬件能直接支持你所要执行的功能的时候HAL才被使用! HEL:hardware emulation layer,硬件仿真层,运用于当硬件不支持你所要求的性能的时候。 HEL和原创 2012-07-16 10:53:30 · 1236 阅读 · 0 评论 -
DirectDraw各接口配合起来成为一个DirectDraw应用程序
1、创建DirectDraw对象(有三种方法)来得到一个IDirectDraw7接口,用这个接口来设置协作级别和视频模式。 2、使用IDirectDrawSurface7接口至少创建一个主显示表面用以绘图。基于颜色深度和视频模式自身------如果视频模式是每像素8位或者更少,将会需要一个调色板(多于8位就不再使用调色板) 3、用IDirectDrawPalette接口创建一个原创 2012-07-16 21:02:54 · 675 阅读 · 0 评论 -
DirectDraw结构及其功能说明
DirectDraw是由很多接口组成的,接口就是用以组件通信的函数与方法的集合!!!DirectDraw总共由五个接口组成:IUnknown-------所有COM对象都必须从这个基本接口生成,DirectDraw也不例外IDirectDraw------这是开始使用DirectDraw时必须创建的主接口对象。IdirectDraw一对一地表示视频卡及其支持硬件。///////视频原创 2012-07-16 20:17:13 · 980 阅读 · 0 评论 -
创建和使用DirectX接口(并再次理解COM对象)
再次理解COM对象:以前说:一个COM对象事实上是一个或一套实现了大量接口的C++类,这些接口用于和COM对象进行交流!!!现在说:COM对象其实就是接口集,该接口集也就是函数指针(更准确的说是VTABLE)。个人理解:由上一篇博客“一个可运行的COM程序”可推测,一个COM对象就是最终实现了一系列接口(如CCOM_OBJECT实现了IX、IY)的那个类产生的一个实例(和C++中一般的原创 2012-07-16 15:36:42 · 2963 阅读 · 0 评论 -
创建DirectDraw对象的三种方法
第一种:LPDIRECTDRAW lpdd = NULL; // pointer to IDirectDraw (temporary)LPDIRECTDRAW7 lpdd7 = NULL; // pointer to IDirectDraw7 (what we want)// get the IDirectDraw interface pointerif (FAILED(Direc原创 2012-07-16 20:42:33 · 1426 阅读 · 0 评论 -
使用控件,代码小例子
// DEMO3_1.CPP - Demo of loading an icon and cursor resource// INCLUDES ///////////////////////////////////////////////#define WIN32_LEAN_AND_MEAN // just say no to MFC#include // include a原创 2012-07-16 09:27:21 · 576 阅读 · 0 评论 -
设置全局变量为什么没有成功!!!
问题描述:见代码红色部分// DEMO3_1.CPP - Demo of loading an icon and cursor resource// INCLUDES ///////////////////////////////////////////////#define WIN32_LEAN_AND_MEAN // just say no to MFC#include原创 2012-07-15 20:20:14 · 1997 阅读 · 0 评论 -
向子控件发送消息(消息反射)
////向子控件发送消息://////由于子控件同时也是窗口,因此他们能和其他窗口一样接收消息;/////但是由于它们是某个父控件的子控件,接收到的消息被转发到父控件窗口事件句柄中的WM_COMMAND消息处理段/////然而向子控件发送消息也是可能的,子控件将使用自己的默认的WinProc()处理该消息////p151://///使用SendMessage()来改变按钮的状态原创 2012-07-16 10:06:28 · 1520 阅读 · 0 评论 -
一个简易的屏幕保护程序
// DEMO3_1.CPP - Demo of loading an icon and cursor resource// INCLUDES ///////////////////////////////////////////////#define WIN32_LEAN_AND_MEAN // just say no to MFC#include // include a原创 2012-07-15 21:24:08 · 1384 阅读 · 1 评论 -
理解COM
COM产生:类比计算机芯片和Lego拼装玩具块如何各自配合使用,你只需要把它们拼接到一起,它们就可以运作了,因为它们有良好定义的接口; 想到如何用软件实现此类技术?? 答:同样需要有一个非常通用的、能够处理任何能想到的功能的接口集!!这就是COM的工作原理。 如何升级COM组件而不需要重新编译???? 就是给你的用户新的COM对象,而所原创 2012-07-16 13:11:45 · 500 阅读 · 0 评论 -
IUnknown结构初窥
struct IUnknown{// this function is used to retrieve other interfacesvirtual HRESULT __stdcall QueryInterface(const IID &iid, (void **)ip) = 0;// this is used to increment interfaces reference原创 2012-07-16 13:30:15 · 752 阅读 · 0 评论 -
使用CreateWindowEx()创建窗口的一些参数设置问题
// create the windowif (!(hwnd = CreateWindowEx(NULL, // extended style WINDOW_CLASS_NAME, // class "DirectDraw Full-Screen Demo",原创 2012-07-17 16:14:33 · 6445 阅读 · 0 评论 -
绘制像素
要在全屏的DirectDraw模式下绘制一个(或多个)像素:首先,必须建立DirectDraw,设置协作级别,设定显示模式,并创建至少一个主显示表面,然后你需要获得对主显示表面的权限并写入显存。一些说明:所有的DirectDraw视频模式和显示表面都是线性的,当DirectDraw检测到一个模式在硬件中是非线性的时候,就会调用一个叫做VFLATD.VXD的驱动,原创 2012-07-17 15:30:30 · 601 阅读 · 0 评论 -
将调色板与显示表面相关联
要关联一个调色板的任何显示表面,你需要做的仅仅是调用IDirectDrawSurface7::SetPalette()函数例如:// finally attach the palette to the primary surfaceif (FAILED(lpddsprimary->SetPalette(lpddpal))) { // error retur原创 2012-07-17 14:56:10 · 695 阅读 · 0 评论 -
“显示表面”初窥
显示在屏幕上的图像只不过是以某种格式存储在内存中的有色像素组成的矩阵,或是调色板化的或是RGB模式的。在任何一种情况下,要想做点什么你都必须知道怎样绘图到内存中。然而DirectDraw的设计者决定将显存的概念予以抽象(。。。。),从而无论你的系统中视频卡有多么古怪,访问视频表面的方法都是一样的。这种抽象是通过DirectDraw 支持显示表面来实现的。 显示表面:是能存储位图数据原创 2012-07-17 10:58:20 · 670 阅读 · 0 评论 -
创建一个640*480*8分辨率的全屏DirectX应用程序
int Game_Init(void *parms = NULL, int num_parms = 0){// this is called once after the initial window is created and// before the main event loop is entered, do all your initialization// here原创 2012-07-17 09:30:51 · 1414 阅读 · 0 评论