• FEATURED

View more

View more

View more

### Image of the Day Submit

IOTD | Top Screenshots

### The latest, straight to your Inbox.

Subscribe to GameDev.net Direct to receive the latest updates and exclusive content.

# [SlimDX] Texture isn't mapping correctly

Old topic!

Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

4 replies to this topic

### #1kavaari  Members

Posted 07 June 2012 - 01:10 PM

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).

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);



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, 07 June 2012 - 01:13 PM.

### #2Gavin Williams  Members

Posted 07 June 2012 - 11:17 PM

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, 07 June 2012 - 11:40 PM.

### #3kavaari  Members

Posted 08 June 2012 - 05:16 AM

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!

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;

}


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, 08 June 2012 - 05:17 AM.

### #4kavaari  Members

Posted 08 June 2012 - 06:16 AM

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, 08 June 2012 - 06:17 AM.

### #5Gavin Williams  Members

Posted 08 June 2012 - 07:17 AM

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

Old topic!

Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.