LINUX.ORG.RU

помогите разобраться со шрифтом

 , ,


1

3

Использую библиотеку freetype. Загрузил шрифт ttf. Проверил режим шрифта, хотелось бы bgra, но стоит gray. Итак, чтоже написано про этот режим.

FT_PIXEL_MODE_GRAY ::
 An 8-bit bitmap, generally used to represent anti-aliased 
 glyph images. Each pixel is stored in one byte. Note that the 
 number of 'gray' levels is stored in the 'num_grays' field of the  
 @FT_Bitmap structure ( it generally is 256 ).
Хочу вывести в opengl, но из-за непонимания как устроены данные не могу вывести. Написано что каждый пиксель в одном байте, но нужно же x и y координаты.

Я не тыкал freetype, только читал о ней, там разве не текстурка ей генерится, которую потом средствами OpenGL ты отображаешь? Ну и правильно, 8 бит на канал (оттенки серого) - 1 байт на пиксель. Чего не понятно то? Если rgb будешь отображать, то будет 3 канала, вместо одного.

peregrine ★★★★★
()
Последнее исправление: peregrine (всего исправлений: 1)
Ответ на: комментарий от peregrine

Ну в одном байте пиксель, а где он расположен? А оттенки серого. Я даже так пробывал

for ( int y = 0; y < bt->rows; y++ ) {
  for ( int x = 0; x < br->width; x++ ) {
    glVertex2i ( x, y );
  }
}
А какой в opengl glColor, который оттенки серого рисует? Я так понел что нужно правильную функцию с оттенком добавить?

u0atgKIRznY5
() автор топика
Ответ на: комментарий от u0atgKIRznY5

Какой фееричный бред ты пишешь, почитай что-ли как видеокарта работает. Если коротко, то рендерится кадр, который отображается на экране, обычно делают буферизацию двойную, иногда тройную, чтобы рендерить в памяти а потом разом выводить на монитор. Вкуривай короче. Только внимательно читай, там есть баг, который пофикшен по ссылке. Ну и да, как по мне C и OpenGL не лучшее сочетание, хотя OpenGL и C-шный сам по себе. Однако, если нормально 3D рисовать, то ООП абстракции удобнее ИМХО.

peregrine ★★★★★
()
Последнее исправление: peregrine (всего исправлений: 2)
Ответ на: комментарий от peregrine

Так я вывожу, ты меня не понел. Не отображается то что нужно. Я знаю как рисовать. Но букву не могу правильно нарисовать. Причём тут буферизация, я у тебя не об этом спрашивал. Всё и так работает и буферизация и всё что нужно. Мне со шрифтом помоги, да и что ты можешь знать, раз в другую сторону начал смотреть.

u0atgKIRznY5
() автор топика
Ответ на: комментарий от u0atgKIRznY5

Что не отображается? Где код, где скриншоты, где то что ты хочешь увидеть, хотя бы на уровне простого рисунка ручкой на бумаге?

peregrine ★★★★★
()
Ответ на: комментарий от peregrine

Ну и да, как по мне C и OpenGL не лучшее сочетание, хотя OpenGL и C-шный сам по себе. Однако, если нормально 3D рисовать, то ООП абстракции удобнее ИМХО.

Я связку sdl opengl использую. Когда в ооп писал как-то были проблемы с одной функцией sdl, которая никак не хотела компилироваться из-за своих свойств.

u0atgKIRznY5
() автор топика
Ответ на: комментарий от peregrine

Вот как вывел, получается белая буква на чёрном фоне, видимо надо вычесть или другую glColor использовать.

int i = 0;
for ( int y = 0; y < bt->rows; y++ ) {
  for ( int x = bt->width; x > 0; x-- ) {
    glColor3ub ( bt->buffer [ i ], bt->buffer [ i ], bt->buffer [ i ] );
    glVertex2i ( x, y );
    i++;
  }
}

u0atgKIRznY5
() автор топика
Ответ на: комментарий от peregrine

Нет, это из-за оттенка, зарисовывает квадрат.

u0atgKIRznY5
() автор топика
Ответ на: комментарий от peregrine

Сделал так

glColor3ub ( 255 - bt->buffer [ i ], ... );
Только фон белый, а теперь нужно сделать прозрачным. Поменял на glColor4ub, и добавлю если ноль, то прозрачный.

u0atgKIRznY5
() автор топика
Ответ на: комментарий от peregrine

Установил так, если оттенок будет больше 200, то писать пиксель. Щас буквы уже пишуться, только теперь чтобы русские буквы написать, надо переводить utf-8, это же unicode?

u0atgKIRznY5
() автор топика
Ответ на: комментарий от u0atgKIRznY5

Но для мышления нормально, так подумать как можно сделать это, это.

Ты тут остальным задачку на подумать задаёшь, что ли? :-D

Гуглить не пробовал? Мне гугл выдал статью с примерами кода аж первой ссылкой. Правда, там предлагается выводить текст по одной букве, а значит без кернинга и лигатур.

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

Есть такой метод «постучаться в дурака»: смысл его в том что ты задаешь вопрос незнающему человеку, и пока ты становишься на его уровень и объясняешь по шагам о чем спрашиваешь, ты приходишь к результату «правильно заданный вопрос содержит половину ответа», у тебя все раскладывается по полочкам и ты находишь ответ. Тут же явно обратный метод, называемый «ум на халяву» - только он работает в случаях когда собеседники равного уровня познаний.

Silerus ★★★★
()
Ответ на: комментарий от i-rinat

У меня тоже по одной букве, я glTranslate использовал, чтобы перемещаться, и так буквы на разных расстояниях друг от друга стали.

Дай ссылку на пример.

Я в гугле что-то не помню искал или нет. А вот как utf-8 код буквы получить незнаю, вот этот пример

U8_NEXT ( ... )
выдаёт букву русскую 'а' как 430, а я помню где то здесь переписывались, и есть какой то способ чтобы другое число буквы получить. Но не помню где здесь, попробую поискать на форуме.

u0atgKIRznY5
() автор топика
Ответ на: комментарий от i-rinat

А нет, щас посмотрел таблицу символов, буква 'а' равняется 430.

u0atgKIRznY5
() автор топика

Как человек ничего не шарящий в opengl могу дать тебе совет. Запили шейдер, который по этой текстуре рисует текст нужного (произвольного) цвета.

pathfinder ★★★★
()
Ответ на: комментарий от linuhs_user

Да есть ttf, но мне нужны пиксели, чтобы выводить одинаковое изображение в размере на разных экранах. Если например вывести изображение в glDrawPixels, то оно будет рисовать пиксельно не учитывая glOrtho, также дело обстоит и с SDL2_image, там рисунки тоже рисуются не учитывая glOrtho. У меня все изображения пакуются в один файл. Также создаётся таблица, где указано, на какой позиции какой рисунок в файле. Потом загружаю рисунок указывая смещение. Шрифт тоже в файл добавлю, когда нужно будет, там видел можно из памяти шрифт получить, а не только из файла. Так думаю как логически правильно нужно составлять игру, чтобы всё чики пуки было.

u0atgKIRznY5
() автор топика
Ответ на: комментарий от pathfinder

Без шейдера пикселями рисует. Там же данные в оттенках, а если развернуть в два for ( ), по y и x, то нарисуется буква, надо ещё переворачивать, то есть y не с нуля начинать отсчитывать, а наоборот.

u0atgKIRznY5
() автор топика
Ответ на: комментарий от linuhs_user

О, придумал щас. Можно этот файл, в котором записаны смещения и названия файла использовать для поиска названия файла рисунка. Тогда в функцию можно будет передавать не смещение, а название файла, а функция будет получать смещение в data файле исходя из названия требуемоего рисунка.

u0atgKIRznY5
() автор топика
Ответ на: комментарий от linuhs_user

Рисуй прямоугольник тогда с текстурой, хз что ты там хочешь сделать.

У меня не получалось рисовать текстуру. Да всё, я пока забил на неё, на эту игру.

u0atgKIRznY5
() автор топика
Ответ на: комментарий от anonymous

Удобная. Зачем писать лишний код? Создал функцию SurfaceToOpenGLTexture и грузи картинки, текст итд

linuhs_user
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.