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;
}
转载于:https://www.cnblogs.com/zsb517/p/3384373.html
DirectX 基础学习系列5 纹理映射相关推荐
- MYSQL高效基础学习系列1
MYSQL高效基础学习系列1 目录 数据库基本概念 操作库,表和记录 数据类型 为字段指定的约束条件 目录 数据库基本概念 1.数据库服务器:运行数据库管理软件的计算机 2.数据库管理软件:mysql ...
- Python零基础学习系列之三--Python编辑器选择
上一篇文章记录了怎么安装Python环境,同时也成功的在电脑上安装好了Python环境,可以正式开始自己的编程之旅了.但是现在又有头疼的事情,该用什么来写Python程序呢,该用什么来执行Python ...
- python系列教程_python基础学习系列教程2-进阶之路中绕不开的知识点。
本文是在上一篇的基础上编写的,若要查看见:雨滴测试:python基础系列教程1-可能是你见过的最通俗易懂的教程zhuanlan.zhihu.com 五. python函数 所谓的函数,就是具有特定功 ...
- Java基础学习系列--(二)【抽象类,接口、代码块、final、单例、枚举】
第一章 抽象类 1.1 概述 1.1.1 抽象类引入 父类中的方法,被它的子类们重写,子类各自的实现都不尽相同.那么父类的方法声明和方法主体,只有声明还有意义,而方法主体则没有存在的意义了(因为子类对 ...
- Java基础学习系列--(七)彻底搞懂java中的【异常、线程】的使用
第一章 异常 1.1 异常概念 异常,就是不正常的意思.在生活中:医生说,你的身体某个部位有异常,该部位和正常相比有点不同,该部位的功能将受影响.在程序中的意思就是: 异常 :指的是程序在执行过程中, ...
- Java基础学习系列--(五)【迭代器,数据结构,List,Set ,TreeSet集合,Collections工具类】
第一章 Iterator迭代器 1.1 Iterator接口 在程序开发中,经常需要遍历集合中的所有元素.针对这种需求,JDK专门提供了一个接口java.util.Iterator. 想要遍历Coll ...
- Linux运维系统工程师与java基础学习系列-6
Java天生骄傲系列-6 程序流程控制(续) 循环结构 代表语句:while, do while, for While语句格式: while(条件表达式) { 执行语句: } 牛刀小试: packag ...
- Linux运维系统工程师与java基础学习系列-1
Java天生骄傲系列-1 1 Eclipse的使用(略): 2 在eclipse下Java程序的编写和运行,及Java运行环境的配置略: 3 快捷键的配置,常用快捷键(略): 注:当程序有错误 ...
- 网络基础学习系列三http
目录 应用层 协议 实现一个计算器 1无序列化和反序列化的计算器 Protocol.hpp Sock.hpp Makefile CalServer.cc CalClient.cc 2.含序列化和反序列 ...
最新文章
- Could not find destination factory for transport解决方法
- 想成功创业:要掌握“三笔钱”和“六三一”原则
- 融合CDN,纾解数据拥塞之困
- P1081-开车旅行【倍增,链表,dp】
- MyBatis教程看这一篇就够啦,简单又全面(IDEA版)
- [转] 各船公司认识
- 视频文件损坏怎么修复
- python的拼音_python 中文分词和拼音首字母
- 智能手机照片被误删如何恢复
- oracle中删除表的四种基本操作 2021-11-03
- 新手如何零基础操作让亚马逊无货源店铺如何单月3-5万
- tl-wdr5620虚拟服务器设置,TP-Link TL-WDR5620路由器怎么设置
- Linux:安装ruby
- KEIL工程中汇编文件添加条件编译宏
- 33个机器学习常用数据集
- DEBUG命令大全及实例(有改动)
- vue 获取当前路由的title_使用vue-router为每个路由配置各自的title
- soundex mysql,如何使用Doctrine和Symfony 3实现Soundex搜索(在MySql中)
- 华为设备配置WLAN
- 教你十行代码获取福布斯排行榜前350的富豪
热门文章
- Java深入 - servlet和Spring的DispatcherServlet详解
- ASP.Net服务端基本控件介绍
- Python学习总结之四 -- 这就是Python的字典
- 【转】Burp Suite详细使用教程-Intruder模块详解
- 从SQL过渡至MongoDB查询对照表
- 微软发布了Visual Stduio 2010 RTM版本的虚拟机vhd文件,包含样例和动手实验(免费)...
- 可以从应用服务器上传或者下载文件的T-code
- HDOJ1028-Ignatius and the Princess III(整数划分)
- 老师说过链表是分水岭,至少得会这些题目
- mysql bin值总是变化_MySQL|update字段为相同的值是否会记录binlog