11 2011 档案
摘要:深入理解Direct3D9深入理解D3D9对图形程序员来说意义重大,我把以前的一些学习笔记都汇总起来,希望对朋友们有些所帮助,因为是零散笔记,思路很杂,还请包涵。其实只要你能完美理解D3DLOCK、D3DUSAGE、D3DPOOL、LOST DEVICE、QUERY、Present()、BeginScene()、EndScene()等概念,就算是理解D3D9了, 不知道大家有没有同感。有如下几个问题,如果你能圆满回答就算过关:)。问题1、 D3DPOOL_DEFAULT、D3DPOOL_MANAGED、D3DPOOL_SYSTEMMEM和D3DPOOL_SCRATCH到底有何本质区别?2、 D
阅读全文
摘要:首先得声明我这篇文章只有很少的篇幅介绍龙书,其实我是想写点东西给那些看完龙书的人。 这是我接触3D图形编程的第一本书,接触3d图形编程前,我看的是《Windows 游戏编程大师技巧》,只看了前几章,当时我急着想去学3D的酷玩意儿,立刻就没耐心看GDI,DirectDraw。转投Direct3D门下,入门书当然是这本龙书了。对我来说龙书最棒的地方在于,它除了开始的数学基础章节外,每一章都能详细地引导读者去实现一个简单的3D特性,从画三角形到摄像机,到简单的粒子系统,地形,甚至到shader。Luna无疑是睿智而狡猾的,他知道初学者往往耐心不够,所以他总是适时地丢出个胡萝卜,让读者保持着继续的动力
阅读全文
摘要:Alpha测试可控制Direct3D程序是否绘制当前像素(根据是否满足Alpha测试条件),图形程序应用Alpha测试可以有效地屏蔽某些像素颜色。与Alpha混合相比,Alpha测试不能将绘制像素颜色与颜色缓冲区像素混合,像素要么完全不透明,要么完全透明。由于无须进行颜色缓冲区的读操作,因此Alpha测试在速度上要优于Alpha混合。 Alpha测试通过渲染状态D3DRS_ALPHATSTEABLE设置,下列代码激活Direct3D的Alpha测试状态: // g_pd3dDevice为有效的Direct3D设备 g_pd3dDevice->SetRenderState( D3DRS_A
阅读全文
摘要:[翻译]DirectX 状态状态Direct3D设备使用状态来配置所有的管道处理。采样器状态通过例如定义纹理寻址方式(texture addressing)和过滤模式控制纹理采样器设置。纹理状态设置用于控制纹理如何被组合以及相互之间如何混合的多重纹理混合器。渲染状态控制大多数管道状态。状态块是存储和恢复状态的便利机制。状态块保存和恢复状态状态块是一组设备状态。设备状态由渲染状态,定点状态,像素状态,或上述的所有状态组成。状态块包含设备当前状态的快照,或你可以创建状态块来记录每一个应用程序造成的状态改变。创建状态块选择你想获取的状态类型,比功能照下面的方法创建状态块:IDirect3DState
阅读全文
摘要:透过那些透明度非常高的物体看其他物体,例如透过几乎完全透明的玻璃看其他物体,会感到玻璃好像不存在,在三维图形程序中渲染时就可以不渲染这些透明度非常高的物体,从而可以提高渲染速度,这可以通过alpha测试来实现。alpha测试根据当前像素是否满足alpha测试条件(即是否达到一定的透明度)来控制是否绘制该像素,图形程序应用alpha测试可以有效地屏蔽某些像素颜色。与alpha混合相比,alpha测试不将当前像素的颜色与颜色缓冲区中像素的颜色混合,像素要么完全不透明,要么完全透明。由于无需进行颜色缓冲区的读操作和颜色混合,因此alpha测试在速度上要优于alpha混合。alpha测试通过激活渲染状
阅读全文
摘要:材质alpha顶点alpha是没有使用光照和材质的情况,如果对场景内的物体添加光照和材质而没有添加纹理时,顶点alpha值取决于材质属性中漫反射颜色的alpha系数和灯光颜色中的alpha系数,顶点alpha值是根据光照计算得到的。顶点光照计算是分别针对红、绿、蓝和alpha进行的,其中alpha光照计算的结果就是顶点的alpha值。有了顶点的alpha值就可根据着色模式计算出每个像素的alpha值,第一个示例程序就是材质alpha的例子。纹理alpha当对物体表面使用了纹理之后,像素的alpha值就是纹理alpha混合之后的值,所以这又取决于纹理的alpha混合方法,纹理alpha混合方法决
阅读全文
摘要:alpha源混合系数通常设置为D3DBLEND_SRCALPHA,即当前绘制像素的alpha值。目标混合系数设置为D3DBLEND_INVSRCALPHA,即1减去当前绘制像素的alpha值。那么当前绘制像素的alpha值又是如何得到的呢?如果没有使用材质和纹理,当前绘制像素的alpha值来自每个顶点颜色设置的alpha值;如果使用光照和材质,则当前像素的alpha值来自物体表面材质;如果为物体表面使用了纹理,则alpha值还与纹理有关。顶点alpha如果在程序中直接指定每个顶点的颜色,则可以直接给出每个顶点颜色的 alpha值,可以在定义顶点时直接声明该顶点的alpha值,也可以在程序运行时
阅读全文
摘要:深度测试与alpha混合(1)在绘制复杂的三维场景时,不可避免地会出现物体间的相互遮挡,在这种情况下,为了正确地绘制场景需要使用深度测试。半透明物体的绘制不同于不透明物体,Direct3D通过alpha混合实现半透明物体的绘制。深度测试可以简化复杂场景的绘制,alpha混合可以使绘制的三维场景更完整、更逼真。在复杂的场景中,通常有多个物体需要绘制,这些物体之间通常会存在遮挡关系,离观察点较远的物体会因为近处物体的者的遮挡而不可见或只有部分可见,Direct3D图形系统提供了深度测试功能来实现这种效果。深度缓冲区与深度测试要理解深度测试,首先需要理解深度缓冲区。深度缓冲区是Direct3D用来存
阅读全文
摘要:原地址:http://www.cnblogs.com/winsonchen/archive/2008/09/06/1285515.html一、场景管理有很多种方法,如四叉树、八叉树、BSP、模糊K-D树、包围球层次结构等。室内环境主要是BSP为主,从quake3一直延续到现在主流的引擎都是以BSP为基础,BSP使用并不难,关键是数据的生成,这就牵涉到场景编辑器。 Quake3、Unreal:BSP,有自己的编辑器。 FarCry:场景分为室内和室外两部分,室内场景使用BSP, 室外不清楚但应该跟地形有很大关系,同时为了支持超远距离视距使用了地形Occlusion Culling,另外也可以手.
阅读全文
摘要:在渲染多边形网格对象到场景中的时候,离观察者越远的对象应该越模糊,同时离观察者越近的物体应该越清楚,这就是深度排序(depth sorting)。深度排序有两种常用的方法。第一种方法称为画家算法(painter's algorithm)。这种方法将对象划分成不同的多边形,由后往前对这些多边形进行排序,再按照排好的顺序绘制出这些多边形。采用这种方法绘制多边形,能够确保前面的多边形总是在其后多边形之前进行绘制。深度排序的第二种方法称为z缓冲方法(z- buffer),它是图形硬件设备使用最多的方法。这种方法依赖于像素,每个像素都有一个z值(z值是像素距离观察者的距离)。当每个像素被写入时,
阅读全文
摘要:缩放与视域角有关投影的过程就是xyz分量除以W的过程可知投影在了z=1,的平面上面的z是指乘以投影矩阵(剪裁矩阵)后的z 这里设上面这个DIP矩阵为A;经过计算可知:(在近裁剪面的点) (x,y,n,1)*A=(x*zoomx,y*zoomy,0,n)---->投影后为(x*zoomx/n,y*zoomy/n,0)(在远裁剪面的点) (x,y,f,1)*A=(x*zoomx,y*zoomy,f,f)---->投影后为(x*zoomx/f,y*zoomy/f,1)乘以矩阵后的点满足了0<=z<=w。而且是两个边界。这里的DIP矩阵就是投影矩阵。只不过投影过程要除以w分量来
阅读全文
摘要:呵呵,完全从书上扒下来的,写得很好,详细说明了视角变换矩阵的计算过程。
阅读全文
摘要:游戏程序员养成计划 (更新2010.11.6)原文地址:http://www.cnblogs.com/clayman/archive/2009/05/17/1459001.html#2241553仅供个人学习使用,请勿转载,勿用于任何商业用途。作者:Clayman 与玩游戏相比,写游戏要复杂上千万倍,除了需要掌握通用的编程技巧以外,还要有相当的图形学,物理,数学基础,特别是在国内,由于相关资料的缺乏,更是让初学者无从下手。下面总结了一些入门方法和比较容易入手的资料。 首先你要精通一门高级语言,比如C++或者C#,其次,要有良好的英文阅读能力。对游戏开发者来说英文阅读能力是最重要也是最基本的工具
阅读全文
摘要:有点深意。。
阅读全文
摘要:渲染流水线 对于Direct3D,上述过程通常被认为是一个渲染流水线。 未经转换和照明的顶点从一端进入,在内部这些顶点将完成几个连续操作。然后,经过转换和照明处理的顶点从另一端出来。 渲染流水线的大部分过程都是在进行坐标转换 ,将顶点从一个坐标系转换到别的坐标系。 在使用Direct3D来进行转换时,用户只需要提供描述系统转换的完整转换矩阵,通过IDirect3DDevice->SetTransform方法来实现相应的变换。HRESULT SetTransform( D3DTRANSFORMSTATETYPE State, //变换的类型 CONST D3DMATRIX *pMatrix
阅读全文
摘要:最近在看阿哲的《3D地形制作全攻略》,写得很好,但是好像网上找不到源码,本来想加QQ请教一下,不过貌似被拒绝了。。。按照书上的方法想做一个光晕效果,看着其实还是不难,但是动手实现的时候还是遇到了麻烦,特别是进行世界坐标->视角转换->投影转换->视口转换的时候,理解起来还是费了一番功夫。就此总结一下。首先说一下光晕实现的思路,就是在世界坐标系中确定太阳的位置,然后通过视角转换->投影转换->视口转换,变换到屏幕坐标,结算其与屏幕中心的连线,在这条直线上面贴上光晕的贴图,光晕的alpha值由太阳(屏幕坐标)到屏幕边界的距离决定,开启alpha融合渲染。基本思想并不难
阅读全文
摘要:void dda(HDC hdc){ float dx,dy; int k; float x; float y; HPEN pen=NULL; pen = CreatePen(PS_SOLID,5,RGB(255,0,0)); SelectObject(hdc,pen); k=_abs(x2-x1); if(_abs(y2-y1)>k) k=_abs(y2-y1); dx=(x2-x1)/k; dy=(y2-y1)/k; x=x1; y=y1; for(int i=0;i<=k...
阅读全文
摘要:在本章中,我将介绍窗口过程和基本的正文输出,并对一些较高级的题材,如键盘和鼠标,作一个简洁的介绍。消息系统完美的风格使得你可以相对完全地、及时地对这两个硬件设备进行控制。 现在,你可以开始输入并运行程序清单 5.1 上的程序。程序清单 5.1 KeyMouse 程序,用于追踪键盘和鼠标的输入///////////////////////////////////////// Program Name:KeyMouse.cpp// Programer: skyline// Description: Show how to trap keyboard and mouse input////////.
阅读全文
摘要:很多学软件的朋友需要做C语言链表应用的课程设计,下面是我写的代码,希望对需要的人有些帮助。。。希望和大家交流一下,更希望高手指点。。已经经过(turboC 2.0编译通过)。#include <stdio.h>#include <stdlib.h>#define LEN sizeof(struct student)#define NULL 0struct student { int number; int score; struct student*next;};struct student*create() { struct s...
阅读全文
摘要:#include#includemain(){ int *p,count; scanf("%d",&count); p=(int*)malloc(count*sizeof(int)); for(int i=0;i p[i]=i; for(int j=0;j printf("%d",p[j]);}
阅读全文
摘要:通过动态内存分配实现c语言动态指针"数组".其实这种结构并非是一种数组,只是手动实现的一种类似数组的结构,实现类似数组的功能。应该可以说是一种伪数组结构吧。#include <stdio.h>#include <stdlib.h>main(){ char**p; int count,j,i; p=0; scanf("%d",&count); p=(char**)calloc(count,sizeof(char*)); for(j=0;j<count;j++) p[j]=(char*)malloc(10*sizeof(
阅读全文
摘要:#include <stdio.h>#include <stdlib.h>#define SHI sizeof(struct duoxiangshi)#define NULL 0struct duoxiangshi{int xishu,zhishu; struct duoxiangshi*next;};struct duoxiangshi*create() {struct duoxiangshi*head,*p1,*p2; int n; n=0; head=NULL; p2=NULL; p1=NULL; p1=(struct duoxiangshi*)mal...
阅读全文
摘要:接口文件poly.h#ifndef POLY_H#define POLY_H#include <iostream>#include <cstdlib>#include <cstddef>using namespace std;typedef int* intptr;class poly{public: poly(); poly(int a); poly(const poly& p); ~poly(); void creat(); friend poly operator +(const poly& p1,const poly& p2)
阅读全文
摘要:一个用D3D绘制2D图形的例子思路如下:(1)函数Do_Init初始化D3D,D3D设备,顶点缓冲,纹理;主要调用这几个函数: Direct3DCreate9,GetAdapterDisplayMode,CreateDevice,CreateVertexBuffer, Lock,Unlock,D3DXCreateTextureFromFile。(2)函数Do_Frame绘制一帧,主要调用这几个函数: Clear,BeginScene,EndScene,SetStreamSource,SetFVF,SetTexture, DrawPrimitive。(3)函数Do_Shutdown释放D3D资源
阅读全文
摘要:学习D3D9的时候遇到灵活顶点格式(FVF)中D3DFVF_XYZRHW和D3DFVF_XYZ之间差异而引起的问题。参看了同是C++博客的一篇博文,其分析如下: The RHW value, which stands for Reciprocal of Homogeneous W[1], tells Direct3D that the vertices that are being used are already in screen coordinates. This value is normally used in fog and clipping calculations and sh
阅读全文
摘要:微软D3D设备能创建和操纵下面初基类型:l点列表l线列表l线带l三角形列表l三角形带l三角形扇区你能用IDirect3DDevice9接口中的任何粉刷方法在C++程序中粉刷原基。1.1.1.1.点列表一个点列表是一个顶点的集合,这些顶点被作为单独的点来粉刷。你的程序可以在3-D场景中用它们作为在多边形表面上开始字段、点线。下图描述了一个粉刷后的点列表。你的程序能在一个点列表上应用素材和纹理,素材或纹理的颜色仅仅出现在点上,而不是在点之间的任何地方。下面的代码显示怎么样为顶点创建点列表:struct CUSTOMVERTEX{float x,y,z;};CUSTOMVERTEX Vertices
阅读全文
摘要:前言:本教程面向对DriectX 9.0有一定了解的读者,主要讲解DirectX 9.0的各个部分的功能及用法。希望对广大的游戏初学者有一定帮助,也好让本人对中国游戏事业的发展做出一些微不足道的贡献。作者:Fabric(由于本人是广东人,写文章难免参杂粤语写法,请见谅) 简介:ID3DXSprite是DriectX 9.0里面的一个简单模块,在DriectX 9.0帮助文档里面对其功能的描术为:“向用户提供一套简单的在屏幕上实现精灵渲染的接口。”何为精灵渲染,说白了就是渲染2D画面,ID3DXSprite帮助用户透过简单的操作就能运用DriectX 9.0制作2D游戏(渲染2D图形),ID3.
阅读全文
摘要:alpha混合原理在前面介绍的示例程序中,绘制图形的颜色总是替换当前颜色缓冲区中存在的颜色,这样后面的物体总是覆盖在原有的物体上。但是当想要绘制类似于玻璃、水等具有透明效果的物体时,这种方法显然满足不了要求。通过定义一个表示物体半透明度的alpha值和一个半透明计算公式,可以将要绘制的物体颜色与颜色缓冲区中存在的颜色相混合,从而绘制出具有半透明效果的物体。Direct3D计算alpha颜色混合的方法如下:color = (RGBsrc* Ksrc) OP (RGBdst* Kdst)其中color表示alpha混合后的颜色值,RGBsrc表示源颜色值,即将要绘制的图元的颜色值;Ksrc表示源混
阅读全文
摘要:还是先发DX的文档的记录:IDirect3DDevice9::SetTextureStageStateSets the state value for the currently assigned texture.HRESULT SetTextureStageState( DWORD Stage, D3DTEXTURESTAGESTATETYPE Type, DWORD Value );ParametersStage[in] Stage identifier of the texture for which the state value is set. Stage identifiers a
阅读全文
摘要:如何组织编写模板程序前言常遇到询问使用模板到底是否容易的问题,我的回答是:“模板的使用是容易的,但组织编写却不容易”。看看我们几乎每天都能遇到的模板类吧,如STL, ATL, WTL, 以及Boost的模板类,都能体会到这样的滋味:接口简单,操作复杂。我在5年前开始使用模板,那时我看到了MFC的容器类。直到去年我还没有必要自己编写模板类。可是在我需要自己编写模板类时,我首先遇到的事实却是“传统”编程方法(在*.h文件声明,在*.cpp文件中定义)不能用于模板。于是我花费一些时间来了解问题所在及其解决方法。本文对象是那些熟悉模板但还没有很多编写模板经验的程序员。本文只涉及模板类,未涉及模板函数。
阅读全文
摘要:【问题描述】马的遍历问题。在8×8方格的棋盘上,从任意指定方格出发,为马寻找一条走遍棋盘每一格并且只经过一次的一条路径。【初步设计】首先这是一个搜索问题,运用深度优先搜索进行求解。算法如下:1、输入初始位置坐标x,y;2、步骤 c: 如果c>64输出一个解,返回上一步骤c--(x,y) ← c计算(x,y)的八个方位的子结点,选出那此可行的子结点循环遍历所有可行子结点,步骤c++重复2显然(2)是一个递归调用的过程,大致如下:void dfs(int x,int y,int count){ int i,tx,ty;if(count>N*N) { output_so...
阅读全文
摘要:#include <iostream.h>int board [8][8]={0};int Htry1[8]={-2,-1,1,2,2,1,-1,-2};int Htry2[8]={1,2,2,1,-1,-2,-2,-1};bool chech[8][8]={0};//标记位置是否已经被占用int n=1;//就算已走的步数void findway(int i,int j){for(int z=0;z<8;z++){if(i+Htry1[z]>=0&&i+Htry1[z]<8&&j+Htry2[z]>=0&&j
阅读全文
摘要:#include <iostream.h>struct point{int x,y;//马的位置int dir;//这一次马行走的方向};struct stack{point p[64];//存储马的位置,方便回溯};int board [8][8];int Htry1[8]={-2,-1,1,2,2,1,-1,-2};int Htry2[8]={1,2,2,1,-1,-2,-2,-1};bool chech[8][8]={0};//标记位置是否已经被占用int main(){int i,j;int top=0;int z; cout<<"请输入马的初始位置&
阅读全文
摘要:什么是LuaLua是具有简单数据描述的扩展编程语言(动态解析语言)。它提供了非常好的面向对象编程, 函数式编程(functional programming),数据驱动式编程(data-driven programming),它可以作为一个强大、轻量的脚本语言,供任何需要的程序使用。 Lua 以一个用 clean C 写成的库形式提供。(所谓 Clean C ,指的 ANSI C 和 C++ 中共通的一个子集)Lua例子(FOR 循环)for i=1,10 do -- the first program in every language io.write("Hello world,
阅读全文
摘要:最近园子到处充斥着类似《告别程序员生涯,一点感慨,与诸君共勉》http://topic.csdn.net/u/20110331/00/37ad95f8-f559-497f-b527-191eb701ef77.html?99610《开发工程师人生之路(强烈推荐,分析的透彻!)》http://topic.csdn.net/u/20110323/16/16ebe2ac-bca5-49da-a050-45cf522a0828.html这样的文章。这些文章往往格调阴暗,无病呻吟,总是欲图从有限的,不愉快的个体经历得出规律性的,悲观的结论。最不可思议的是,即使这些缺乏基本文理逻辑的文章,往往能引来大批欢呼
阅读全文
摘要:VS 2005环境下生成静态lib库及调用方法生成lib方法:步骤1:新建一个空项目,建一个头文件如Test.h#pragma once#ifdef __cplusplusextern "C" {#endifint GetMin(int a, int b);#ifdef __cplusplus}#endif//其实只要 int GetMin(int a, int b);这么一句语言也会通过,其他的语句仅仅表明一个头文件在很多情况下并不是这么简单的,会有很多的定义步骤2:新建一个源文件如Test.cpp#include "Test.h"int GetMin
阅读全文
摘要:网上看到很多对游戏编程有兴趣的朋友都在说《DirectX 游戏开发终极指南》这本书的游戏项目无法编译通过,自己研究了一下,上网也看了好多提问,终于摸索出成功编译的方法,希望跟这些朋友一起分享一下,大家一起学习一起进步。下面开始正题:首先,必须在vs2003以上的环境建立工程,因为最新的dxsdk对vc6已经不支持了,而且《DirectX 游戏开发终极指南》游戏项目中要用到的directinput在vc6下也有错误。要编译通过随书附带的游戏项目示例程序,要用早期版本DX9。0c 因为最新版本的DX9已经没有directmusic了。而本书要用到。我用的是2006年的。好,下面开始新建一个项目,编
阅读全文
摘要:其先序序列的第一个元素为根节点,接下来即为其左子树先序遍历序列,紧跟着是右子树先序遍历序列,故根节点已可从先序序列中分离。在中序序列中找到确定的根节点,根据中序遍历特性,在巾序序列中,根节点前面的序列即为左子树的中序遍历序列,根节点后面的即为右子树的中序遍历序列。由左右子树的中序序列长度,在该二叉树的先序序列中即可找到左右子树的先序序列的分界点,从而得到二叉树的左右子树的先序序列。递归实现:递归函数输入:二叉树的先序序列和中序序列;返回-、建好的二叉树的根节点。算法思想:1)若二叉树空,返回空;2)若不空,取先序序列第一个元素,建立根节点;3)在中序序列中查找根节点,以此确定左右子树的先序序列
阅读全文
摘要:骨骼蒙皮动画(Skinned Mesh)的原理解析(一)一)3D模型动画基本原理和分类3D模型动画的基本原理是让模型中各顶点的位置随时间变化。主要种类有Morph动画,关节动画和骨骼蒙皮动画(Skinned Mesh)。从动画数据的角度来说,三者一般都采用关键帧技术,即只给出关键帧的数据,其他帧的数据使用插值得到。但由于这三种技术的不同,关键帧的数据是不一样的。Morph(渐变,变形)动画是直接指定动画每一帧的顶点位置,其动画关键中存储的是Mesh所有顶点在关键帧对应时刻的位置。关节动画的模型不是一个整体的Mesh,而是分成很多部分(Mesh),通过一个父子层次结构将这些分散的Mesh组织在一
阅读全文
摘要:每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心。-- Christopher Alexander 设计模式描述了软件设计过程中某一类常见问题的一般性的解决方案。面向对象设计模式描述了面向对象设计过程中、特定场景下、类与相互通信的对象之间常见的组织关系。 设计模式与面向对象 面向对象设计模式解决的是“类与相互通信的对象之间的组织关系,包括它们的角色、职责、协作方式几个方面。 面向对象设计模式是“好的面向对象设计”,所谓“好的面向对象设计”是那些可以满足“应对变化,提高复用”的设计。 面向对象设计模式描述的是软件设计,因此它是独立于编程语言的,但是面向对象设...
阅读全文
摘要:导读: DirectInput编程基础 - 简介 出 处: 中国游戏开发者 [ 2001-09-09] 作 者: 目 录 1.1 DirectInput概念 1.2 设置DirectInput 1.3 列举设备 1.4 设置设备 1.5 取得输入数据 绪言 输入相对于图形和声音而言从未成为游戏开发中的非常重要的论题。读取键盘按键、鼠标移动和游戏杆位置似乎并没有什么困难,但随着新输入设备对市场的强烈冲击以及DirectX的发行,这一问题变得日益重要了。 如果用户是DirectInput编程的新手,那么应先排除掉一些旧观念。应记住的重要一点是DirectInput的得名是因为...
阅读全文
摘要:typedef struct _D3DPRESENT_PARAMETERS_ { UINT BackBufferWidth, BackBufferHeight; D3DFORMAT BackBufferFormat; UINT BackBufferCount; D3DMULTISAMPLE_TYPE MultiSampleType; DWORD MultiSampleQuality; D3DSWAPEFFECT SwapEffect; HWND hDeviceWindow; BOOL Windowed; BOOL EnableAutoDepthStencil; D3DFORMAT AutoDe
阅读全文
摘要:光照的两大要素是光源和物体的材质,物体表面材质属性决定了它能反射什么颜色的光线以及反射多少光线。一、Direct3D中材质的定义D3D中材质通过D3DMATERIAL9结构来表示:typedef struct D3DMATERIAL9 { D3DCOLORVALUE Diffuse; D3DCOLORVALUE Ambient; D3DCOLORVALUE Specular; D3DCOLORVALUE Emissive; float Power;} D3DMATERIAL9, *LPD3DMATERIAL9;Diffuse-指定表面反射的漫反射光。Ambient-指定表面反射的环境光。Spe
阅读全文
摘要:D3DXCreateTextureFromFileEx上次在玩公告板时,用到了D3DXCreateTextureFromFileEx函数,上次的主要目的是公告板,对这个函数没太多的关心,现在发现这个函数是D3DXCreateTextureFromFile的高级板本,还是有它优势的,不然它就没有存在的意义了。D3DXCreateTextureFromFileEx这个函数有14个参数,在MSDN中的原型(后面中文解释为本人理解,仅供参考,原文请查看MSDN):HRESULT D3DXCreateTextureFromFileEx( LPDIRECT3DDEVICE9 pDevice, ...
阅读全文
摘要:在D3D中有3种类型的灯光,用它们可以让3D世界显得真实 。一、灯光类型1、点光(Point Light) 从一个点向周围均匀发射的光,有最大的照明范围,亮度随距离衰减,最明显的一个例子就是我们家里用的灯泡。2、方向光(Directional Light) 方向光是一组没有衰减的平行光,类似太阳光的效果。3、聚光灯(Spot Light) 最复杂的一种灯,有光源点位置、有方向、有范围、有发光的内径和外径,光照强度还会随距离衰减。类似的例子是电筒。二、灯光结构D3D中灯光通过D3DLIGHT9结构来表示:typedef struct D3DLIGHT9 { D3DLIGHTTYPE Typ...
阅读全文
摘要:当我们在编写地形、BOX或者天空盒等的网格与网格连接处常常会看到有的地方会出现一条缝隙之类的,这个要怎么解决呢?其实不难,还记得学过的DirectX提供的纹理寻址里面的镜像纹理寻址、重叠纹理寻址、边框颜色纹理寻址、一次镜像纹理寻址、夹取纹理寻址,这里我把纹理寻址的枚举类型写出来,看不懂就去查查SDK;typedef enum D3DTEXTUREADDRESS{ D3DTADDRESS_WRAP = 1, D3DTADDRESS_MIRROR = 2, D3DTADDRESS_CLAMP = 3, D3DTADDRESS_BORDER = 4, D3DTADDRESS_MIRRORONCE =
阅读全文
摘要:CreateVertexBuffer的形参说明HRESULT CreateVertexBuffer( UINT Length, DWORD Usage, DWORD FVF, D3DPOOL Pool, IDirect3DVertexBuffer9** ppVertexBuffer, HANDLE* pSharedHandle);length:指定缓冲区的大小,以字节为单位。Usage:指定顶点缓冲区的属性,可以设置成0:FVF:这个就用到了我们上面创建的灵活顶点格式Pool:指定顶点缓冲区的内存类型。我们采用的是D3DPOOL_DEFAULT,意思是顶点缓冲区尽可能存在显存中。其
阅读全文
摘要:IDirect3DVertexBuffer9::LockLocks a range of vertex data and obtains a pointer to the vertex buffer memory.HRESULT Lock( UINT OffsetToLock,自缓存的起始点到开锁定的位置的偏移量 UINT SizeToLock,所要锁定的字节数 VOID ** ppbData,指向锁定存储区的起始位置的指针 DWORD Flags改标记描述了锁定方式 ); 注:当OffsetToLock和SizeToLock都为0时,锁定整个缓存 ParametersOffsetToLock
阅读全文
摘要:引言 如果我们希望在场景里添加一个天空,我们可以仅仅只把背景清除为淡蓝色,不过我相信你会认为那样做太普通了。一般来说,那些让你从窗户或洞孔中向外张望的室内游戏使用的是天空盒。只要使用好的纹理,天空盒将提供让人信服的画面;由于纹理伸展在一个巨大的多边形上,低质量的纹理将很容易被注意到。在户外场景中使用天空盒会引发一些问题,例如使用雾,某些雾的设置可能会引发一些问题。如果雾被设置在观察者的旁边,天空盒将减淡甚至消失。另一个可能发生的更烦人的问题是雾会聚积在天空盒的顶点处,从而将天空盒的多边形暴露无遗。下面的图1显示了在天空盒下使用雾所引发的两个问题.小心地调整雾化参数或者细分天空盒的每一个面可以.
阅读全文
摘要:1,要点首先我觉得D3D纹理映射的选项太多,给人一种眼花缭乱的感觉,而且刚看的时候并不容易分辩不同选项之间的差别,不知道如何使用这些选项,或者说不知道这些选项对应以前经验中的哪些效果。这些选现包括:Dark mappingAnimated Dark mappingBlending with Material Diffuse ColorDarkmap with Material Diffuse ColorGlow mappingDetail mappingModulate mappingBlending with Frame BufferTrillinear FilteringClamp Add
阅读全文
摘要:稍微讲下天空盒天空盒的顶点struct SkyBoxVertex{SkyBoxVertex();SkyBoxVertex(float x, float y, float z, float u, float v);SkyBoxVertex(const D3DXVECTOR3& p, const D3DXVECTOR2& uv);D3DXVECTOR3 m_pos;D3DXVECTOR2 m_tex0;};#define D3DFVF_SKYBOX (D3DFVF_XYZ | D3DFVF_TEX1 )SkyBoxVertex::SkyBoxVertex(): m_pos(0.0f
阅读全文
摘要:D3D资源管理资源分类 顶点缓冲(VertexBuffer) 索引缓冲(IndexBuffer) 纹理(Texture)资源存储 显存(Video Memory) 通过AGP直接访问的内存(AGP Aperture,也叫做非本地显存) 系统内存(System Memory)性能权衡 我们在创建D3D资源的时候需要填写两个参数:D3DPOOL、D3DUSAGE。这两个参数共同决定了资源最终存储在显存、非本地显存还是系统内存中。枚举类型D3DPOOLD3DPOOL_DEFAULTD3DPOOL_MANAGEDD3DPOOL_SYSTEMMEMD3DPOOL_SCRATCH D3DPOOL_MANA
阅读全文
摘要:STDMETHOD_是一个宏,用于定义指定返回类型的接口方法,包含virtual关键字。可用于定义方法声明。 #define STDMETHOD_(type,menthod) virtual type STDMETHODCALLTYPE menthod 例如: STDMETHOD_ (ULONG, release)()展开后就是 virtual ULONG STDMETHODCALLTYPE release() STDMETHODCALLTYPE 宏展开是 __stdcall。#define STDMETHOD(method) virtual HRESULT STDMETHODCALLTYPE
阅读全文
摘要:D3D是 COM组件,它在服务进程中运行,而不在当前的客户进程中。在DX组件运行过程中,要创建一系列接口对象,如CreateDevice()返回接口指针,这些接口及其占用内存什么时候释放,要通过“引用计数”的技术来解决。AddRef()给这个接口指针的计数加1,而Release()会将之减1。一旦减到0,表示没有客户使用了,相关的接口就释放了。由此可知,每次调用Rlease()后,并不一定会释放内存,而是当引用计数归0时释放内存。 这样,对接口指针的使用,就像维护堆栈的平衡一样,要仔细,而且按照某种约定规则使用。 但平时D3D编程中,怎么不用AddRef()呢?这是由于一个接口指针,如ID..
阅读全文
摘要:反射只是翻转摄影机,将场景渲染到Texture上,或使用STENCIL蒙板直接绘制。具体计算查看了D3D的 Sample,如下:D3DXMATRIXA16 matViewSaved; m_pd3dDevice->GetTransform( D3DTS_VIEW, &matViewSaved ); //取得view matrix//定义一个翻转的参考平面,可根据需要自己定义位置及法线 D3DXVECTOR3 vPoint(0,0,0); D3DXVECTOR3 vNormal(0,1,0); D3DXMATRIXA16 matView, matReflect; ...
阅读全文
摘要:原文:http://kay.zhang.blog.163.com/blog/static/3493716520084100395228/ multiAnimation是个很酷的东西。我们知道利用AnimationController可以随意的加载.x中的各种动画集。可是如果不做任何设置,只是在一个Track上切换动画集的话,就会出现动作突然变化的效果,十分不自然,比如说:当.x模型在程序中是立正的时候,我们发出命令:敬礼!他的右手手就会直接从裤缝瞬移到太阳穴,没有一个变化的过程。而我们要的效果是:我们下令敬礼 之后,他的手会从裤缝慢慢的移动到太阳穴。整个是一个连续的过程。这要怎么实现呢?其实.
阅读全文
摘要:原文:http://blog.csdn.net/chjp2046/article/details/5460462使用 std::stringstream,小心 内存! 适时 清空 缓冲 ……2007年12月14日 星期五 16:25stringstream是个好东西,网上有不少文章,讨论如何用它实现各种数据类型的转换(比如把double或int转换为string类型)。但如果stringstream使用不当,当心内存出问题(我就吃过亏^_^)。试试下面的代码,运行程序前打开任务管理器,过不了几十秒,所有的内存都将被耗尽!#include <cstdlib>#include <
阅读全文
摘要:学习啦~~~~~~原文地址:漫谈游戏中的阴影技术作者:flymemory随着硬件的越来越高端化,各种以前可望而不可及的效果越来越多的应用到网络游戏里。本篇文章是介绍目前游戏中影子的实现方式,它们的优缺点以及应用的场合。一般来说,在游戏中,应用比较多的影子技术有三种,Projective shadow, Shadow map以及Shadow map.我们接下来便依次的介绍它们。Projective Shadow投影的原理可以应用在任意贴图上就是我们通常所说的投射影子,它的实现比较简单,具体有两个步骤:1.以光源为视点,渲染有影子的物体到一张预备好的Shadow texture中。要注意的是,这里
阅读全文
摘要:名称:LOD地形演示作者:曾涛Email:zengfengtao@163.com下载:http://show.gameres.com/ztLODTerrain/ztLODTerrain.zip (执行程式+代码,2.5MB)开发环境:WIN7 VS2003 DX9.0c C++简介:这是学习LOD地形所做的一个演示程序,是根据潘李亮《largeLOD》一文中来实现的四叉树算法,当然还有Roam和其他的算法没有尝试,等空了都(马上过年了- -#)。不过对地形的层次细节与裁剪有了初步的认识。地形的高度图用的是柏林噪声生成,地图的粗糙表是预先创建的。操作说明: W S A D 控制方向,鼠标左键操.
阅读全文
摘要:仅为开发爱好者提供一些浅见,转载请注明出处。 Introduction Shader,又称着色器,是可编程的,相比过去在显卡上通过硬件hardcode流水线的方式,Shader提供了更灵活有效的解决方案,为新一代的显卡所支持,而在图形引擎中弃用固定流水线编程方式是大势所趋。对于刚刚接触Shader的同学,如何接受这种编程方式的迁移呢?回忆一下主板上BIOS程序,当我们要设置主机是从光盘优先启动还是硬盘优先启动的时候要用到它,配置好的启动信息是保存在主板的CMOS上的。固定管道编程就类似于此,只是对显卡上烧制好的一些算法做一些配置,而Shader的方式则可以使用自己Shader Progra..
阅读全文
摘要:Strassen矩阵乘法矩阵乘法是线性代数中最常见的运算之一,它在数值计算中有广泛的应用。若A和B是2个n×n的矩阵,则它们的乘积C=AB同样是一个n×n的矩阵。A和B的乘积矩阵C中的元素C[i,j]定义为: 若依此定义来计算A和B的乘积矩阵C,则每计算C的一个元素C[i,j],需要做n个乘法和n-1次加法。因此,求出矩阵C的n2个元素所需的计算时间为0(n3)。60年代末,Strassen采用了类似于在大整数乘法中用过的分治技术,将计算2个n阶矩阵乘积所需的计算时间改进到O(nlog7)=O(n2.18)。首先,我们还是需要假设n是2的幂。将矩阵A,B和C中每一矩阵都分块
阅读全文
摘要:对于矩阵乘法 C = A × B,通常的做法是将矩阵进行分块相乘,如下图所示:从上图可以看出这种分块相乘总共用了8次乘法,当然对于子矩阵相乘(如A0×B0),还可以继续递归使用分块相乘。对于中小矩阵来说,很适合使用这种分块乘法,但是对于大矩阵来说,递归的次数较多,如果能减少每次分块乘法的次数,那么性能将可以得到很好的提高。Strassen矩阵乘法就是采用了一个简单的运算技巧,将上面的8次矩阵相乘变成了7次乘法,看别小看这减少的1次乘法,因为每递归1次,性能就提高了1/8,比如对于1024*1024的矩阵,第1次先分解成7次512*512的矩阵相乘,对于512*512的矩阵,
阅读全文
摘要:BillBoard技术(广告版)详解!(转)今天项目里突然要用到广告版技术。闲来就去摆渡搜索一下,发现这一方面的介绍很少,所以才有了今天这篇文章,也是为了服务于新手,更为了锻炼一下自己,现在把BillBoard技术详细的介绍一下。废话不说,下面进入正题!一:定义广告版矩形顶点结构和顶点格式,具体代码如下:struct customvertrx{ float x,y,z;//顶点位置float u ,v;//定义顶点纹理坐标};#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_TEX1)二:创建广告版矩形和纹理对象。//以下为创建你需要做广告版的顶..
阅读全文
摘要:#include "resource.h"LRESULT CALLBACK About(HWND, UINT, WPARAM, LPARAM);int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){ MSG msg; // 创建主对话框,用CreateDialog创建的是...
阅读全文