Форум программистов, компьютерный форум, киберфорум
Наши страницы

OpenGL

Войти
Регистрация
Восстановить пароль
 
DevilRigoll
1 / 1 / 1
Регистрация: 09.04.2014
Сообщений: 57
#1

Квадраты вместо букв при отрисовке текста - OpenGL

27.01.2017, 18:06. Просмотров 243. Ответов 1
Метки нет (Все метки)

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

Квадраты вместо букв при отрисовке текста

text2D.h
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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
class Text2D {
private:
    GLuint vertex_buffer;
    GLuint uv_buffer;
    GLuint uniformId;
    GLuint shaderId;
    GLuint VAO;
    Texture *texture;
    //unsigned int Text2DTextureID;
public:
    Text2D(const char * text_dds_path) {
        glGenVertexArrays(1, &VAO);
        glBindVertexArray(VAO);
        texture = new Texture(GL_TEXTURE_2D, text_dds_path);
        //Text2DTextureID = loadDDS(text_dds_path);
 
        glGenBuffers(1, &vertex_buffer);
        glGenBuffers(1, &uv_buffer);
 
        shaderId = LoadShaders("C:/Users/DevilRigoll/Desktop/Game GUI/fonts/Text.vertexshader", 
                               "C:/Users/DevilRigoll/Desktop/Game GUI/fonts/Text.fragmentshader");  //LoadShaders(pVS, pFS);
 
        uniformId = glGetUniformLocation(shaderId, "myTextureSampler");
        glBindVertexArray(0);
    };
    ~Text2D() {
        //if (vertex_buffer != 0) {
            glDeleteBuffers(1, &vertex_buffer);
            glDeleteBuffers(1, &uv_buffer);
        //}
        if (texture != NULL)
            delete texture;
 
        glDeleteProgram(shaderId);
        glDeleteVertexArrays(1,&VAO);
        VAO = 0;
    }
    void print(std::string text, glm::vec2 pos, GLuint size, glm::vec4 color);
    void clear_text();
};
 
void Text2D::print(std::string text, glm::vec2 pos, GLuint size, glm::vec4 color) {
 
    std::vector<glm::vec2> vertices;
    std::vector<glm::vec2> UVs;
 
    for (size_t i = 0; i < text.size(); i++){
 
        glm::vec2 vertex_up_left = glm::vec2(pos.x + i*size, pos.y + size);
        glm::vec2 vertex_up_right = glm::vec2(pos.x + i*size + size, pos.y + size);
        glm::vec2 vertex_down_right = glm::vec2(pos.x + i*size + size, pos.y);
        glm::vec2 vertex_down_left = glm::vec2(pos.x + i*size, pos.y);
 
        vertices.push_back(vertex_up_left);
        vertices.push_back(vertex_down_left);
        vertices.push_back(vertex_up_right);
 
        vertices.push_back(vertex_down_right);
        vertices.push_back(vertex_up_right);
        vertices.push_back(vertex_down_left);
 
        char character = text[i];
        float uv_x = (character % 16) / 16.0f;
        float uv_y = (character / 16) / 16.0f;
 
        glm::vec2 uv_up_left = glm::vec2(uv_x, uv_y);
        glm::vec2 uv_up_right = glm::vec2(uv_x + 1.0f / 16.0f, uv_y);
        glm::vec2 uv_down_right = glm::vec2(uv_x + 1.0f / 16.0f, uv_y + 1.0f / 16.0f);
        glm::vec2 uv_down_left = glm::vec2(uv_x, uv_y + 1.0f / 16.0f);
 
 
        UVs.push_back(uv_up_left);
        UVs.push_back(uv_down_left);
        UVs.push_back(uv_up_right);
 
        UVs.push_back(uv_down_right);
        UVs.push_back(uv_up_right);
        UVs.push_back(uv_down_left);
    }
 
 
    glBindVertexArray(VAO);
 
    glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer);
    glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(glm::vec2), &vertices[0], GL_STATIC_DRAW);
    glBindBuffer(GL_ARRAY_BUFFER, uv_buffer);
    glBufferData(GL_ARRAY_BUFFER, UVs.size() * sizeof(glm::vec2), &UVs[0], GL_STATIC_DRAW);
 
 
    glUseProgram(shaderId);
 
    texture->bind(GL_TEXTURE0);
 
    glUniform1i(uniformId, 0);
 
    glEnableVertexAttribArray(0);
    glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer);
    glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, (void*)0);
 
    glEnableVertexAttribArray(1);
    glBindBuffer(GL_ARRAY_BUFFER, uv_buffer);
    glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, (void*)0);
 
 
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
 
 
    glDrawArrays(GL_TRIANGLES, 0, vertices.size());
 
    glDisable(GL_BLEND);
 
    glDisableVertexAttribArray(0);
    glDisableVertexAttribArray(1);
 
    glBindVertexArray(0);
}
main.cpp
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
...
 
do{
 
        // Measure speed
        double currentTime = glfwGetTime();
        nbFrames++;
        if (currentTime - lastTime >= 1.0){ // If last prinf() was more than 1sec ago
            // printf and reset
            printf("%f ms/frame\n", 1000.0 / double(nbFrames));
            nbFrames = 0;
            lastTime += 1.0;
        }
 
 
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 
        
        //camera controller
        computeMatricesFromInputs();
        glm::mat4 ProjectionMatrix = getProjectionMatrix();
        glm::mat4 ViewMatrix = getViewMatrix();
 
 
        glUseProgram(programID);
 
        glm::vec3 lightPos = glm::vec3(4, 4, 4);
        glUniform3f(LightID, lightPos.x, lightPos.y, lightPos.z);
        glUniformMatrix4fv(ViewMatrixID, 1, GL_FALSE, &ViewMatrix[0][0]); 
 
        glm::mat4 ModelMatrix1 = glm::mat4(1.0);
        glm::mat4 MVP1 = ProjectionMatrix * ViewMatrix * ModelMatrix1;
 
 
        glUniformMatrix4fv(MatrixID, 1, GL_FALSE, &MVP1[0][0]);
        glUniformMatrix4fv(ModelMatrixID, 1, GL_FALSE, &ModelMatrix1[0][0]);
 
 
        glUniform1i(textureID, 0);
 
        mesh->render();
 
        text->print(std::string("good game!!!"), glm::vec2(50, 50), 50, glm::vec4(1, 1, 1, 1));
 
        glfwSwapBuffers(main_window);
        glfwPollEvents();
 
    } // Check if the ESC key was pressed or the window was closed
    while (glfwGetKey(main_window, GLFW_KEY_ESCAPE) != GLFW_PRESS &&
        glfwWindowShouldClose(main_window) == 0);
...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.01.2017, 18:06
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Квадраты вместо букв при отрисовке текста (OpenGL):

Белый экран при пиксельной отрисовке - OpenGL
5-ый час уже сижу и никак не могу понять, почему у меня тупо висит белый экран. Вот так я вывожу: void display(int x, int y, GLuint...

Артефакты при отрисовке прозрачного куба - OpenGL
Добрый день! Столкнулся со следующей проблемой: при отрисовке прозрачного куба возникают неожиданные пропажи некоторых его частей при...

Использование нескольких текстур при отрисовке - OpenGL
Пытаюсь нарисовать 2 текстуры в 1 шейдерной программе, но не получается. //Подготовка к использованию текстур texture_id =...

Реализовать паузу в отрисовке - OpenGL
Привет всемогущий All, попиксельно заполняю экран (циклом), нужно чтоб заполнялся визуально медленно, а не махом, это первое, и второе:...

Квадраты вместо букв - Ubuntu Linux
Проблема в следующем: стоит Ubuntu Server 11.04, но вместо кириллицы отображаются белые квадраты. Решила исправить следующей командой &quot;$...

Квадраты, вместо русских букв - Windows
Привет всем! У меня такая проблема

1
koker007
14 / 17 / 0
Регистрация: 04.08.2015
Сообщений: 311
Завершенные тесты: 2
31.01.2017, 03:55 #2
Цитата Сообщение от DevilRigoll Посмотреть сообщение
вместо букв появляются вот такие вот квадраты
У меня такая проблема была когда текстура со шрифтом подменялась на другую, проследите правильность заноса текстуры до самого шейдера. Скорей всего текстура предназначенная для шрифта подменяется на другую раз квадраты разные то текстурные координаты по всей видимости правильные, и предназначены для текста, но вот текстура не с текстом.
Если по какой-то причине текстура не загрузилась, вы используете текстурный массив и номер текстры выходит за пределы текстурного массива, то OpenGL будет использовать последнюю успешно занесеную текстуру из текстурного массива.

Наверное коряво объяснил... но.. в общем.. проследите правильность заноса текстуры до самого шейдера.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.01.2017, 03:55
Привет! Вот еще темы с ответами:

В вордовских документах вместо некоторых букв отображаются квадраты - Удаление вирусов
На нескольких компах некоторые воровские документы стали открываться с квадратами вместо некоторых букв. На всех компах виндовс хп,...

GIMP в меню вместо текста выводит квадраты - FreeBSD
Всем привет! GIMP, установленный под KDE 4.0 вместо текста меню и в окне загрузки выводит квадраты. Понимаю, что это настройки...

Пробелы при отрисовке текста - C#
Текст рисуется с пробелами - рис. слева (исп. System.Drawing.Graphics: DrawText и MeasureString). Надо плотнее, как на рис. справа. Как...

Почему при копировании из Matcad 15 в Word вместо русских букв получаются какие-то "каракули" - непонятные символы вместо букв - MathCAD
Я пользуюсь Matcad 15. Почему при копировании набранного текста из рабочей области Matcad 15 в документ Word вместо русских букв получаются...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru