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启用 mipmap 功能时,渲染结果有点错误,接缝处总是有一条像素线。下图显示了问题,但是当我通过使用参数值禁用 mipmap 功能时,该行消失了。我不知道为什么会发生这种情况,有什么建议吗?D3DX_DEFAULTMipLevelsD3DX_FROM_FILEMipLevels

在此处输入图像描述

4

2 回答 2

5

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

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

于 2013-11-01T10:41:34.423 回答
1

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

IDirect3DDevice9::SetRenderState(D3DRS_WRAP0, D3DWRAP_U);
于 2013-11-02T13:05:27.853 回答