由于您已经编辑了问题,因此您的问题还有另一个答案:
据我了解,你有一张这样的 uv 脸:
0,1 1,1
-------------
| |
| |
| |
-------------
0,0 1,0
但是希望纹理重复 3 次(例如)而不是 1 次。(不改变原模型)
这里有多种解决方案:
您可以在更新缓冲区时执行此操作(如果您这样做):
D3D11_MAPPED_SUBRESOURCE resource;
HRESULT hResult = D3DDeviceContext->Map(vertexBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &resource);
if(hResult != S_OK) return false;
YourVertexFormat *ptr=(YourVertexFormat*)resource.pData;
for(int i=0;i<vertexCount;i++)
{
ptr[i] = vertices[i];
ptr[i].uv.x *= multiplyX; //in your case 3
ptr[i].uv.y *= multiplyY; //in your case 5
}
D3DDeviceContext->Unmap(vertexBuffer, 0);
但是,如果您无论如何都不需要更新缓冲区,我不会推荐它,因为它非常慢。
更快的方法是使用顶点着色器:
cbuffer MatrixBuffer
{
matrix worldMatrix;
matrix viewMatrix;
matrix projectionMatrix;
};
struct VertexInputType
{
float4 position : POSITION0;
float2 uv : TEXCOORD0;
// ...
};
struct PixelInputType
{
float4 position : SV_POSITION;
float2 uv : TEXCOORD0;
// ...
};
PixelInputType main(VertexInputType input)
{
input.position.w = 1.0f;
PixelInputType output;
output.position = mul(input.position, worldMatrix);
output.position = mul(output.position, viewMatrix);
output.position = mul(output.position, projectionMatrix);
This is what you basicly need:
output.uv = input.uv * 3; // 3x3
Or more advanced:
output.uv = float2(input.u * 3, input.v * 5);
// ...
return output;
}
我会推荐顶点着色器解决方案,因为它速度很快,而且在 Directx 中你无论如何都使用顶点着色器,所以它不像缓冲区更新解决方案那样昂贵......
希望这有助于解决您的问题:)