Еще факты о текстурах: в Embarcadero Delphi XE5 нет опции, с которой текстура бы повторялась необходимое количество раз на модели. Если создаешь модель, и U или V координата текстуры вылезает на модели ниже 0, то в вашей проге рисуется в тех местах то что было на 0. Аналогично, все что выше 1 рисуется как будто координата 1.
Вот спина "Брита", кольчуга на туловище имеет щель, которой там быть не должно:
Как починить - этот вопрос уже волновал многих:
http://quoteverge.com/embarcadero.delph ... ad/1052997
http://fire-monkey.ru/topic/2207-lightm ... cetexture/
http://www.devsuperpage.com/search/Arti ... tID=150214
Решение такое:
Оказывается, что в исходниках FireMonkey жестко заданы настройки для единичного неповторяющегося отображения текстуры.
Вот модуль для Android
FMX.Context.GLES.pas и эти строчки для OpenGL:
Если бы здесь стояло:
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
то текстура бы повторялась бесконечно для любых координат (целая часть координаты бы отбрасывалась просто, и 0.1 было бы равно 1.1, и 2.1 и т.д.).
А вот модуль для Windows
FMX.Context.DX10.pas и там другие строчки, для DirectX:
Здесь нужно было бы поставить это чтобы текстура повторялась:
Desc.AddressU := D3D10_TEXTURE_ADDRESS_WRAP;
Desc.AddressV := D3D10_TEXTURE_ADDRESS_WRAP;
Desc.AddressW := D3D10_TEXTURE_ADDRESS_WRAP;
Но поставить указанные изменения прямо в эти модули, лежащие по адресу Program Files\Embarcadero\RAD Studio\12.0\source\fmx , невозможно.
Решение такое:
1) копируем FMX.Context.GLES.pas и FMX.Context.DX10.pas из папки Program Files\Embarcadero\RAD Studio\12.0\source\fmx в папку нашего проекта;
2) добавляем указанные файлы в проект через меню "Project" - "Add to Project...";
3) вносим вышеупомянутые правки кода в эти дубликаты модулей
в
FMX.Context.GLES.pas пишем вместо старого кода:
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
в
FMX.Context.DX10.pas пишем вместо старого кода:
Desc.AddressU := D3D10_TEXTURE_ADDRESS_WRAP;
Desc.AddressV := D3D10_TEXTURE_ADDRESS_WRAP;
Desc.AddressW := D3D10_TEXTURE_ADDRESS_WRAP;
4) получаем кучу предупреждений что модули для Windows не будут в сборке под андроид, а модули для Android не будут в сборке для Windows. Прописываем в наших модулях условия для компилирования, чтоб андроидовский модуль добавлялся пустым если собираем сборку под Windows:
в
FMX.Context.GLES.pas пишем:
unit FMX.Context.GLES;
{$IFDEF WIN32}
interface
implementation
initialization
end.
{$ENDIF}
{$IFDEF ANDROID}
interface
uses
System.Classes, System.SysUtils, System.Types, System.UITypes, System.UIConsts, System.Generics.Collections, System.Math,
//и т.д. весь код модуля
{$ENDIF}
Аналогичные изменения, но наоборот, прописываем в
FMX.Context.DX10.pas:
unit FMX.Context.DX10;
{ $DEFINE DXDEBUG}
{$IFDEF ANDROID}
interface
implementation
initialization
end.
{$ENDIF}
{$IFDEF WIN32}
interface
uses
Winapi.DXGI, Winapi.D3D10, Winapi.D3D10_1, FMX.Types3D, System.Types, System.UITypes, System.SysUtils,
System.Classes, System.Math, System.Generics.Collections;
//и т.д. весь код модуля
{$ENDIF}
5) ВСЁ! Теперь можно делать проги и под Android, и под win32 с нормальными текстурами:
Починенный брит сзади:
Он же спереди (но там проблем не было и так, шов был сзади посреди полигона)
И под андроидом тоже все прекрасно.