C++ DirectX 9固定函数纹理

C++ DirectX 9固定函数纹理,c++,graphics,directx-9,C++,Graphics,Directx 9,使用DirectX 9中的固定函数渲染管道,通过执行以下操作可以非常轻松地设置纹理和渲染顶点: struct vert { float x, y, z, u, v; }; device->SetFVF(D3DFVF_XYZ | D3DFVF_TEX1); device->SetTexture(0, MyTexture); //Draw vertices here 但是,我想给每个顶点添加一个额外的浮点值,然后乘以纹理产生的颜色输出。(因此该值将介于0和1之间) 例如(伪代码)c

使用DirectX 9中的固定函数渲染管道,通过执行以下操作可以非常轻松地设置纹理和渲染顶点:

struct vert { float x, y, z, u, v; };

device->SetFVF(D3DFVF_XYZ | D3DFVF_TEX1);
device->SetTexture(0, MyTexture);

//Draw vertices here
但是,我想给每个顶点添加一个额外的浮点值,然后乘以纹理产生的颜色输出。(因此该值将介于0和1之间)

例如(伪代码)
color=TextureColour(u,v)*自定义浮点


我认为有一种方法可以使用
device->settexturestate
,但我不确定如何做到这一点。。。有人能帮我吗?

这有望让你开始:

您需要像这样使用FVF:

D3DFVF_XYZ|D3DFVF_TEX1|D3DFVF_DIFFUSE
以及通过以下方式启用使用顶点颜色:

m_pDevice9->SetRenderState(D3DRS_COLORVERTEX, TRUE);

m_pDevice9->SetRenderState(D3DRS_DIFFUSEMATERIALSOURCE, D3DMCS_COLOR1);

这将显示有关如何设置纹理组合器的更多详细信息。该示例使用alpha combine,但将其修改为使用颜色组合器应该很简单。

您可以将1D线性灰度纹理设置为第二个纹理,配置为调制第一个纹理。然后为第二个纹理发送一个纹理坐标(我想是通过为它指定D3DFVF_TEXCOORDSIZE1)。在这里投机--我自己也没试过

解释你的伪代码:
color=texture0color(u0,v0)*texture1color(u1)

编辑我认为您需要:

device->SetFVF(D3DFVF_XYZ | D3DFVF_TEX2 | D3DFVF_TEXCOORDSIZE2(0) | D3DFVF_TEXCOORDSIZE1(1)) 

MSDN也有。

与密切相关-虽然不完全是重复的,但它的答案也会回答这个问题。谢谢,底部链接很有帮助,但没有解决问题。您的代码用于设置用于D3D灯光的漫反射材质,您知道有什么方法可以只处理纹理吗?我认为这是不可能的。您需要灯光舞台从材质中获取颜色并将其传递给像素处理舞台。也就是说,我不再是固定功能管道的专家,我现在只使用着色器。您是否有任何不使用着色器的具体原因?使用着色器这样做很容易(也很容易得到更多帮助)。我很擅长HLSL,但不太擅长固定函数。。。不幸的是,我的目标系统上没有着色器。听起来不错,但是你能有2d和1d纹理的顶点吗?(我不认为你可以得到D3DFVF_TEXTUREFORMAT2和D3DFVF_TEXTUREFORMAT1)…2D UV在顶点中很常见,通过使用D3DFVF_TEX2,你可以有两对UV,你可以轻松地使用2D UV来处理1D纹理。注意:一对UV为8B,因此仍比D3DFVF_漫反射占用更多带宽。除此之外,这个解决方案是智能的,容易理解,你应该能够让它运行。是的,你可以有不同的纹理尺寸在相同的顶点格式。请参见编辑。