球体纹理映射错误

clo*_*oud 2 directx shader textures texture-mapping

我使用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;
}
Run Code Online (Sandbox Code Playgroud)

我使用D3DXCreateTextureFromFileEx方法来创建IDirect3DTexture9,但是当我通过使用参数的D3DX_DEFAULT值启用mipmap功能时MipLevels,渲染结果有点错误,在接缝处总是有一个像素线.下图显示了问题,但是当我通过使用参数D3DX_FROM_FILE值禁用mipmap功能时MipLevels,该行消失.我不知道为什么会这样,有什么建议吗?

在此输入图像描述

Gni*_*how 5

我之前遇到过这个问题,正如你通过mipmapping发现的那样.你正在重新映射纹理坐标,在这一行有u = 1到0的接缝.这个大的跳跃是由mipmapping算法检测到的,并且选择了一个非常低的mipmap,这会导致像素的颜色错误.接缝具有2个像素的厚度,因为利用2×2像素块的梯度函数ddx和ddy确定mipmapping.当接缝正好在此块中时,会发生错误.

我通过禁用此几何体的mipmapping来解决它,但如果您需要它,您可以使用方法tex2Dgrad(doc)修复此接缝处的渐变或在着色器中使用tex2Dlod(doc)并自行确定miplevel.