栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 游戏开发 > 其他

MFC实现三维图形绘制(6)纹理实现

其他 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

MFC实现三维图形绘制(6)纹理实现

将图片贴到物体上,可以通过颜色映射来实现,即将纹理的颜色作为材质的漫反射光反射率和环境光反射率。

material->SetDiffuse(tf.c);//用纹理颜色作为材质的漫反射光反射率
material->SetAmbient(tf.c);//用纹理颜色作为材质的环境光反射率

为了使物体大小与纹理大小像贴合,用CT2类保存面上各顶点相对于纹理图像的坐标,在绘图时通过线性插值的方式实现一一对应。

#include"RGB.h"
class CT2  
{
public:
	CT2(void);
	virtual ~CT2(void);
	CT2(double,double);
	friend CT2 operator +(const CT2 &,const CT2 &);//运算符重载
	friend CT2 operator -(const CT2 &,const CT2 &);
	friend CT2 operator *(const CT2 &,double);
	friend CT2 operator *(double,const CT2 &);
	friend CT2 operator /(const CT2 &,double);
	friend CT2 operator+=(CT2 &,CT2 &);
	friend CT2 operator-=(CT2 &,CT2 &);
	friend CT2 operator*=(CT2 &,double);
	friend CT2 operator/=(CT2 &,double);
public:
	double u;
	double v;
	CRGB c;
};
CT2 CFill::Interpolation(double m, double m0, double m1, CT2 T0, CT2 T1)//纹理地址线性插值
{
	CT2 Texture;
	Texture = (m1 - m) / (m1 - m0) * T0 + (m - m0) / (m1 - m0) * T1;
	return Texture;
}

创建CTexture类保存纹理图像 

class CTexture
{
public:
	CTexture(void);
	virtual~CTexture(void);
	void GetImage(UINT nIDResource);//准备位图
	void DeleteObject(void);//释放位图
public:
	BYTE* image;
	BITMAP bmp;//BITMAP结构体变量
};

#include "Texture.h"

CTexture::CTexture(void)
{
	image = NULL;
}

CTexture::~CTexture(void)
{

}

void CTexture::GetImage(UINT nIDResource)//准备位图
{
	CBitmap NewBitmap;
	NewBitmap.LoadBitmap(nIDResource);
	NewBitmap.GetBitmap(&bmp);//将CBitmap的信息保存到Bitmap结构体中
	int nbytesize = bmp.bmWidthBytes*bmp.bmHeight;
	image = new BYTE[nbytesize];
	NewBitmap.GetBitmapBits(nbytesize, (LPVOID)image);
}


void CTexture::DeleteObject(void)//释放位图
{
	if(NULL != image)
		delete []image;
}

若要实现纹理的凹凸,则加入凹凸算法:

CRGB frontU = GetTextureColor(ROUND(tf.u - 1), ROUND(tf.v), pTexture);
CRGB backU = GetTextureColor(ROUND(tf.u + 1), ROUND(tf.v), pTexture);
double Bu = (frontU.blue - backU.blue) / 2;
CRGB frontV = GetTextureColor(ROUND(tf.u), ROUND(tf.v - 1), pTexture);
CRGB backV = GetTextureColor(ROUND(tf.u), ROUND(tf.v + 1), pTexture);
double Bv = (frontV.blue - backV.blue) / 2;
CVector3 DNormal = CVector3(Bu, Bv, 0);
double BumpScale = 100.0;
vf = vf + BumpScale * DNormal;
vf = vf.Normalize();

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/901650.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号