Strange problem with uv texture coords

Started by
0 comments, last by Namethatnobodyelsetook 18 years ago
I have this really strange problem when I texture a quad. Basically the bottom line of pixels will wrap around to the top. So when I make my bitmaps I have to set the bottom row of pixels to the alpha colorkey so they are removed. I setup my vertices as follows: // Top left vVertices[0].m_vPosition = D3DXVECTOR3(-0.5f, 0.5f, 0.0f); vVertices[0].m_dwColor = 0xffffffff; vVertices[0].m_tu = 0.0f; vVertices[0].m_tv = 0.0f; // Top right vVertices[1].m_vPosition = D3DXVECTOR3(0.5f, 0.5f, 0.0f); vVertices[1].m_dwColor = 0xffffffff; vVertices[1].m_tu = 1.0f; vVertices[1].m_tv = 0.0f; // Bottom right vVertices[2].m_vPosition = D3DXVECTOR3(0.5f, -0.5f, 0.0f); vVertices[2].m_dwColor = 0xffffffff; vVertices[2].m_tu = 1.0f; vVertices[2].m_tv = 1.0f; // Bottom left vVertices[3].m_vPosition = D3DXVECTOR3(-0.5f, -0.5f, 0.0f); vVertices[3].m_dwColor = 0xffffffff; vVertices[3].m_tu = 0.0f; vVertices[3].m_tv = 1.0f; As you can see here there is nothing wrong with the way I setup my uv's. So I dont know if this is a problem with DirectX rendering pipeline or something I'm doing, or maybe some setting on my video card. I render the vertices using the following flags: // Enable alpha blending pd3dDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, true ); pd3dDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA ); pd3dDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA ); g_pQuad->OnRender( pd3dDevice ); // Reset device states pd3dDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, false ); pd3dDevice->SetTexture( 0, NULL ); If anyone has ever encountered this problem before or has any idea of what might be causing it I would really like to know. Thanks.
Advertisement
Change your texture addressing mode to clamp

(not a cut n paste, could be slightly off, sorry)
SetSamplerState(0, D3DTSS_ADDRESSU, D3DTADDRESS_CLAMP);
SetSamplerState(0, D3DTSS_ADDRESSV, D3DTADDRESS_CLAMP);

The reason is that in Direct3D, up to version 9, (0,0) is the corner of the top left pixel, not the center of the pixel. When you have wrapping and bilinear filtering you'll get a 50% with the top and bottom, and with the left and right. Adding half a texel to your UVs will compensate for this (ie: if source image is 64x512, then u += 0.5/64; v += 0.5/512;)

OpenGL uses 0,0 as the center of the pixel.

This topic is closed to new replies.

Advertisement