DirectX 基础学习系列5 纹理映射
2013-10-23 16:04
489 查看
1纹理坐标
类似BMP图像坐标系,左上为原点
纹理坐标为了规范化,范围限定在[0,1]之间,使用纹理的时候,需要修改顶点结构
structColorVetex
{
floatx,y,z;
float_nx,_ny,_nz;
float_u,_y;
staticconstDWORDFVF;
}
constDWORDColorVetex::FVF=D3DFVF_XYZ|D3DFVF_NORMAL|D3DFVF_TEX1;
2创建并启用纹理
从文件中加载纹理数据
HRESULTD3DXCreateTextureFromFile( LPDIRECT3DDEVICE9pDevice, LPCTSTRpSrcFile, LPDIRECT3DTEXTURE9*ppTexture );
从内存中加载
HRESULTD3DXCreateTextureFromFileInMemory( LPDIRECT3DDEVICE9pDevice,LPCVOID pSrcData,UINTSrcDataSize, LPDIRECT3DTEXTURE9*ppTexture);
从资源加载
HRESULTD3DXCreateTextureFromResource( LPDIRECT3DDEVICE9pDevice, HMODULEhSrcModule, LPCTSTRpSrcResource, LPDIRECT3DTEXTURE9*ppTexture);
设置问题。,DX最多可以设置8层纹理,从而组合得到更细致的图片
SetTexture(0,&_stonewall);
禁用纹理
SetTexture(0,0);
3纹理过滤器
纹理三角形和屏幕三角形大小不适合的时候,通过这项技术,让二者适应
DX提供三种纹理过滤器:
最近点采样:默认情况,速度快,效果差
setsamplerstate(0,D3DSAMP_MAGFILTER,D3DTEXT_POINT);
setsamplerstate(0,D3DSAMP_MINFILTER,D3DTEXT_POINT);
线性纹理过滤器:线性插值,可以分为放大和缩小
SetSamplerState(0,D3DSAMP_MAGFILTER,D3DTEXT_LINEAR);
SetSamplerState(0,D3DSAMP_MINFILTER,D3DTEXT_LINEAR);
各向异性纹理过滤器:多线条采样技术,
setsamplerstate(0,D3DSAMP_MAGFILTER,D3DTEXT_ANISOTROPIC);
setsamplerstate(0,D3DSAMP_MINFILTER,D3DTEXT_ANISOTROPIC);
使用anisotropicfilter时,需要对D3DSAMP_MAXANISOTROPIC水平进行设置
4多级渐进纹理
消除纹理和三角尺寸不一致的问题,创建多级渐进纹理,
多级渐进纹理过滤器:
Device->SetSamplerState(0,D3D_MIPFILTER,flag);
flag:D3DTEXT_NONE:不适用
D3DTEXF_POINT选族最近接的一级纹理,选择后使用指定的纹理过滤器进行处理 D3DTEXF_LINEAR选择最近的两极纹理,用指定纹理过滤器过滤后,再对两极纹理进行线性融合
使用多级渐进纹理之后DX会自动选用合适的尺寸纹理
5寻址模式:处理纹理坐标超过[0,1]范围的问题
有四种扩展模式:
重复寻址模式
Device->SetSamplerState(0,D3DSAMP_ADDRESSU,D3DTADDRESS_WRAP);
Device->SetSamplerState(0,D3DSAMP_ADDRESSV,D3DTADDRESS_WRAP);
边界颜色模式
Device->SetSamplerState(0,D3DSAMP_ADDRESSU,D3DTADDRESS_BORDER);
Device->SetSamplerState(0,D3DSAMP_ADDRESSV,D3DTADDRESS_BORDER);
Device->SetSamplerState(0,D3DSAMP_BORDERCOLOR,0x000000FF);
嵌位寻址模式
Device->SetSamplerState(0,D3DSAMP_ADDRESSU,D3DTADDRESS_CLAMP);
Device->SetSamplerState(0,D3DSAMP_ADDRESSV,D3DTADDRESS_CLAMP);
镜像寻址模式
Device->SetSamplerState(0,D3DSAMP_ADDRESSU,D3DTADDRESS_MIRROR);
Device->SetSamplerState(0,D3DSAMP_ADDRESSV,D3DTADDRESS_MIRROR);
6纹理映射的过程
(1)构建具有纹理坐标的顶点
(2)读取纹理数据
(3)设置缩小放大过滤器,多级渐进纹理过滤器
(4)将纹理与物体关
下列代码为《directx9.0c游戏开发基础教程》第六章的代码:配合光源纹理,物理的旋转采用更改观察者视角 [code=alt]#include"d3dUtility.h"[/code]#include"cube.h"
#include"vertex.h"
//
//Globals
//
IDirect3DDevice9*Device=0;
constintWidth=640;
constintHeight=480;
Cube*Box=0;
IDirect3DTexture9*Tex=0;
//
//FrameworkFunctions
//
boolSetup()
{
//
//Createthecube.
//
Box=newCube(Device);
//
//Setadirectionallight.
//
D3DLIGHT9light;
::ZeroMemory(&light,sizeof(light));
light.Type=D3DLIGHT_DIRECTIONAL;
light.Ambient=D3DXCOLOR(0.1f,0.8f,0.8f,1.0f);
light.Diffuse=D3DXCOLOR(0.9f,1.0f,1.0f,1.0f);
light.Specular=D3DXCOLOR(0.0f,0.2f,1.0f,1.0f);
light.Direction=D3DXVECTOR3(1.0f,0.0f,0.0f);
Device->SetLight(0,&light);
Device->LightEnable(0,true);
Device->SetRenderState(D3DRS_NORMALIZENORMALS,true);
Device->SetRenderState(D3DRS_SPECULARENABLE,true);
//
//Createtexture.
//
D3DXCreateTextureFromFile(
Device,
"crate.jpg",
&Tex);
//
//SetTextureFilterStates.
//
Device->SetSamplerState(0,D3DSAMP_MAGFILTER,D3DTEXF_LINEAR);
Device->SetSamplerState(0,D3DSAMP_MINFILTER,D3DTEXF_LINEAR);
Device->SetSamplerState(0,D3DSAMP_MIPFILTER,D3DTEXF_LINEAR);
//
//Settheprojectionmatrix.
//
D3DXMATRIXproj;
D3DXMatrixPerspectiveFovLH(
&proj,
D3DX_PI*0.5f,//90-degree
(float)Width/(float)Height,
1.0f,
1000.0f);
Device->SetTransform(D3DTS_PROJECTION,&proj);
returntrue;
}
voidCleanup()
{
d3d::Delete<Cube*>(Box);
d3d::Release<IDirect3DTexture9*>(Tex);
}
boolDisplay(floattimeDelta)
{
if(Device)
{
//
//Updatethescene:updatecameraposition.
//
staticfloatangle=(3.0f*D3DX_PI)/2.0f;
staticfloatheight=2.0f;
if(::GetAsyncKeyState(VK_LEFT)&0x8000f)
angle-=0.5f*timeDelta;
if(::GetAsyncKeyState(VK_RIGHT)&0x8000f)
angle+=0.5f*timeDelta;
if(::GetAsyncKeyState(VK_UP)&0x8000f)
height+=5.0f*timeDelta;
if(::GetAsyncKeyState(VK_DOWN)&0x8000f)
height-=5.0f*timeDelta;
D3DXVECTOR3position(cosf(angle)*3.0f,height,sinf(angle)*3.0f);
D3DXVECTOR3target(0.0f,0.0f,0.0f);
D3DXVECTOR3up(0.0f,1.0f,0.0f);
D3DXMATRIXV;
D3DXMatrixLookAtLH(&V,&position,&target,&up);
Device->SetTransform(D3DTS_VIEW,&V);
//
//Drawthescene:
//
Device->Clear(0,0,D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,0xffffffff,1.0f,0);
Device->BeginScene();
Device->SetMaterial(&d3d::RED_MTRL);
Device->SetTexture(0,Tex);
Box->draw(0,0,0);
Device->EndScene();
Device->Present(0,0,0,0);
}
returntrue;
}
//
//WndProc
//
LRESULTCALLBACKd3d::WndProc(HWNDhwnd,UINTmsg,WPARAMwParam,LPARAMlParam)
{
switch(msg)
{
caseWM_DESTROY:
::PostQuitMessage(0);
break;
caseWM_KEYDOWN:
if(wParam==VK_ESCAPE)
::DestroyWindow(hwnd);
break;
}
return::DefWindowProc(hwnd,msg,wParam,lParam);
}
//
//WinMain
//
intWINAPIWinMain(HINSTANCEhinstance,
HINSTANCEprevInstance,
PSTRcmdLine,
intshowCmd)
{
if(!d3d::InitD3D(hinstance,
Width,Height,true,D3DDEVTYPE_HAL,&Device))
{
::MessageBox(0,"InitD3D()-FAILED",0,0);
return0;
}
if(!Setup())
{
::MessageBox(0,"Setup()-FAILED",0,0);
return0;
}
d3d::EnterMsgLoop(Display);
Cleanup();
Device->Release();
return0;
}.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}
[/code]
相关文章推荐
- DirectX基础学习系列5 融合技术
- DirectX基础学习系列4 颜色和光照
- UnityShader入门精要学习笔记(八):基础纹理之凹凸映射
- DirectX基础学习系列1
- directX基础学习系列7 网格(自己创建)
- directX基础学习系列7 网格(自己创建)
- DirectX基础学习系列8 渐进网格以及外接体
- DirectX 3D_基础之光照 材质 顶点法线 光源 纹理映射 纹理坐标 多级纹理 纹理过滤
- DirectX 基础学习系列6 字体
- DirectX 3D_基础之地形绘制基础 高度图 创建高度图 加载RAW文件 访问和修改高度图 创建地形的几何信息(顶点计算,索引计算,纹理映射,光照,着色,地形中行走)
- 基础学习二(纹理映射)
- Python学习系列(一)(基础入门)
- Mybatis基础学习(三)—映射文件
- C#基础学习系列之:反射
- 【Maven学习笔记系列】一些基础mvn命令输入后到底做了什么?
- Direct3D学习手记五:纹理映射
- 深度学习与计算机视觉系列(1)_基础介绍
- 6.OpenGL学习之多个纹理映射
- 从零开始学习OpenGL ES之六 – 纹理及纹理映射
- MySql基础数据库管理--学习系列004