我对DirectX还是陌生的,并且仍然在学习,我认为我缺乏理解并不能很好地找到解决问题的好方向。
我在这里使用Direct3D-9并尝试在顶点缓冲区的某些uv坐标中渲染纹理。
这是顶点缓冲区和uv坐标:
VertexXYZColorT1 * m_pVB = new VertexXYZColorT1[10];
m_pVB[0].Set( 0.0f, 0.1f, 0.0f, m_dwCurrColor, 0.5f, 0.5f);
m_pVB[9].Set(-0.5f, 0.1f, -0.5f, m_dwCurrColor, 0.0f, 1.0f);
m_pVB[8].Set( 0.0f, 0.1f, -0.5f, m_dwCurrColor, 0.5f, 1.0f);
m_pVB[7].Set( 0.5f, 0.1f, -0.5f, m_dwCurrColor, 1.0f, 1.0f);
m_pVB[6].Set( 0.5f, 0.1f, 0.0f, m_dwCurrColor, 1.0f, 0.5f);
m_pVB[5].Set( 0.5f, 0.1f, 0.5f, m_dwCurrColor, 1.0f, 0.0f);
m_pVB[4].Set( 0.0f, 0.1f, 0.5f, m_dwCurrColor, 0.5f, 0.0f);
m_pVB[3].Set(-0.5f, 0.1f, 0.5f, m_dwCurrColor, 0.0f, 0.0f);
m_pVB[2].Set(-0.5f, 0.1f, 0.0f, m_dwCurrColor, 0.0f, 0.5f);
m_pVB[1].Set(-0.5f, 0.1f, -0.5f, m_dwCurrColor, 0.0f, 1.0f);
现在,我想知道是否有任何方法可以将纹理定位在顶点缓冲区的某些位置,即,当顶点缓冲区仍在中心时位于左上方吗?
我想在顶点缓冲区的左上角绘制纹理,同时保持顶点缓冲区居中,这样我就可以绘制如下内容:
我正在阅读许多文章,还读过Introduction to 3D game programming with DirectX 9.0
书中他谈到纹理的问题,我们可以将d3d设备设置为:
s_lpD3DDev->SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_MIRROR);
s_lpD3DDev->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_MIRROR);
还要在此处检查Microsoft的文档:
https://docs.microsoft.com/en-us/windows/desktop/direct3d9/wrap-texture-address-mode
我似乎找不到解决我问题的好方向,非常感谢您的帮助或对如何实现此目标的解释。基本上,我的目标是使用此纹理并将其绘制4次以形成一个完整的圆。
我猜这也与旋转uv坐标或类似的东西有关?还是需要为此绘制4个顶点缓冲区,为每个顶点缓冲区绘制1个纹理?
还是我让事情变得太复杂了,这与告诉Directx使用此标志渲染4个纹理有关吗?:
const DWORD FVF_XYZCOLORT4 = D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX4;
那我将如何旋转此纹理以绘制一个完整的圆?
在此先感谢您的帮助和时间!
答案 0 :(得分:1)
您有2种选择:
创建所需的所有顶点。 (1/4纹理的完整圆将需要您拥有的顶点的4倍)。只需手动计算u,v,即可获得所需的结果。
编写自己的像素着色器,您可以在其中随意控制u,v。例如(只是使用像素着色器所需的一部分代码):
sampler2D Sampler1 = sampler_state
{
MinFilter = linear;
MagFilter = linear;
MaxAnisotropy = 16;
Texture = <g_Tex0>;
};
void PS1 (float2 TexCoord : TEXCOORD1, out float4 oColor : COLOR0)
{
if (g_InvX)
TexCoord.x = 1-TexCoord.x;
if (g_InvY)
TexCoord.y = 1-TexCoord.y;
oColor = tex2D(Sampler1 , TexCoord),
};
g_Tex0,g_InvX和g_InvY设置为ID3DXEffect *对象。 (这只是一个钩子。编写和使用着色器需要学习很多东西。)