Sign in to follow this  
kavaari

[SlimDX] Texture isn't mapping correctly

Recommended Posts

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.
5x5 quad.
[attachment=9338:5x5quadWTF.png]
100x100 quad.
[attachment=9340:100x100quadwireframed.png]

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.
10x10 quad.
[attachment=9339:10x10quadWith2Spacing.png]

For one quad it works as it should.
[attachment=9337:1x1quadtexturedOK.png]

Any help is appreciated. Edited by kavaari

Share this post


Link to post
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 this post


Link to post
Share on other sites
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.
[attachment=9350:5x5quadWTFv2.png]

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

Share this post


Link to post
Share on other sites
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 this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this