DirectX 基础学习系列5 纹理映射
1 纹理坐标
类似BMP图像坐标系,左上为原点
纹理坐标为了规范化,范围限定在[0,1]之间,使用纹理的时候,需要修改顶点结构
struct ColorVetex
{
float x, y,z;
float _nx,_ny,_nz ;
float _u,_y ;
static const DWORD FVF;
}
const DWORD ColorVetex::FVF = D3DFVF_XYZ | D3DFVF_NORMAL|D3DFVF_TEX1;
2创建并启用纹理
从文件中加载纹理数据
HRESULT D3DXCreateTextureFromFile(
LPDIRECT3DDEVICE9 pDevice,
LPCTSTR pSrcFile,
LPDIRECT3DTEXTURE9 * ppTexture
);从内存中加载
HRESULT D3DXCreateTextureFromFileInMemory(
LPDIRECT3DDEVICE9 pDevice, LPCVOID
pSrcData, UINT SrcDataSize,
LPDIRECT3DTEXTURE9 * ppTexture);从资源加载
HRESULT D3DXCreateTextureFromResource(
LPDIRECT3DDEVICE9 pDevice,
HMODULE hSrcModule,
LPCTSTR pSrcResource,
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);
使用anisotropic filter时,需要对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游戏开发基础教程》第六章的代码:配合光源 纹理 ,物理的旋转采用更改观察者视角#include "d3dUtility.h"#include "cube.h"#include "vertex.h"//// Globals//IDirect3DDevice9* Device = 0;const int Width = 640;const int Height = 480;Cube* Box = 0;IDirect3DTexture9* Tex = 0;//// Framework Functions//bool Setup(){//// Create the cube.//Box = new Cube(Device);//// Set a directional light.//D3DLIGHT9 light;::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);//// Create texture.//D3DXCreateTextureFromFile(Device,"crate.jpg",&Tex);//// Set Texture Filter States.//Device->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);Device->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);Device->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR);//// Set the projection matrix.//D3DXMATRIX proj;D3DXMatrixPerspectiveFovLH(&proj,D3DX_PI * 0.5f, // 90 - degree(float)Width / (float)Height,1.0f,1000.0f);Device->SetTransform(D3DTS_PROJECTION, &proj);return true;}void Cleanup(){d3d::Delete<Cube*>(Box);d3d::Release<IDirect3DTexture9*>(Tex);}bool Display(float timeDelta){if( Device ){//// Update the scene: update camera position.//static float angle = (3.0f * D3DX_PI) / 2.0f;static float height = 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;D3DXVECTOR3 position( cosf(angle) * 3.0f, height, sinf(angle) * 3.0f );D3DXVECTOR3 target(0.0f, 0.0f, 0.0f);D3DXVECTOR3 up(0.0f, 1.0f, 0.0f);D3DXMATRIX V;D3DXMatrixLookAtLH(&V, &position, &target, &up);Device->SetTransform(D3DTS_VIEW, &V);//// Draw the scene://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);}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;}.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { 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; }
DirectX 基础学习系列5 纹理映射的更多相关文章
- DirectX基础学习系列1
1.3 基础 1.3.1表面 表面接口: IDirect3DSurface9 获得表面信息:GetDesc(D3DSURFACE_DESC) 获得表面接口指针 :LockRect( D3DLO ...
- DirectX基础学习系列8 渐进网格以及外接体
1 IUnknown--> ID3DXBUFFER D3D泛型接口: GetBufferPointer Retrieves a pointer to the data in the buffer ...
- directX基础学习系列7 网格(自己创建)
D3DXMesh 以及 D3DXPMesh都是从ID3DXBaseMesh类中集成,mesh基本是对三角单元进行操作 ID3DXBaseMesh主要函数: HRESULT DrawSubset( DW ...
- DirectX 基础学习系列6 字体
DIRECTX9自带ID3DXFONT类 内部调用GDI的接口,效率一般,但能够处理一些复杂的字体 HRESULT D3DXCreateFontIndirect( LPDIRECT3DDEVICE9 ...
- DirectX基础学习系列5 融合技术
7.1融合方程 1概念 融合技术将当前光栅化像素的颜色与以前已光栅化并处于同一个位置的像素颜色进行合成,即将当前要进行光栅化的三角形单元与已写入后台的像素进行融合 2需要遵循的原则: (1)先绘制不需 ...
- DirectX基础学习系列4 颜色和光照
4.1颜色表示 RGB颜色:D3DCOLOR 可以用宏D3DCOLOR_ARGB(a,r,g,b) D3DCOLOR_XRGB(255,r,g,b) 另外一种浮点表示:D3DCOLORVALUE, ...
- DirectX基础学习系列2
补充第一章矩阵内容 向量 1 3D空间向量,包含浮点数类型坐标 D3DXVECTOR-->D3DXVECTOR3 2向量的长度 D3DXVector3Length(const D3DXVECTO ...
- Linux基础学习系列目录导航
Linux基础学习-通过VM安装RHEL7.4 Linux基础学习-命令行与图形界面切换 Linux基础学习-基本命令 Linux基础学习-RHEL7.4之YUM更换CentOS源 Linux基础学习 ...
- Bootstrap基础学习 ---- 系列文章
[Bootstrap基础学习]05 Bootstrap学习总结 [Bootstrap基础学习]04 Bootstrap的HTML和CSS编码规范 [Bootstrap基础学习]03 Bootstrap ...
随机推荐
- C#学习笔记-----基于AppDomain的"插件式"开发
很多时候,我们都想使用(开发)USB式(热插拔)的应用,例如,开发一个WinForm应用,并且这个WinForm应用能允许开发人员定制扩展插件,又例如,我们可能维护着一个WinService管理系统, ...
- 微信api退款操作
状况:证书加载进去,本地调试退款成功,然而发不到iis上却是不成功. 分析:定然是iis配置问题. 问题一:证书加载不进去,出现“内部错误” 解决:在iis中找到对应的应用连接池,右键高级设置,找到“ ...
- HDU 4362 Dragon Ball 贪心DP
Dragon Ball Problem Description Sean has got a Treasure map which shows when and where the dragon ...
- Scala中的Implicit(隐式转换,隐式参数,隐式类)
文章来自:http://www.cnblogs.com/hark0623/p/4196452.html 转发请注明 代码如下: /** * 隐式转换 隐式参数 隐式类 */ //隐式转换 class ...
- Wireshark分析器分析数据流过程
Wireshark分析器分析数据流过程 分析包是Wireshark最强大的功能之一.分析数据流过程就是将数据转换为可以理解的请求.应答.拒绝和重发等.帧包括了从捕获引擎或监听库到核心引擎的信息.Wir ...
- mysql之对视图的操作
1. 为什么要使用视图? 为了提高复杂SQL语句的复用性和表操作的安全性,MySQL数据库管理系统提供了视图特性.所谓视图,本质上是一种虚拟表,在物理上是不存在的,其内容与真实的表相似,包含一系列带有 ...
- 状压DP POJ 2411 Mondriaan'sDream
题目传送门 /* 题意:一个h*w的矩阵(1<=h,w<=11),只能放1*2的模块,问完全覆盖的不同放发有多少种? 状态压缩DP第一道:dp[i][j] 代表第i行的j状态下的种数(状态 ...
- BZOJ3784 : 树上的路径
树的点分治,在分治的时候将所有点到根的距离依次放入一个数组q中. 对于一棵子树里的点,合法的路径一定是q[L]..q[R]的某个数加上自己到重心的距离. 定义五元组(v,l,m,r,w),表示当前路径 ...
- BZOJ4320 : ShangHai2006 Homework
取$M=\sqrt{300000}$. 设$g[i]$表示程序员的$\bmod i$最小的值. 若$Y<M$,那么可以在$O(M)$时间内完成对所有$g[i]$的修改,$O(1)$时间内完成查询 ...
- Vijos 1180 (树形DP+背包)
题目链接: https://vijos.org/p/1180 题目大意:选课.只有根课选了才能选子课,给定选课数m, 问最大学分多少. 解题思路: 树形背包.cost=1. 且有个虚根0,取这个虚根也 ...