首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在相同的顶点缓冲区上DirectX多个纹理

在相同的顶点缓冲区上DirectX多个纹理
EN

Stack Overflow用户
提问于 2018-07-30 02:10:43
回答 1查看 634关注 0票数 0

我是DirectX的新手,还在学习,我认为我缺乏理解,无法找到一个好的方向来解决我的问题。

我在这里使用Direct3D-9,并尝试在顶点缓冲区的特定uv坐标中渲染纹理。

以下是顶点缓冲区和uv坐标:

代码语言:javascript
复制
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设备设置为:

代码语言:javascript
复制
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个纹理有关?:

代码语言:javascript
复制
const DWORD FVF_XYZCOLORT4 = D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX4;

那么我如何旋转这个纹理来画一个完整的圆呢?

提前感谢您的帮助和时间!

EN

回答 1

Stack Overflow用户

发布于 2018-07-30 15:03:47

您有两种选择:

  1. 将创建所需的所有顶点。( 1/4纹理的完整圆需要4倍的顶点)。只需手动计算u,v就可以得到你想要的。
  2. 编写你自己的像素着色器,你可以随心所欲地操作u,v。例如(只是使用像素着色器所需的代码片段):

sampler2D Sampler1 = sampler_state { MinFilter =线性;MagFilter =线性;MaxAnisotropy = 16;Texture = ;};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,),};

g_Tex0、g_InvX与g_InvY由SetTexture与SetBool方法设置为ID3DXEffect *对象。(这只是一个钩子。对于编写和使用着色器,有很多东西需要学习)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51583172

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档