提示コードですがfor分内部で文字一つ一つを矩形のポリゴンを作りそこに文字を一つ一つ載せてると思うのですが処理速度の問題で一つの矩形ポリゴンに全部の文字を載せるには一つののテクスチャにしないといけないのでつまり文字を一つのテクスチャにするにはどうすればいいのでしょうか?
おそらく複数のテクスチャ?ビットマップ?を一つに連結する方法と思われるのですがそれはどうすればいいのでしょうか?
cpp
1 2//文字を表示 3void Text::Rendering(float x, float y, glm::vec4 color, const char* format, ...) 4{ 5 //printf("あああ\n"); 6 ShaderProgram->Enable(); //アクティブにする 7 8 //float xx = (-SCREEN_WIDTH / 2) + x; 9 //float yy = (SCREEN_HEIGHT / 2) - y; 10 11 float xx = x; 12 float yy = y; 13 float scale = 1.0f;//大きさ 14 15 //文字を生成 16 std::string text; //生成した文字を格納 17 va_list ap; 18 char str[1000]; 19 va_start(ap, format); 20 vsprintf_s(str, sizeof(str), format, ap); 21 va_end(ap); 22 text = std::string(str); 23 24 //シェーダー 25 ShaderProgram->SetFloatUniform_3m("uViewMatrix", Transform_2D::getViewMatrix()); // ビュー行列 26 ShaderProgram->SetFloatUniform_3m("uWorldMatrix", Transform_2D::getWorldMatrix()); // ワールド行列 27 ShaderProgram->SetFloatUniform_4f("uTextColor", color); //色を設定 RGB 28 29 glActiveTexture(GL_TEXTURE0); 30 glBindVertexArray(VAO); 31 struct Vtx { 32 float data[6][4]; 33 }; 34 35 std::vector<Vtx> vertices; 36 std::vector<Character> ch; 37 int t = 0; 38 // iterate through all characters 39 std::string::const_iterator itr; 40///////////////////////////////////////////////////////////////////////////////////////////////////// 41 for (itr = text.begin(); itr != text.end(); itr++) 42 { 43 ch.push_back( Characters[*itr]); 44 45 float xpos = xx + ch.back().Bearing.x * scale; 46 float ypos = yy - (ch.back().Size.y - ch.back().Bearing.y) * scale; 47 48 printf("xpos: %.2f\n", xpos); 49 printf("ypos: %.2f\n\n", ypos); 50 // Transform_2D::setTransform(glm::ivec2(t, 0), 0, glm::ivec2(1, 1)); 51 52 float w = ch.back().Size.x * scale; 53 float h = ch.back().Size.y * scale; 54 55 //頂点情報を書き換え 56 float vert[6][4] = { 57 { xpos, ypos + h, 0.0f, 0.0f }, 58 { xpos, ypos, 0.0f, 1.0f }, 59 { xpos + w, ypos, 1.0f, 1.0f }, 60 61 { xpos, ypos + h, 0.0f, 0.0f }, 62 { xpos + w, ypos, 1.0f, 1.0f }, 63 { xpos + w, ypos + h, 1.0f, 0.0f } 64 }; 65 Vtx v; 66 v.data[0][0] = vert[0][0]; 67 v.data[0][1] = vert[0][1]; 68 v.data[0][2] = vert[0][2]; 69 70 v.data[0][3] = vert[0][3]; 71 v.data[1][0] = vert[1][0]; 72 v.data[1][1] = vert[1][1]; 73 74 v.data[1][2] = vert[1][2]; 75 v.data[1][3] = vert[1][3]; 76 v.data[2][0] = vert[2][0]; 77 78 v.data[2][1] = vert[2][1]; 79 v.data[2][2] = vert[2][2]; 80 v.data[2][3] = vert[2][3]; 81 82 v.data[3][0] = vert[3][0]; 83 v.data[3][1] = vert[3][1]; 84 v.data[3][2] = vert[3][2]; 85 v.data[3][3] = vert[3][3]; 86 87 v.data[4][0] = vert[4][0]; 88 v.data[4][1] = vert[4][1]; 89 v.data[4][2] = vert[4][2]; 90 v.data[4][3] = vert[4][3]; 91 92 v.data[5][0] = vert[5][0]; 93 v.data[5][1] = vert[5][1]; 94 v.data[5][2] = vert[5][2]; 95 v.data[5][3] = vert[5][3]; 96 97 vertices.push_back(v); 98 x += (ch.back().Advance >> 6) * scale; 99 } 100////////////////////////////////////////////////////////////////////////////////////////////////// 101 //テクスチャを設定 102 int i = 0; 103// printf("----------\n"); 104 for (std::vector<Character>::const_iterator itr = ch.begin(); itr != ch.end(); itr++) { 105 // printf("%d\n",itr->TextureID); 106 glBindBuffer(GL_ARRAY_BUFFER, VBO); 107 108 glBindTexture(GL_TEXTURE_2D, itr->TextureID); 109 110 glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(vertices.at(i).data) , std::data(vertices.at(i).data)); 111 112 glDrawArrays(GL_TRIANGLES, 0, 6); 113 i++; 114 115 } 116 //printf("----------\n"); 117 glBindVertexArray(0); 118 glBindTexture(GL_TEXTURE_2D, 0); 119 120}
テクスチャに張るって意味だったら、ナンセンスな気がするけど、それが解ならすいません。ビルボードの練習なら良いと思います。それより1行ずつ文字を消したり、数字を変えたりする方法が知りたいです。
あなたの回答
tips
プレビュー