Ошибка отображения текстуры сферы
Я использую 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 с помощью D3DX_DEFAULT
значение для MipLevels
параметр, результат рендеринга идет немного неправильно, что в шве всегда есть одна линия пикселя. на рисунке ниже показана проблема, но когда я отключаю функцию mipmap с помощью D3DX_FROM_FILE
значение для MipLevels
параметр, строка исчезает. я не знаю, почему это произойдет, любой совет?
2 ответа
У меня была эта проблема раньше, и она вызвана, как вы выяснили, с помощью mipmapping. Вы переназначаете координаты текстуры, и в этой строке есть шов от u = 1 до 0. Этот большой скачок обнаруживается алгоритмом мипмапинга, и выбирается очень низкий мипмап, из-за которого пиксели имеют неправильный цвет. Шов имеет толщину 2 пикселя, потому что отображение отображается с помощью функции градиента ddx и ddy пиксельных блоков 2x2. Когда шов находится именно в этом блоке, возникает ошибка.
Я решил это, отключив mipmapping для этой геометрии, но если вам это нужно, вы можете использовать метод tex2Dgrad
( Док), чтобы восстановить градиенты в этом шве или использовать tex2Dlod
( doc) в шейдере и определите уровень самостоятельно.
Мне кажется, это вопрос обтекания текстурой. Вы пробовали различные варианты состояния рендеринга D3DRS_WRAPx? Например,
IDirect3DDevice9::SetRenderState(D3DRS_WRAP0, D3DWRAP_U);