3 / 3 / 2
Регистрация: 19.02.2014
Сообщений: 142

SDL рваные текстуры

09.07.2015, 00:28. Показов 1556. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вечер добрый! В время наложения текстур в программе случайно обнаружил, что они иногда (так и не понял, с чем это связано) отображаются рваными. Интересно, что при первом отображении всё плохо, а при втором (на них сверху) - всё нормально, вот, как на картинке:
[cut]
Как это можно исправить?
Вот код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
unsigned int dLoadFont() {
    SDL_Surface *pngFontsL;
    unsigned int TempFont;
    
    pngFontsL = IMG_Load("nAlpha.png");
        
    glGenTextures(1, &TempFont);
    glBindTexture(GL_TEXTURE_2D, TempFont);
    glTexImage2D(   GL_TEXTURE_2D, 0, GL_RGB, pngFontsL -> w,
                    pngFontsL -> h, 0, GL_RGB,
                    GL_UNSIGNED_BYTE, pngFontsL -> pixels);
 
    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
 
    SDL_FreeSurface(pngFontsL);
 
    return TempFont;
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void dPrintSymbol(int xPos, int yPos, int Num) {
    glEnable(GL_TEXTURE_2D);
    
    glBegin(GL_QUADS);
        glVertex2f(xPos, yPos);
        glTexCoord2f(float(arLetRusCoord_low[Num - 1]) / 575, 1);
        glVertex2f(xPos, yPos + 15);
        glTexCoord2f(float(arLetRusWidth_low[Num - 1] + arLetRusCoord_low[Num - 1]) / 575, 1);
        glVertex2f(xPos + arLetRusWidth_low[Num - 1], yPos + 15);
        glTexCoord2f(float(arLetRusWidth_low[Num - 1] + arLetRusCoord_low[Num - 1]) / 575, 0);
        glVertex2f(xPos + arLetRusWidth_low[Num - 1], yPos);
        glTexCoord2f(float(arLetRusCoord_low[Num - 1]) / 575, 0);
    glEnd();
    
    glDisable(GL_TEXTURE_2D);
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
void RenderScene(void) {
    glClear(GL_COLOR_BUFFER_BIT);
    
    glBindTexture(GL_TEXTURE_2D, dFont);
        
    dPrintSymbol(50, 50, 1);    
    dPrintSymbol(60, 50, 2);    
    dPrintSymbol(70, 50, 3);
    
    glFlush();
}
 
int main(int argc, char **argv) {
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA);
    glutInitWindowPosition(100,100);
    glutInitWindowSize(700,650);
    glutCreateWindow("Test");
    
    glClearColor(0.9, 0.9, 0.9, 1.0);
    glMatrixMode(GL_PROJECTION);
    gluOrtho2D(0.0, 700.0, 700.0, 0.0);
 
    dFont = dLoadFont();
 
    glutDisplayFunc(RenderScene);
    glutReshapeFunc(ChangeSize);
    glutMainLoop();
}
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
09.07.2015, 00:28
Ответы с готовыми решениями:

Почему при наложении текстуры изменяется цвет фигур без текстуры
Исходный вид, когда текстура не накладывалась (рис-1). После наложения текстуры на одну из фигур изменился цвет второй фигуры (рис-2). ...

Как побитово скопировать с текстуры на текстуры разных форматов, не прибегая к обращениям в CPU?
Если ли способ в opengl скопировать бит в бит текстуры любого формата в uint8 одноканальный, но с расширенной шириной? Да кстати нужно...

SDL 2.0. Как узнать координаты вершин вращаемой прямоугольной текстуры?
Собственно возник вопрос в процессе освоения, есть функция рендеринга с поворотом текстуры SDL_RenderCopyEx, однако для детектирования...

18
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
09.07.2015, 23:08
Возможно это как-то связано с координатами текстуры. Что такое arLetRusWidth_low и arLetRusCoord_low? Я не вижу чтобы программа как-то заполняла этот массив.
0
3 / 3 / 2
Регистрация: 19.02.2014
Сообщений: 142
09.07.2015, 23:48  [ТС]
Извиняюсь, не дописал:
C++
1
2
3
4
5
6
7
8
9
10
short arLetRusWidth_low[33] = {
    8, 9, 9, 8, 11, 9, 9, 16, 8, 9, 9, 
    9, 10, 10, 8, 9, 8, 9, 8, 8, 10, 14,
    10, 9, 8, 16, 17, 11, 11, 8, 8, 12, 9
};
short arLetRusCoord_low[33] = {
    0, 16, 33, 49, 63, 82, 99, 115, 138, 153, 170, 
    187, 204, 222, 241, 258, 275, 292, 309, 324, 339, 356,
    377, 394, 412, 429, 452, 475, 494, 514, 530, 545, 566
};
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
10.07.2015, 00:04
Нет, с координатами текстуры это не связано. Можешь выложить сам nAlpha.png? (через расширенный режим, вложения)
На данный момент мне кажется что это какой-то глюк SDL...
0
3 / 3 / 2
Регистрация: 19.02.2014
Сообщений: 142
10.07.2015, 00:48  [ТС]
Вот.
Миниатюры
SDL рваные текстуры  
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
10.07.2015, 20:43
Какая версия SDL?
0
3 / 3 / 2
Регистрация: 19.02.2014
Сообщений: 142
11.07.2015, 01:53  [ТС]
1.2, пробовал ставить 2 - то же самое.
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
11.07.2015, 14:29
Только что обратил внимание, что из SDL тут у тебя только SDL_Surface и SDL_FreeSurface, а всё остальное GLUT.
Зачем тебе GLUT, если есть более современная и SDL?
Где кроется проблема пока не знаю, возможно в "волшебных" числах типа 575, в которые не хочется вникать.
Для решения проблемы предлагаю избавится от GLUT и перейти полностью на SDL, после этого привести минимальный код, воспроизводящий проблему.
0
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
12.07.2015, 11:33
Цитата Сообщение от Devilox Посмотреть сообщение
(так и не понял, с чем это связано) отображаются рваными.
Может попробовать шрифт на Glut без SDL? =)
0
3 / 3 / 2
Регистрация: 19.02.2014
Сообщений: 142
12.07.2015, 11:57  [ТС]
Excalibur921, всмысле, glut ведь не поддерживает текстуры. С freeglut-ом я пробовал и freeimage - то же самое.

Добавлено через 6 минут
castaway, теперь проблема другая возникла: IMG_Load почему-то пишет Unsupported format, хотя я и libpng установил, и zlib, ставил с офф. сайта: почему-то файл configure распределяет библиотеки в /usr/local, когда у меня среда ищет в /usr, исправить этот файл получилось только для libpng, а для zlib он вообще игнорируется, и всё ставится в /usr/local. Попробовал команды отсюда: http://askubuntu.com/questions... g-and-zlib - терминал пишет, что библиотеки уже установлены, пытаюсь их же удалить - пишет, что ничего не удалено. Есть ещё способ всё установить?
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
12.07.2015, 12:14
Я в Linux не силён, всё зависит от дистрибутива.
Если собирать собственноручно, то префикс можно указать так:
Bash
1
./configure --prefix=/usr
0
3 / 3 / 2
Регистрация: 19.02.2014
Сообщений: 142
12.07.2015, 13:26  [ТС]
Теперь всё установилось, куда надо, но всё равно .png не грузится. Ну и фиг с ним, .bmp хотя бы работает. Вот только рваные текстуры так и остались. По поводу массивов arLetRusWidth_low и arLetRusCoord_low - это ширина и X-координата букв в текстуре соответственно.
C++
1
2
3
4
5
6
7
8
9
10
short arLetRusWidth_low[33] = {
    8, 9, 9, 8, 11, 9, 9, 16, 8, 9, 9, 
    9, 10, 10, 8, 9, 8, 9, 8, 8, 10, 14,
    10, 9, 8, 16, 17, 11, 11, 8, 8, 12, 9
};
short arLetRusCoord_low[33] = {
    0, 16, 33, 49, 63, 82, 99, 115, 138, 153, 170, 
    187, 204, 222, 241, 258, 275, 292, 309, 324, 339, 356,
    377, 394, 412, 429, 452, 475, 494, 514, 530, 545, 566
};
"Загадочные" числа 575 - это ширина текстуры, я делю на них для получения координат нужной буквы на текстуре.
Интересное свойство наблюдается: если вывести кучу одинаковых букв - всё нормально, если же двигаться по текстуре, меняя буквы, получается ересь.
Код загрузки:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
int main(int argc, char* argv[]) {
    SDL_Window* Window = NULL;
    SDL_GLContext Context;
    SDL_Surface* pngFont = NULL;
    
    if (SDL_Init(SDL_INIT_VIDEO) < 0) {
        std :: cout << "Lol! " << SDL_GetError() << std :: endl;
        
        return 1;
    } else {
        SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
        Window = SDL_CreateWindow(  "Test Window",
                                    SDL_WINDOWPOS_UNDEFINED,
                                    SDL_WINDOWPOS_UNDEFINED,
                                    600, 600, 
                                    SDL_WINDOW_OPENGL);
                
        if (Window == NULL) {
            std :: cout << "Lol " << SDL_GetError() << std :: endl;
            
            return 1;
        } else {
            pngFont = SDL_LoadBMP("TestFont.bmp");
            if (pngFont == NULL) {
                std :: cout << SDL_GetError() << std :: endl;
            }
            Context = SDL_GL_CreateContext(Window);
            
            //------------------------------------------------------------------//
            
            unsigned int dFont;
            glGenTextures(1, &dFont);
            glBindTexture(GL_TEXTURE_2D, dFont);
            glTexImage2D(   GL_TEXTURE_2D, 0, GL_RGB, 
                            pngFont -> w, pngFont -> h, 0, GL_RGB,
                            GL_UNSIGNED_BYTE, pngFont -> pixels);
 
            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
            
            glClearColor(0.9, 0.9, 0.9, 1.0);
            glMatrixMode(GL_PROJECTION);
            gluOrtho2D(0.0, 700.0, 700.0, 0.0);
            glClear(GL_COLOR_BUFFER_BIT);
            
            //---Текстуры рвутся---//
            dPrintSymbol(50, 50, 1);    
            dPrintSymbol(65, 50, 2);
            dPrintSymbol(80, 50, 3);
            dPrintSymbol(95, 50, 4);
            dPrintSymbol(110, 50, 5);
            //---Текстуры рвутся---//
 
            //--Текстуры не рвутся--//
            dPrintSymbol(50, 50, 1);    
            dPrintSymbol(65, 50, 1);
            dPrintSymbol(80, 50, 1);
            dPrintSymbol(95, 50, 1);
            dPrintSymbol(110, 50, 1);
            //--Текстуры не рвутся--//
 
            SDL_GL_SwapWindow(Window);
        
            SDL_Delay(3000);
            
            //------------------------------------------------------------------//
        }
    }
    
    SDL_FreeSurface(pngFont);
    SDL_GL_DeleteContext(Context);
    SDL_DestroyWindow(Window);  
    SDL_Quit();
    
    return 0;
}
Код вывода букв:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void dPrintSymbol(int xPos, int yPos, int Num) {
    glEnable(GL_TEXTURE_2D);
    
    glBegin(GL_QUADS);
        glVertex2f(xPos, yPos);
        glTexCoord2f(float(arLetRusCoord_low[Num - 1]) / 575, 1);
        glVertex2f(xPos, yPos + 15);
        glTexCoord2f(float(arLetRusWidth_low[Num - 1] + arLetRusCoord_low[Num - 1]) / 575, 1);
        glVertex2f(xPos + arLetRusWidth_low[Num - 1], yPos + 15);
        glTexCoord2f(float(arLetRusWidth_low[Num - 1] + arLetRusCoord_low[Num - 1]) / 575, 0);
        glVertex2f(xPos + arLetRusWidth_low[Num - 1], yPos);
        glTexCoord2f(float(arLetRusCoord_low[Num - 1]) / 575, 0);
    glEnd();
    
    glDisable(GL_TEXTURE_2D);
}
Изображения
  
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
12.07.2015, 13:47
Я попробую запустить у себя когда буду дома.
0
Диванный эксперт
Эксперт С++
 Аватар для Max Dark
2550 / 2062 / 971
Регистрация: 09.10.2013
Сообщений: 4,790
Записей в блоге: 4
12.07.2015, 13:51
Цитата Сообщение от Devilox Посмотреть сообщение
Есть ещё способ всё установить?
из исходников стоит ставить если вы реально понимаете что делаете, а так все устанавливается из репозиториев
вам нужны dev версии пакетов:
Bash
1
2
3
4
sudo apt-get install libpng-dev
sudo apt-get install zlib1g-dev
sudo apt-get install libsdl-image1.2-dev # для libsdl-1.2
sudo apt-get install libsdl2-image-dev # для libsdl-2
1
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
12.07.2015, 13:57
А если вывести не первую букву несколько раз, что получается?
0
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
12.07.2015, 14:09
Цитата Сообщение от Devilox Посмотреть сообщение
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
Почему две?
1)найти готовый пример изменить
2)в глут был текст без текстур не помню как именно
3)Есть и текстурами пишут сами
0
3 / 3 / 2
Регистрация: 19.02.2014
Сообщений: 142
12.07.2015, 15:00  [ТС]
Cra3y, спасибо, всё заработало.
castaway, если другие выводить, то первый вывод кривой, а последующие - нормально. Картинки приложил.
Excalibur921, В этих строках различия GL_TEXTURE_MIN_FILTER и GL_TEXTURE_MAG_FILTER, я только готовые примеры и использовал, никакой самодеятельности. А текст мне нужен именно текстурный, чтобы впоследствии легко печатать символы типа интегралов, сумм и т. д.
Изображения
  
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
12.07.2015, 15:06
Лучший ответ Сообщение было отмечено Devilox как решение

Решение

Одна для MIN, вторая для MAG.

Добавлено через 5 минут
Ёлки-палки, попробуй поменять местами glVertex3f и glTexCoord2f.
1
3 / 3 / 2
Регистрация: 19.02.2014
Сообщений: 142
12.07.2015, 15:17  [ТС]
Блииин, вот же я лохонулся. Спасибо, теперь текстуры нормально отображаются
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.07.2015, 15:17
Помогаю со студенческими работами здесь

Как вывести текст на экран, используя библиотеку SDL TTF для SDL 2?
В официальной доке как-то скомкано написано. При инициализации SDL TTF и при загрузке шрифта ошибок нет. Но текст на экране не...

Рваные массивы. Индексация [1][0].
Добрый день! Привет всем! Помогите пожалуйста! Зарание спасибо! В С # индексация начинается с нуля, но в некоторых языках...

Рваные пакеты с com порта, DataRecieved
Здравствуйте прошу помочь. Проблема заключается в следующем. Есть устройство с постоянной трансляцией в порт данных. Слушаю порт с...

Поворот Текстуры (не вращая полигон текстуры)
Возник такой вопрос? Как повернуть текстуру на какой то определенный градус не вращая при этом полигон на который мы ее накладываем!...

SDL 2.0
Меня очень заинтересовала библиотека SDL. Расскажите пожалуйста, в чём её особенность, для каких целей она используется, какие у неё...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Опции темы

Новые блоги и статьи
Angular vs Svelte - что лучше?
Reangularity 09.07.2025
Сегодня рынок разделился на несколько четких категорий: тяжеловесы корпоративного уровня (Angular), гибкие универсалы (React), прогрессивные решения (Vue) и новая волна компилируемых фреймворков. . .
Code First и Database First в Entity Framework
UnmanagedCoder 09.07.2025
Entity Framework дает нам свободу выбора, предлагая как Code First, так и Database First подходы. Но эта свобода порождает вечный вопрос — какой подход выбрать? Entity Framework — это. . .
Как использовать Bluetooth-модуль HC-05 с Arduino
Wired 08.07.2025
Bluetooth - это технология, созданная чтобы заменить кабельные соединения. Обычно ее используют для связи небольших устройств: мобильных телефонов, ноутбуков, наушников и т. д. Работает она на частоте. . .
Руководство по структурам данных Python
AI_Generated 08.07.2025
Я отчетливо помню свои первые серьезные проекты на Python - я писал код, он работал, заказчики были относительно довольны. Но однажды мой наставник, взглянув на мою реализацию поиска по огромному. . .
Тестирование энергоэффективности и скорости вычислений видеокарт в BOINC проектах
Programma_Boinc 08.07.2025
Тестирование энергоэффективности и скорости вычислений видеокарт в BOINC проектах Опубликовано: 07. 07. 2025 Рубрика: Uncategorized Автор: AlexA Статья размещается на сайте с разрешения. . .
Раскрываем внутренние механики Android с помощью контекста и манифеста
mobDevWorks 07.07.2025
Каждый Android-разработчик сталкивается с Context и манифестом буквально в первый день работы. Но много ли мы задумываемся о том, что скрывается за этими обыденными элементами? Я, честно говоря,. . .
API на базе FastAPI с Python за пару минут
AI_Generated 07.07.2025
FastAPI - это относительно молодой фреймворк для создания веб-API, который за короткое время заработал бешеную популярность в Python-сообществе. И не зря. Я помню, как впервые запустил приложение на. . .
Основы WebGL. Раскрашивание вершин с помощью VBO
8Observer8 05.07.2025
На русском https:/ / vkvideo. ru/ video-231374465_456239020 На английском https:/ / www. youtube. com/ watch?v=oskqtCrWns0 Исходники примера:
Мониторинг микросервисов с OpenTelemetry в Kubernetes
Mr. Docker 04.07.2025
Проблема наблюдаемости (observability) в Kubernetes - это не просто вопрос сбора логов или метрик. Это целый комплекс вызовов, которые возникают из-за самой природы контейнеризации и оркестрации. К. . .
Проблемы с Kotlin и Wasm при создании игры
GameUnited 03.07.2025
В современном мире разработки игр выбор технологии - это зачастую балансирование между удобством разработки, переносимостью и производительностью. Когда я решил создать свою первую веб-игру, мой. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru