我使用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
值启用mipmap功能时,渲染结果会变得有点在接缝处总是有一条像素线是错误的。下面的图片显示了问题,但是当我通过D3DX_FROM_FILE
参数的MipLevels
值禁用mipmap功能时,该行消失。我不知道为什么会这样,有什么建议吗?
答案 0 :(得分:5)
我之前遇到过这个问题,正如你通过mipmapping发现的那样。你正在重新映射纹理坐标,在这一行有u = 1到0的接缝。这个大的跳跃是由mipmapping算法检测到的,并且选择了一个非常低的mipmap,这会导致像素颜色错误。接缝具有2个像素的厚度,因为利用2×2像素块的梯度函数ddx和ddy确定mipmapping。当接缝正好在此块中时,会发生错误。
我通过禁用此几何体的mipmapping来解决它,但是如果您需要它,您可以使用方法tex2Dgrad
(doc)修复此接缝处的渐变或使用tex2Dlod
(doc)在着色器中并自行确定miplevel。
答案 1 :(得分:1)
对我而言,这似乎是texture wrapping的问题。您是否尝试过D3DRS_WRAPx渲染状态的各种选项?例如,
IDirect3DDevice9::SetRenderState(D3DRS_WRAP0, D3DWRAP_U);