D3DXVec3TransformArray 函数

D3DXVec3TransformArray 函数


用矩阵变换向量 (x, y, z, 1)数组。

定义:

D3DXVECTOR4 *WINAPI D3DXVec3TransformArray(      

    D3DXVECTOR4 *pOut,

    UINT OutStride,

    CONST D3DXVECTOR3* pV,

    UINT VStride,

    CONST D3DXMATRIX* pM,

    UINT n

);

参数:

pOut

[in, out] 指向 D3DXVECTOR4 结构的操作结果。

OutStride

[in] 输出数组中每个元素的大小。

pV

[in] 指向 D3DXVECTOR3 结构的源向量数组。

VStride

[in] 输入数组中每个元素的大小。

pM

[in] 指向 D3DXMATRIX 结构的变换矩阵。

n

[in] 在向量数组里有多少个元素。

返回值:

指向 D3DXVECTOR4 结构的变换后向量数组。

 

说明:

这个函数用矩阵pM来变换向量pV (x, y, z, 1)数组。

函数返回值跟pOut 参数返回值是一样的。这样可以让函数D3DXVec3TransformArray作为其它函数的参数使用。

函数信息:

Header

d3dx9math.h

Import library

d3dx9.lib

Minimum operating systems

Windows 98



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Gouraud明暗处理是一种基于顶点的着色技术,它通过对三角形顶点的颜色进行插值,来实现对三角形内部像素的着色。下面是使用MFC实现Gouraud明暗处理的示例代码: 1. 定义顶点结构体 ```cpp struct Vertex { float x, y, z; // 顶点坐标 float nx, ny, nz; // 顶点法向量 COLORREF color; // 顶点颜色 }; ``` 2. 定义三角形结构体 ```cpp struct Triangle { Vertex v1, v2, v3; // 三角形的三个顶点 }; ``` 3. 实现Gouraud明暗处理函数 ```cpp void GouraudShading(CDC* pDC, Triangle triangle) { // 计算三角形三个顶点的颜色 COLORREF c1 = triangle.v1.color; COLORREF c2 = triangle.v2.color; COLORREF c3 = triangle.v3.color; // 计算三角形三个顶点的法向量 D3DXVECTOR3 n1(triangle.v1.nx, triangle.v1.ny, triangle.v1.nz); D3DXVECTOR3 n2(triangle.v2.nx, triangle.v2.ny, triangle.v2.nz); D3DXVECTOR3 n3(triangle.v3.nx, triangle.v3.ny, triangle.v3.nz); // 计算三角形三个顶点的屏幕坐标 CPoint p1(triangle.v1.x, triangle.v1.y); CPoint p2(triangle.v2.x, triangle.v2.y); CPoint p3(triangle.v3.x, triangle.v3.y); // 计算三角形三个顶点到对应边界的向量 D3DXVECTOR2 v1(p2.x - p1.x, p2.y - p1.y); D3DXVECTOR2 v2(p3.x - p1.x, p3.y - p1.y); D3DXVECTOR2 v3(p3.x - p2.x, p3.y - p2.y); // 计算三角形的面积 float area = v1.x * v2.y - v2.x * v1.y; // 计算三角形每个像素的颜色 for (int y = min(p1.y, min(p2.y, p3.y)); y <= max(p1.y, max(p2.y, p3.y)); y++) { for (int x = min(p1.x, min(p2.x, p3.x)); x <= max(p1.x, max(p2.x, p3.x)); x++) { CPoint p(x, y); D3DXVECTOR2 vp(p.x - p1.x, p.y - p1.y); // 判断像素是否在三角形内部 float t1 = (vp.x * v2.y - vp.y * v2.x) / area; if (t1 < 0 || t1 > 1) continue; float t2 = (v1.x * vp.y - v1.y * vp.x) / area; if (t2 < 0 || t2 > 1) continue; float t3 = 1 - t1 - t2; if (t3 < 0 || t3 > 1) continue; // 计算像素的颜色 D3DXVECTOR3 n = t1 * n1 + t2 * n2 + t3 * n3; COLORREF c = RGB(t1 * GetRValue(c1) + t2 * GetRValue(c2) + t3 * GetRValue(c3), t1 * GetGValue(c1) + t2 * GetGValue(c2) + t3 * GetGValue(c3), t1 * GetBValue(c1) + t2 * GetBValue(c2) + t3 * GetBValue(c3)); float intensity = max(0.0f, D3DXVec3Dot(&n, &D3DXVECTOR3(0, 0, 1))); c = RGB(intensity * GetRValue(c), intensity * GetGValue(c), intensity * GetBValue(c)); // 绘制像素 pDC->SetPixel(x, y, c); } } } ``` 4. 调用Gouraud明暗处理函数 ```cpp Triangle triangle = { {100, 100, 0, 0, 0, 1, RGB(255, 0, 0)}, // v1 {200, 100, 0, 0, 0, 1, RGB(0, 255, 0)}, // v2 {150, 200, 0, 0, 0, 1, RGB(0, 0, 255)} // v3 }; GouraudShading(pDC, triangle); ``` 上面的代码演示了如何使用MFC实现Gouraud明暗处理,其中主要的计算部分使用了Direct3D的向量库D3DX,通过计算颜色插值和法向量插值,实现了对三角形内部像素的插值处理,并根据像素的法向量计算出明暗度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

caimouse

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值