2013-11-01 85 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);