Jump to content

  • Log In with Google      Sign In   
  • Create Account

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

  • You cannot reply to this topic
4 replies to this topic

#1 kavaari   Members   -  Reputation: 110

Like
0Likes
Like

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.
5x5 quad.
5x5quadWTF.png
100x100 quad.
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.
10x10quadWith2Spacing.png

For one quad it works as it should.
1x1quadtexturedOK.png

Any help is appreciated.

Edited by kavaari, 07 June 2012 - 01:13 PM.


Sponsor:

#2 Gavin Williams   Members   -  Reputation: 664

Like
1Likes
Like

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.


#3 kavaari   Members   -  Reputation: 110

Like
0Likes
Like

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.
5x5quadWTFv2.png

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

Edited by kavaari, 08 June 2012 - 05:17 AM.


#4 kavaari   Members   -  Reputation: 110

Like
0Likes
Like

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.


#5 Gavin Williams   Members   -  Reputation: 664

Like
0Likes
Like

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.



PARTNERS