Direct-X学习笔记--纹理映射

Direct-X学习笔记--Direct-X的基本知识 一.Direct-X简介 说是Direct-X,其实最主要的还是Direct3D,绘制3D世界的利器。拥有通过HAL(硬件抽象层)直接访问硬件的能力,比GDI/GDI+的效率高得不是一点半点。 开始的时候是想学个游戏引擎的,比如特别火的unity3D,后来一想,还是懂一点底层的东西比较好。于是就选择了D3D。引擎的话应该就是写好的一种框架罢了,还是要基于D3D或者OpenGL等图形AP 阅读详情

一.介绍

之前学习了怎样绘制物体,还画了个DX自带的茶壶,然而这个东东并不怎么好看....离我们现实的物体简直相隔千里。只能说像美术他们用来写生的模型...那么要怎么样才能让我们的东西看起来更像真实的物体呢?这个就要用到今天学习的纹理映射技术了...

纹理映射(Texture Mapping),又称纹理贴图,是将纹理空间中的纹理像素映射到屏幕空间中的像素的过程。简单来说,就是把一幅图像贴到三维物体的表面上来增强真实感,可以和光照计算、图像混合等技术结合起来形成许多非常漂亮的效果。总之,纹理映射就是我们用一幅2D图片贴在3D物体上,让物体表面呈现为2D图片的样子,使物体看起来更加真实。

我们一般把纹理映射所使用的2D图像称作纹理贴图。Direct3D支持多种的纹理贴图,比如有.bmp、.dds、.dib、.png以及.tga等等,为了提高程序使用纹理的效率,通常使用边长为2的N次方幂的正方形图片。

介绍就这么多,开始动手。

二.过程

创建纹理贴图分为四个步骤:定点的定义,定点的访问,纹理的创建,纹理的启用

1.顶点的定义:

在使用定点缓存或者索引缓存绘图的时候,我们定义过定点,不过当时的定点是只包括了坐标和顶点的颜色,在这里,我们就不需要定义定点的颜色了,因为绘制物体的颜色会由纹理的颜色来确定。我们只需要在定义坐标的时候,再添加一个纹理坐标(u,v)即可。

struct stVertex
{
	float _x, _y, _z;		//位置坐标
	float _u, _v;			//纹理坐标

	stVertex(float x, float y, float z, float u, float v) : _x(x), _y(y), _z(z), _u(u), _v(v){}
	stVertex(){}
};
定义灵活顶点的格式:

#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_TEX1)
这样,我们的顶点格式就定义好啦!


2.顶点的访问:

与顶点缓冲绘图一样,定义过定点之后,需要给定点赋值,这次我们赋值坐标之后,还要给纹理坐标赋值:例如:

vertex[0] = stVertex(-10.0f,  10.0f, -10.0f, 0.0f, 0.0f);

当然,其他的步骤与之前一样,也需要锁住缓冲区再操作,然后还要解锁。


3.纹理的创建:

这里就是我们的新内容啦,创建纹理一般使用这么一个函数:D3DXCreateTextureFromFile

有三个参数,第一个为D3D设备接口指针,第二个为纹理图片的路径名,第三个为纹理的指针。

例如:

D3DXCreateTextureFromFile(g_pDevice, TEXT("texture.png"), &g_pTexture);


4.纹理的启用:

创建好了纹理,我们就可以在绘制的时候使用啦,使用纹理很简单,在绘制物体之前,使用SetTexture函数即可:

函数有两个参数,第一个为纹理是哪一层,我们知道,一共可以创建8层纹理,所以这个参数的取值就为0-7啦。第二个就是我们的纹理指针啦。

g_pDevice->SetTexture(0, g_pTexture);


三.例子

下面是一个完整的例子: 我们通过索引缓存绘图,绘制一个立方体:

没有加纹理之前是介个样子滴:

然后我们使用一个砖墙的纹理图片,加上纹理之后效果棒棒哒:



下面是纹理创建的完整的代码:

// D3DDemo.cpp : 定义应用程序的入口点。
//

#include "stdafx.h"
#include "D3DDemo.h"


#define MAX_LOADSTRING 100

// 全局变量:
HINSTANCE hInst;								// 当前实例
TCHAR szTitle[MAX_LOADSTRIN
Direct-X学习笔记--纹理映射进阶 之前学习了纹理映射相关知识,但是仅仅是知道读取一个纹理贴图,然后在绘制之前设置一下纹理,但是并不知道纹理设置的一些具体细节,今天就来填坑啦! 一.四种纹理寻址方式 我们读取一个纹理图片,最好的情况是所需要的图片大小和图片本身的大小一致,但是事实往往不是这么美好。所以当纹理图片的大小和我们所绘制的模型大小不一致时,就需要通过不同的纹理寻址方式来解决这个问题。 通常,我们取的纹理坐标为( 阅读详情

相关推荐

DirectX学习笔记(七):Direct3D纹理映射技术详解及实现

前言:  如果我们想要将一个正方体绘制成一个板条箱的样式,那么我们就需要D3D中的纹理映射技术。纹理是一个像素矩阵,它可以被映射到三角形单元,以此来该变物体的显示样式。这样就可以增加所绘制场景的真实感。 1.纹理坐标:

lishuzhai的专栏 8451

Direct-X学习笔记--地形

地形系统,在游戏中肯定少不了滴。终于要开始学习这个东东啦!地形看起来非常神奇,绵延的山峦,横看成岭侧成峰,远近高低各不同,这么复杂的地形到底我们到底要怎么写呢?说实话不学这个之前我真的完全想不到地形的实现方法。 一.简介 三维地形系统在很多地方都有应用,不论是游戏还是模拟系统中,地形都是必不可少的元素之一。说到地图,我们最容易想到的就是一个二维数组,根据数组元素的不同,绘制出不同的图形

puppet_master的专栏 2291

Snort源代码编译 _ 采坑之旅(for Windows VS2015)

    系统环境:Windows7 sp1 x64     编译环境:VS2015 SP1     Snort版本:2.9.12     daq版本:2.0.6     Snort官网:https://www.snort.org/downloads#snort-downloads 背景     最近需要实现一个类似网络防火墙的产品,主要参考Snort源码,先花了点时间简单读了下网上比较流行的《...

magictong的专栏 8888

《Hadoop大数据技术原理与应用》(第2版)黑马程序员的课后习题答案

《Hadoop大数据技术原理与应用》(第2版)黑马程序员的课后习题答案

qq_36773158的博客 4646

字符串相似度比较算法:Jaro–Winkler similarity的原理及实现

前言 在前面的文章中,笔者有对编辑距离以及Levenshtein距离进行详细的说明,其实levenshtein距离是编辑距离的其中一种定义,本文所说的Jaro距离是编辑距离的另外一种定义,它也是对两个字符串的相似度进行衡量,以得出两字符串的相似程度。下面我们一起来学习这个算法的原理以及实现吧。 标题算法定义 下面先说说Jaro distance(又称Jaro similarity),这是由Matt...

蓝天白云梦的csdn博客 1万+

34、实数域上高效负循环卷积算法解析

本文介绍了一种高效的实数域负循环卷积算法,通过引入离散傅里叶负循环变换(DFNT)避免传统方法的冗余,显著提升计算效率。文章详细分析了算法原理、误差传播机制,并推导出误差与方差界,提出无误差和基于3σ规则的参数设置方案。结合Cooley-Tukey与Gentleman-Sande FFT路径优化,实验验证了算法在不同精度和多项式长度下的性能优势与结果正确性,为密码学与信号处理等领域提供了高精度、高性能的卷积计算解决方案。

salt的博客 114

【异常】OpenClaw LLM请求超时异常LLM request timed out.的技术分析与解决方案

LLM请求超时是OpenClaw工程化落地中最常见的链路稳定性问题,排查处置需遵循标准化的分级流程。绝大多数场景可通过重试、调整超时配置、优化模型选型快速解决;针对顽固型异常,可通过全链路日志拆解超时阶段,精准定位根因并完成针对性修复,最终保障OpenClaw业务链路的稳定运行。

奶爸的编程之路,也就一周冷个三天 1984

科研绘图系列:R语言绘制世界地图数据分布(world map)

科研绘图系列:R语言绘制世界地图数据分布(world map)

专注生信领域 527

卫星轨道坐标转换:轨道六根数到经纬高(经STK验证)

a:半长轴(km)e:偏心率i:轨道倾角(度)Ω:升交点赤经(度)ω:近地点幅角(度)ν:真近点角(度)

weixin_52370774的博客 169

Jetson Thor平台JP7.0版本96712 GMSL相机驱动调试记录

摘要:本文档记录了在Thor Custom Board (JP7.0GA)上配置GMSL摄像头时遇到的视频流问题及调试过程。问题表现为视频设备(/dev/video11)能正常创建,但获取视频时出现"Internal data stream error",而相同配置在AGX Orin JP6.0上运行正常。通过梳理硬件拓扑、v4l2-ctl测试、提升时钟频率及分析内核日志,发现VI引擎未接收到帧数据包。调试步骤包括检查设备树冲突、调整I2C总线配置、修正通道名称,最终通过屏蔽传感器启动时

jzwjzw19900922的博客 1109

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

上一篇: 阅读一款3D引擎的方法备忘
下一篇: Direct-X学习笔记--X模型导入
puppet_master
puppet_master 领域专家: C/C++技术领域 领域专家: C/C++技术领域
博客等级 码龄12年 2695粉丝 161原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值