2013-11-01 58 views
2

我使用D3DXCreateSphere方法来创建球体网格。我想在它上面应用地球纹理。我计算在像素着色器中的纹理坐标与以下代码:球体纹理映射错误

sampler ShadeSampler = sampler_state 
{ 
    Texture = (ShadeTex); 
    AddressU = Mirror; 
    AddressV = Mirror; 
    MinFilter = LINEAR; 
    MagFilter = LINEAR; 
    MipFilter = LINEAR; 
}; 
PS_OUTPUT PSMain(VS_OUTPUT input){ 

PS_OUTPUT output = (PS_OUTPUT)0; 

vector uv; 

uv.x = 0.5 + atan2(input.normal.z, input.normal.x)/piMul2; 
uv.y = 0.5f - asin(input.normal.y)/pi; 

vector b = tex2D(ShadeSampler, uv.xy); 

output.diffuse = b * input.diffuse; 

return output; 
} 

我使用D3DXCreateTextureFromFileEx方法来创建IDirect3DTexture9,但是当我通过使用D3DX_DEFAULT值用于MipLevels参数使mip映射能力,渲染结果变为稍错误的是在接缝处总是有一条像素线。下面的图片显示了这个问题,但是当我通过使用参数MipLevelsD3DX_FROM_FILE值来禁用mipmap功能时,该行消失。我不知道为什么会发生这种情况,有什么建议?

enter image description here

+0

这不是相同的问题[这个问题](http://stackoverflow.com/questions/19702285/why-the-sphere-texture-map-can-not-actually-比赛)?两者都有一个线条的神器截图。 –

+0

@DavidM这两个问题都是由我发布的,他们是由不同的原因引起的 – cloud

回答

5

我收到这个问题,它造成的,因为你发现了由纹理映射。您正在重新映射纹理坐标,并且在这条线上有从u = 1到0的接缝。通过mipmapping算法检测到这个大跳跃,并且选择了非常低的mipmap,这会导致像素颜色错误。接缝具有2个像素的厚度,因为mipmapping由2×2像素块的梯度函数ddx和ddy确定。当接缝正好在这个块中时,发生错误。

我解决它通过禁止这种几何形状,纹理映射,但是如果你需要它,你可以使用的方法tex2Dgraddoc)修复梯度在这个缝或使用着色器tex2Dloddoc)和确定的miplevel你自己。

+0

非常感谢,你的回答帮了我很多,我甚至不知道ddx,ddy之前的东西,哈哈!但我现在明白他们。 – cloud

+0

使用tex2Dlod(TextureSampler,float4(u,v,0,0));为我解决了这个问题。 – mikeschuld

1

对我来说这似乎是texture wrapping的问题。您是否尝试过D3DRS_WRAPx渲染状态的各种选项?例如,

IDirect3DDevice9::SetRenderState(D3DRS_WRAP0, D3DWRAP_U);