質問を編集したので、問題に対する別の回答があります。
私が理解したことから、あなたは次のようなUVの顔をしています:
0,1 1,1
-------------
| |
| |
| |
-------------
0,0 1,0
ただし、テクスチャを 1 回ではなく 3 回 (たとえば) 繰り返します。(元のモデルを変更せずに)
ここに複数のソリューション:
バッファを更新するときに、それを行うことができます(行う場合):
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 ではとにかく頂点シェーダーを使用するため、バッファー更新ソリューションほど高価ではありません...
問題の解決に役立つことを願っています:)