# [SlimDX] Texture isn't mapping correctly

## Recommended Posts

kavaari    110
I have a really weird problem, which I have tried to solve the whole day, yet no solution. I'm using DirectX10.

This is a dead simple case:
I have a grid based on number of tiles and spacing (size of one quad).

[CODE]
int vCounter = 0;
int iCounter = 0;
int indicesIndex = 0;
for (int x = 0; x < numSideTiles; x++)
for (int z = 0; z < numSideTiles; z++)
{
float xPos = x * spacing;
float zPos = z * spacing;

vertices[vCounter++] = new PositionNormalTextured() { Position = new Vector4(xPos, 0, zPos + spacing, 1.0f), Normal = normal, UV = new Vector2(1, 1) };
vertices[vCounter++] = new PositionNormalTextured() { Position = new Vector4(xPos + spacing, 0, zPos + spacing, 1.0f), Normal = normal, UV = new Vector2(0, 1) };
vertices[vCounter++] = new PositionNormalTextured() { Position = new Vector4(xPos, 0, zPos, 1.0f), Normal = normal, UV = new Vector2(1, 0) };
vertices[vCounter++] = new PositionNormalTextured() { Position = new Vector4(xPos + spacing, 0, zPos, 1.0f), Normal = normal, UV = new Vector2(0, 0) };

indices[iCounter++] = (ushort)(indicesIndex + 0);
indices[iCounter++] = (ushort)(indicesIndex + 1);
indices[iCounter++] = (ushort)(indicesIndex + 2);
indices[iCounter++] = (ushort)(indicesIndex + 1);
indices[iCounter++] = (ushort)(indicesIndex + 3);
indices[iCounter++] = (ushort)(indicesIndex + 2);
indicesIndex += 4;
}

DataStream vertexStream = new DataStream(36 * numVertices, true, true);
vertexStream.WriteRange(vertices);
DataStream indexStream = new DataStream(2 * numIndices, true, true);
indexStream.WriteRange(indices);
BufferDescription vertexBufferDesc = new BufferDescription()
{
BindFlags = BindFlags.VertexBuffer,
CpuAccessFlags = CpuAccessFlags.None,
OptionFlags = ResourceOptionFlags.None,
SizeInBytes = 36 * numVertices,
Usage = ResourceUsage.Default
};
BufferDescription indexBufferDesc = new BufferDescription()
{
BindFlags = BindFlags.IndexBuffer,
CpuAccessFlags = CpuAccessFlags.None,
OptionFlags = ResourceOptionFlags.None,
SizeInBytes = 2 * numIndices,
Usage = ResourceUsage.Default
};
vertexStream.Position = 0;
indexStream.Position = 0;
vertexBuffer = new SlimDX.Direct3D10.Buffer(device, vertexStream, vertexBufferDesc);
indexBuffer = new SlimDX.Direct3D10.Buffer(device, indexStream, indexBufferDesc);

device.Flush();

//More code between...

//Final drawing code

device.InputAssembler.SetInputLayout(InputElements.pntInputLayout);
device.InputAssembler.SetPrimitiveTopology(PrimitiveTopology.TriangleList);
device.InputAssembler.SetIndexBuffer(indexBuffer, SlimDX.DXGI.Format.R16_UInt, 0);
device.InputAssembler.SetVertexBuffers(0, new VertexBufferBinding(vertexBuffer, 36, 0));

effect.GetTechniqueByIndex(0).GetPassByIndex(0).Apply();
device.DrawIndexed(numIndices,0, 0);

[/CODE]

The quads seems fine, but the texture is placed wrong on quads along left edge and on the last quad, on top left corner.

If spacing is two (quad size is two), then the texture will get stretched on Z-axis, even though the quad's vertices are fine.

For one quad it works as it should.

Any help is appreciated. Edited by kavaari

##### Share on other sites
That loop looks wrong to me ... I'm trying to work it out...

So I'm getting indices all over the place, the verts look well formed, but the indices start jumping around. Look at your index construction to see if it needs to be re-written. Edited by Gavin Williams

##### Share on other sites
kavaari    110
I changed the grid creation code to more efficient one. I took the code almost straight from Riemers example, so there shouldn't be much errors in that, but still the problem exist, it's driving me crazy!

[CODE]
int iCounter = 0;
//Vertices
for (int x = 0; x < numSideTiles+1; x++)
for (int z = 0; z < numSideTiles+1; z++)
{
float xPos = x * spacing;
float zPos = z * spacing;

vertices[x + z * (numSideTiles + 1)] = new PositionNormalTextured() { Position = new Vector4(xPos, 0, zPos, 1.0f), Normal = normal, UV = new Vector2(x, z) };
}
//Indices
for (int x = 0; x < numSideTiles; x++)
for (int z = 0; z < numSideTiles; z++)
{
ushort lowerLeft = (ushort)(x + z * (numSideTiles+1));
ushort lowerRight = (ushort)((x + 1) + z * (numSideTiles + 1));
ushort topLeft = (ushort)(x + (z + 1) * (numSideTiles + 1));
ushort topRight = (ushort)((x + 1) + (z + 1) * (numSideTiles + 1));

indices[iCounter++] = topLeft;
indices[iCounter++] = lowerRight;
indices[iCounter++] = lowerLeft;

indices[iCounter++] = topLeft;
indices[iCounter++] = topRight;
indices[iCounter++] = lowerRight;

}
[/CODE]

Here is a picture of 5x5 quad, and as you can see it's a little different.

I'm thinking the problem is somewhere else than in the loop. Edited by kavaari

##### Share on other sites
kavaari    110
Finally I got the problem solved.
The problem was in the vertex declaration aka the input layout. I was using Vector4 to pass my position in to the vertex shader, but I changed it to Vector3 and updated my input layout and vertex stride accordingly. Now it works as intended, but I cannot understand why this would cause the UV's to be wrong, any ideas? Edited by kavaari

##### Share on other sites
No ideas, but I'm glad u sorted it out. I should have asked you for the vertex declaration straight up. That is the obvious source of problems in retrospect