Добрый день всем кто взглянул на эту статью. О чем же в ней пойдет речь? Что это за штука такая? Я вам скажу. Эта технология появилась на заре графических ускорителей, и была вполне естественным следствием их [3D ускорителей] низкой производительности. Тогдашние разработчики графического железа подумали-подумали и решили, что если у нас есть какая-то довольно большая текстура, которая накладывается на полигон, то у нас будет два варианта. Первый – наш затекстуренный полигон находится близко от точки визирования, тогда просто накладываем на него исходную текстуру. Второй – полигон находится далеко от точки визирования, тогда очевидно нет необходимости накладывать на него исходную текстуру, т.к. всей её красоты мы оценить не сможем, полигон-то далеко, может он вообще на экране отображается несколькими пикселями, поэтому можно использовать исходную текстуру более худшего качества. В технологии о которой сегодня идет речь, под «текстурой более худшего качества», понимается текстура меньшего размера. Т.е. если у нас текстура размера M x N, то следующий mip-образец будет размера M/2 x N/2 , следущий M/4 x N/4. Как же сгенерировать эти образцы? Как их вставлять в игру в зависимости от расстояния до текстурируемого полигона? Во что нам это обойдется? Ответы на все эти вопросы Вы найдете в следующей части статьи.
На первый вопрос легко ответить, надо просто при создании текстуры указать количество mip уровней. Так в следующей функции это пятый параметр (я указал D3DX_DEFAULT, значит будет создан полный набор mip уровней)
D3DXCreateTextureFromFileEx( D3DDevice.GetDevice() , path , D3DX_DEFAULT , D3DX_DEFAULT , D3DX_DEFAULT , 0 , D3DFMT_X8R8G8B8 , D3DPOOL_MANAGED , D3DX_FILTER_LINEAR , D3DX_FILTER_LINEAR , NULL , NULL , NULL , &Texture )
В функции CreateTexture это третьий параметр (в текстуре, созданной так как описано в следующем примере будет всего один уровень)
D3DDevice->CreateTexture( Width , Height , 1 , 0 , D3DFMT_A8R8G8B8 , D3DPOOL_MANAGED, &Texture )
На следующий вопрос - «Как использовать эти mip образцы?», так же очень просто ответить. Надо лишь вставить в код следующую инструкцию (где вместо D3DTEXF_POINT, Вы можете вставить любой другой параметр фильтрации текстур)
D3DDevice->SetTextureStageState( 0 , D3DTSS_MIPFILTER , D3DTEXF_POINT );
А вот ответ на последний вопрос: текстура со всеми mip образцами будет занимать места <размер исходной текстуры> * 4 / 3 (это в случае квадратной текстуры, в случае прямоугольной текстуры затраты будут меньше, но не на много).
Вот собственно и все что я хотел сказать Вам в этом уроке. В приложение к нему я размещаю исходник со своим классом текстуры, который Вам будет полезно поковырять. До встречи!
ЗЫЖ способ связи прежний –