Четверг, 28 Марта 2024, 14:18

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 2
  • 1
  • 2
  • »
Форум игроделов » Программирование » C/C++ » какой то глюк в opengl чтоли.
какой то глюк в opengl чтоли.
afqДата: Понедельник, 06 Января 2020, 04:08 | Сообщение # 1
Разработчик
Сейчас нет на сайте
никто не знает что это такое. линии где кнопки. они того же цвета что и шрифт. но код вроде нормальный.
drcrackДата: Понедельник, 06 Января 2020, 06:35 | Сообщение # 2
старожил
Сейчас нет на сайте
https://discord.gg/PAp3DjT
англоязычный дискорд по программированию графики
спрашивай там если действительно хочешь получить внятный ответ на вопрос типо этой темы
afqДата: Понедельник, 06 Января 2020, 06:42 | Сообщение # 3
Разработчик
Сейчас нет на сайте
drcrack, спасибо.
XakepДата: Понедельник, 06 Января 2020, 10:48 | Сообщение # 4
めちゃくちゃちゃ
Сейчас нет на сайте
код хоть покажи, так только гадать можно что не так. Попробуй отрендерить текст без текстур (черные квадраты либо разноцветные), вдруг где-то вершина заблудилась, либо лишнея вершина, на первый взгляд - ты не правильно формируешь прямоугольники.
afqДата: Понедельник, 06 Января 2020, 16:56 | Сообщение # 5
Разработчик
Сейчас нет на сайте
Xakep, не может быть. вот смотри. я создаю область куда наложить текстуру. эта область проверена. с помощью неё я рисую и прямоугольники и другие спрайты. то есть я создаю область для вершин и область для текстуры. вот так.
Код

void Font::word_set_size ( struct word *word, int w, int h ) {
        if ( !word->vertex ) word->vertex = new float [ 12 ];
        if ( !word->texture ) word->texture = new float [ 12 ];

        word->vertex[0] = 0;
        word->vertex[1] = 0;
        word->vertex[2] = 0;
        word->vertex[3] = h;
        word->vertex[4] = w;
        word->vertex[5] = 0;
        word->vertex[6] = w;
        word->vertex[7] = 0;
        word->vertex[8] = w;
        word->vertex[9] = h;
        word->vertex[10] = 0;
        word->vertex[11] = h;

        word->texture[0] = 0;
        word->texture[1] = 1;
        word->texture[2] = 0;
        word->texture[3] = 0;
        word->texture[4] = 1;
        word->texture[5] = 1;
        word->texture[6] = 1;
        word->texture[7] = 1;
        word->texture[8] = 1;
        word->texture[9] = 0;
        word->texture[10] = 0;
        word->texture[11] = 0;
}

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

void Font::build_texture ( struct word *w ) {
        unsigned int size = w->width * 4 * w->height;
        unsigned char *data = (unsigned char *) calloc ( size, 1 );

        for ( unsigned int i = 0, y = 0; y < w->height; y++ ) {
                for ( int x = 0; x < w->width; x++ ) {
                        data [ 4 * i + 3 ] = w->w [ i ];
                        data [ 4 * i + 0 ] = ( w->color >> 16 & 0xff );
                        data [ 4 * i + 1 ] = ( w->color >>  8 & 0xff );
                        data [ 4 * i + 2 ] = ( w->color >>  0 & 0xff );
                        i++;
                }
        }

        if ( w->textureid > 0 ) glDeleteTextures ( 1, &w->textureid );

        glGenTextures ( 1, &w->textureid );
        glBindTexture ( GL_TEXTURE_2D, w->textureid );
        glTexImage2D ( GL_TEXTURE_2D, 0, GL_RGBA, w->width, w->height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data );

#if 0
        glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
        glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
#endif
        glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
        glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );

        free ( data );

        word_set_size ( w, w->width, w->height );
}

для каждой буквы создаётся своя текстура и свои вершины и текстуры с нужными размерами.
а потом это всё выводиться в буфер или на экран как правильно?
Код

void Font::draw ( ) {
        glUseProgram ( this->program );

        glActiveTexture ( GL_TEXTURE0 );
        glEnableVertexAttribArray ( 0 );
        glEnableVertexAttribArray ( 1 );
        for ( int i = 0; i < this->size_of_word; i++ ) {
                struct word *w = &this->word[i];
                glBindTexture ( GL_TEXTURE_2D, w->textureid );
                glUniform1i ( this->sampler_location, 0 );

                glUniformMatrix4fv ( this->transform_location, 1, GL_FALSE, &w->translate[0][0] );
                glUniformMatrix4fv ( this->proj_location, 1, GL_FALSE, &this->proj[0][0] );

                glVertexAttribPointer ( 0, 2, GL_FLOAT, GL_FALSE, 0, w->vertex );
                glVertexAttribPointer ( 1, 2, GL_FLOAT, GL_FALSE, 0, w->texture );

                glDrawArrays ( GL_TRIANGLES, 0, 12 );
        }
        glDisableVertexAttribArray ( 0 );
        glDisableVertexAttribArray ( 1 );
}
DivESДата: Понедельник, 06 Января 2020, 17:06 | Сообщение # 6
заслуженный участник
Сейчас нет на сайте
Цитата afq ()
для каждой буквы создаётся своя текстура и свои вершины и текстуры с нужными размерами

Есть большая необходимость всё так усложнять? :D
OpenGL не может в вывод текста?
afqДата: Понедельник, 06 Января 2020, 17:16 | Сообщение # 7
Разработчик
Сейчас нет на сайте
DivES, не знаю. вроде нет. по крайней мере в opengl es 3.0 и далее нет таких функций glRaster*, и т.д. или ты знаешь как вывести текст с помощью opengl? я видел ещё примеры и все они наточены на то, чтобы выводить текст и запрограммированы по разному. то есть скорее всего да, opengl не может вывести текст сразу, надо подготовить ресурсы.
nadgobonomДата: Понедельник, 06 Января 2020, 17:38 | Сообщение # 8
уже был
Сейчас нет на сайте
Цитата DivES ()
OpenGL не может в вывод текста?

ГАПИ тут причём?

Добавлено (06 Января 2020, 17:40)
---------------------------------------------

Цитата afq ()
не знаю. вроде нет. по крайней мере в opengl es 3.0 и далее нет таких функций glRaster*, и т.д. или ты знаешь как вывести текст с помощью opengl? я видел ещё примеры и все они наточены на то, чтобы выводить текст и запрограммированы по разному. то есть скорее всего да, opengl не может вывести текст сразу, надо подготовить ресурсы.

В атлас шрифт засунь и выводи прямоугольники с батчингом.
afqДата: Понедельник, 06 Января 2020, 17:42 | Сообщение # 9
Разработчик
Сейчас нет на сайте
nadgobonom,
Цитата
В атлас шрифт засунь и выводи прямоугольники с батчингом.

это как?
XakepДата: Понедельник, 06 Января 2020, 18:27 | Сообщение # 10
めちゃくちゃちゃ
Сейчас нет на сайте
в glVertexAttribPointer ты задаешь 2 компонента для вершины, следовательно у тебя на один квад идет вместо 4х вершин - 6. Отсюда могут быть и проблемы.
https://www.khronos.org/registr....r.xhtml

Добавлено (06 Января 2020, 18:56)
---------------------------------------------
Цитата afq ()
это как?

это вот так:



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

Добавлено (06 Января 2020, 19:06)
---------------------------------------------
Код

        for ( unsigned int i = 0, y = 0; y < w->height; y++ ) {
                for ( int x = 0; x < w->width; x++ ) {
                        data [ 4 * i + 3 ] = w->w [ i ];
                        data [ 4 * i + 0 ] = ( w->color >> 16 & 0xff );
                        data [ 4 * i + 1 ] = ( w->color >>  8 & 0xff );
                        data [ 4 * i + 2 ] = ( w->color >>  0 & 0xff );
                        i++;
                }
        }


Зачем так сложно-то, тебе на что шейдеры даны )) в шейдере это в одну строку делается:
Код

#version 410 core

out vec4 fragColor;
in vec2 texCoord;

uniform sampler2D utexture;
uniform vec4 color;

void main() {
    vec4 tex = texture(utexture, texCoord);
    fragColor = tex * color; // Вот эта строчка
}


Сообщение отредактировал Xakep - Понедельник, 06 Января 2020, 19:06
afqДата: Понедельник, 06 Января 2020, 19:36 | Сообщение # 11
Разработчик
Сейчас нет на сайте
Xakep,
по поводу твоего шейдера. я не очень понял совет. тот код, который я привел, там
Код

                        data [ 4 * i + 3 ] = w->w [ i ];

здесь я задаю aplha канал. а в остальные компоненты цвет rgb. а твой пример не понял. что если текстуру умножить на цвет, а откуда я цвет возьму? ведь у каждого пикселя буквы свой aplha цвет.
afqДата: Понедельник, 06 Января 2020, 19:39 | Сообщение # 12
Разработчик
Сейчас нет на сайте
Xakep,
Цитата
в glVertexAttribPointer ты задаешь 2 компонента для вершины, следовательно у тебя на один квад идет вместо 4х вершин - 6. Отсюда могут быть и проблемы.

точно могут быть проблемы? я в шейдере принимаю vec2 и преобразую к vec3. вот так.
Код

#version 300 es
layout ( location = 0 ) in vec2 position;
layout ( location = 1 ) in vec2 texCoord;
uniform mat4 transform;
uniform mat4 ortho;
out vec2 v_tex_coord;
void main ( )
{
        gl_Position = ortho * transform * vec4 ( position, 0.0, 1.0 );
        v_tex_coord = texCoord;
}
XakepДата: Понедельник, 06 Января 2020, 21:23 | Сообщение # 13
めちゃくちゃちゃ
Сейчас нет на сайте
Цитата afq ()
точно могут быть проблемы? я в шейдере принимаю vec2 и преобразую к vec3. вот так.

Ну вообще может, но я сейчас понял почему так сделано, я привык использовать `GL_TRIANGLE_STRIP`, а у тебя `GL_TRIANGLES`, т.е. ты рисуешь 2 треугольника, а треугольник определяется 3мя вершинами, отсюда и 6 вершин вместо 4х. Я бы все таки на твоем месте, попробовал посмотреть на полную геометрию, которая получается у твоих прямоугольников (закрасить все одним цветом, через тот же шейдер fragColor = vec4(0,0,0,1); ).

Цитата afq ()
по поводу твоего шейдера. я не очень понял совет. тот код, который я привел, там

код: tex * color; означает, что ты каждый пиксель текстуры умножаешь на переданный в шейдер uniform цвет (также как ты передаешь матрицу и текстуру), обычно текстуру для шрифтов делают прозрачной и белой. При умножении белого пикселя на черный к примеру, получаем черный (1.0 * 0), при умножении на красный, получаем красный, т.к. (1.0, 1.0, 1.0, 1.0) * (1.0, 0.0, 0.0, 1.0) получится собственно красный цвет. Таким образом легко задавать цвета тексту. Также легко реализовать шейдер, который меняет цвет всей текстуры.

Добавлено (06 Января 2020, 21:30)
---------------------------------------------
Пример без изменения цвета текстуры:

Код

#version 410 core

precision highp float;
out vec4 fragColor;
in vec2 texCoord;

uniform sampler2D utexture;

void main() {
    vec4 tex = texture(utexture, texCoord);
    fragColor = tex;
}




Теперь можно умножить на константу:

Код

#version 410 core

precision highp float;
out vec4 fragColor;
in vec2 texCoord;

uniform sampler2D utexture;

void main() {
    vec4 tex = texture(utexture, texCoord);
    fragColor = tex * vec4(0.8, 0.3, 0.3, 1);
}


Добавлено (06 Января 2020, 21:32)
---------------------------------------------
Если же просто передать в `fragColor` цвет, то весь прямоугольник зальется этим цветом: `fragColor = vec4(0.8, 0.3, 0.3, 1);`

afqДата: Понедельник, 06 Января 2020, 22:15 | Сообщение # 14
Разработчик
Сейчас нет на сайте
Xakep, а понятно. цвет текстуры умножается на оттенок. получается ну типа оттенка. ну я понял, даже если не правильно объяснил.
afqДата: Вторник, 07 Января 2020, 02:38 | Сообщение # 15
Разработчик
Сейчас нет на сайте
Xakep, уменьшил размер кнопок и линии исчезли. я уже обрадывался. а потом запустил ещё раз и линии появились. ошибка наблюдается только при создании кнопок. если кнопки создать, но не рисовать, то ошибка наблюдается. если кнопки вообще не создавать, то ошибки не видно. в кнопке есть объекты: box и font. box - отвечает за вывод например прямоугольника. но в коде вроде тоже все нормально. блин. если не получиться исправить, то придется переходить на unity.
XakepДата: Вторник, 07 Января 2020, 09:21 | Сообщение # 16
めちゃくちゃちゃ
Сейчас нет на сайте
afq, если скинешь весь код, могу попробовать у себя скомпилировать.

Добавлено (07 Января 2020, 09:31)
---------------------------------------------

Цитата afq ()
если не получиться исправить, то придется переходить на unity

ничего плохого в этом не вижу :)
afqДата: Вторник, 07 Января 2020, 18:26 | Сообщение # 17
Разработчик
Сейчас нет на сайте
Xakep, всё выложил код. github

только я пока в коде не делал удаление объектов, потому что пока на этапе меню зациклился и рисования. может даже код заценишь. но вряд ли. ты ведь хотел только запустить. ну а так если поймешь код, то может совет какой нибудь дашь. ) ладно, все.
afqДата: Среда, 08 Января 2020, 07:28 | Сообщение # 18
Разработчик
Сейчас нет на сайте
Xakep, ну когда же ты проверишь? У тебя доступ к компьтеру чтоли ограничен? :)
drcrackДата: Среда, 08 Января 2020, 10:40 | Сообщение # 19
старожил
Сейчас нет на сайте
Цитата
блин. если не получиться исправить, то придется переходить на unity.

если бы сразу на юнити начал — уже бы игру релизил :D
XakepДата: Среда, 08 Января 2020, 10:42 | Сообщение # 20
めちゃくちゃちゃ
Сейчас нет на сайте
Цитата afq ()
Xakep, ну когда же ты проверишь? У тебя доступ к компьтеру чтоли ограничен? :)

Вероятно у нас разные часовые пояса, я спал. Отправил тебе пулл реквест и оставил пару комметариев.

Добавлено (08 Января 2020, 10:48)
---------------------------------------------

Цитата drcrack ()
если бы сразу на юнити начал — уже бы игру релизил :D

Да, это однозначно так ) если цель создать игру, то лучше выбрать движок, не обязательно Unity, мне Game Maker Studio нравится. Но может человеку интересно именно свой движок написать, понять как это работает, тогда нет никаких проблем, можно многому научиться.
Форум игроделов » Программирование » C/C++ » какой то глюк в opengl чтоли.
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг