я могу показать как я взяв растровый фонт, конвертнул его через FontCreator Professional 9.0.0 build 1916 и потом получив , через msdf спрайты, рендерю его через шейдеры.
и как бы, качество для глаза идеальное.
AlexeiK
не вижу 8px
Хотя если ты имел ввиду это:
То спасибо за подтверждение моих слов, выглядит как говно.
Где же говно?
СПрава все читаемо.
Не понял, твоих оценок.
https://github.com/Chlumsky/msdfgen/issues/22#issuecomment-250830853
вот этот коммент смотри.
ты ищи , то что опровергает твой взгляд, а не подтверждает.
тогда найдешь.
AlexeiK
> Где же говно?
> СПрава все читаемо.
> Не понял, твоих оценок.
ты не видишь мыла? И это далеко не 8px, просто то что нашлось самого малого размера. Нарисовать более менее сносный текст с 12pt+ куда еще не шло, но всё что меньше sdf сгодится только для религиозных фанатиков которые явно не планируют читать данный текст потом.
Aroch
в том комменте, написано
6pt text as well as 480pt text using the same font texture
AlexeiK
> 6pt text as well as 480pt text using the same font texture
ну так приведи скриншот хотя бы с 8pt, выше с 10pt+ и он явно не предназначен для комфортного чтения.
И да, зачем ты выдергиваешь неполное предложение? Перевести или сам справишься?
I want to be able to render 6pt text as well as 480pt text using the same font texture.
Короче сделал 55 пкс Футуру. Смотрится норм :)

Может я конечно что-то не понимаю, но зачем все эти извраты если есть готовые (и бесплатные) либы?
Вот как у меня сделан вывод в текстуру текста любого фонта, любого резмера и любого стайла (DX12, но не суть важно):
HRESULT Label::Update(LPCWSTR label)
{
std::lock_guard<std::mutex> lk(label_update_mutex);
HRESULT hr = S_OK;
shared_ptr<Gdiplus::Bitmap> m_bitmap = shared_ptr<Gdiplus::Bitmap>(new Gdiplus::Bitmap((int)m_dimention.x, (int)m_dimention.y, PixelFormat32bppRGB));
Gdiplus::Graphics graphics(m_bitmap.get());
Gdiplus::StringFormat strFormat(0);
Gdiplus::Status stat;
Gdiplus::RectF origin(0, 0, m_dimention.x, m_dimention.y);
Gdiplus::Font font(m_font, m_font_size, m_font_style);
{
origin.X = m_point.X;
origin.Y = m_point.Y;
stat = graphics.DrawString(label, -1, &font, origin, &strFormat, m_brush);
}
ComPtr<ID3D12Resource> textureUploadHeap;
const UINT64 uploadBufferSize = GetRequiredIntermediateSize(m_Icon1->Get(), 0, 1);
hr = m_context->m_Device->CreateCommittedResource(
&CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_UPLOAD),
D3D12_HEAP_FLAG_NONE,
&CD3DX12_RESOURCE_DESC::Buffer(uploadBufferSize),
D3D12_RESOURCE_STATE_GENERIC_READ,
nullptr,
IID_PPV_ARGS(textureUploadHeap.ReleaseAndGetAddressOf()));
if (FAILED(hr))
{
return hr;
}
textureUploadHeap->SetName(L"Label:textureUploadHeap");
Texture_Property descr = m_Icon1->GetProperty();
BitmapData bitmapData;
m_bitmap->LockBits(&Rect(0, 0, (int)m_dimention.x, (int)m_dimention.y), ImageLockModeRead, PixelFormat32bppRGB, &bitmapData);
unsigned char *pSourcePixels = (unsigned char*)bitmapData.Scan0;
D3D12_SUBRESOURCE_DATA *textureData = m_Icon1->GetData();
textureData->pData = pSourcePixels;
textureData->RowPitch = (UINT)descr.rowPitch;
textureData->SlicePitch = textureData->RowPitch * descr.height;
m_context->m_comput_Command_list->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m_Icon1->Get(), D3D12_RESOURCE_STATE_COMMON, D3D12_RESOURCE_STATE_COPY_DEST));
UINT64 t = UpdateSubresources(m_context->m_comput_Command_list.Get(), m_Icon1->Get(), textureUploadHeap.Get(), 0, 0, 1, textureData);
m_context->m_comput_Command_list->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m_Icon1->Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_COMMON));
m_label = label;
m_show = true;
return hr;
}Пример вывода текста:

Если не заморачиваться с DX12, то текст функции будет раза в 2 короче. И все. Не надо ни о чем думать - за вас все уже придумали.
Текстуру положите на плоскость и крутите в свое удовольствие. Хотите приблизить - нет проблем.
Я еще форматирую текст меняя размер фонта дабы он по возможности без переносов влез в текстуру заданного размера. Тоже не проблема:
vec2 Label::GetLabelDim(LPCWSTR label, vec2 addon)
{
shared_ptr<Gdiplus::Bitmap> m_bitmap = shared_ptr<Gdiplus::Bitmap>(new Gdiplus::Bitmap((int)m_dimention.x, (int)m_dimention.y, PixelFormat32bppRGB));
Gdiplus::Graphics graphics(m_bitmap.get());
Gdiplus::Font font(m_font, m_font_size, m_font_style);
RectF layoutRect(0, 0, GetDimention().x + addon.x, GetDimention().y + addon.y);
RectF boundRect;
StringFormat strFormat(0);
int fitted;
graphics.MeasureString(label, -1, &font, layoutRect, &strFormat, &boundRect, &fitted);
return vec2(boundRect.Width, boundRect.Height);
}
...
dim = label->GetLabelDim((LPCWSTR)lp_text.c_str(), vec2(100, 100));
while (dim.y >= m_Scroll->m_model->h_texture[1].tex->Get_Dimention().y || dim.x >= m_Scroll->m_model->h_texture[1].tex->Get_Dimention().x)
{
label->m_font_size -= 1;
dim = label->GetLabelDim((LPCWSTR)lp_text.c_str(), vec2(100, 100));
}Короче: "Зачем смотреть вперед если весь опыт сзади?"
М.Жванецкий.
san
У меня GL, но не суть важно. Выше я уже писал, что до текстур еще не добрался ибо зелен в 3D. Чисто хобби. Как временное решение мой вариант меня устраивает.
eDmk
Если ты не добрался до текстур, то зачем тебе шрифты? Начни с азов, элементы ГУИ это не самая насущная проблема для начинающих.
Оффтоп - GL не самая удобная платформа для старта, начинать лучше с DX11. Если сравнивать с языками, то GL ближе к C, а DX к C++. Плюсы может и сложнее, но там полно готовых функций и классов, потому программа получается короче и начинает работать быстрее. Это не относится к DX12, туда тебе ходить явно рановато.
san
Я не начинающий программист. Просто 3D раньше не занимался.
Вообще у меня Pascal/Asm. Так сложилось. Хотя против С ничего не имею.
Под паскаль мало библиотек, поэтому приходится свои функции изобретать.
> элементы ГУИ это не самая насущная проблем
В данный момент насущная. Свои контролы делаю.
Пока сделал чекбокс, кнопочки обычные и скроллбары.
У меня есть класс для GUI (оттуда и код), могу поделиться, но там все:
1. На C++
2. Для DX12
Вот пример его работы:
Всякие кнопочки, ползунки и тексты он выводит без проблем, но сомневаюсь что тебе с бекграундом на Паскаль/ОГЛ это может помочь.
Хотя Gdiplus имеет реализацию для Паскаля (https://github.com/jackdp/IGDIPlusMod), так что можешь попробовать разобраться.
Оффтоп: Что до Паскаля, то это старая беда российских программистов. Когда они оказываются на Западе, то с изумлением обнаруживают, что практически нигде кроме России не используют Паскаль и Делфи и их знания никому тут нафиг не нужны.
san
> Что до Паскаля, то это старая беда российских программистов
Не холиворьте. Все «файналли», как говорят в америках, на асме ваще.
Язык это просто «логическая шапка» на ассемблер.
Так уж вышло, что Дельфи купил по случаю,
да и пишу в основном вечерами в свободный час.
san
Браво. Посоветовал: использовать другой код, поменять GAPI, поменять ЯП. Осталось посоветовать сменить ОС и пол, и это будет эталон помощи на гд.ру
MrShoor
Да я тоже в шоке. Уже до оправданий дошло за паскаль :(
Дети барыг из 90-х подросли что ли?
Тема в архиве.
| Доставка грузов из Европы в Москву Доставка грузов из Европы в Москву rtucargo.com |