提示画像ですがなぜ提示コードの////コメント部でしっかりと終端文字を設定しているのも関わらず四角い文字の枠組みが表示されるのでしょうか?原因がわかりません。その先の for (int i = 0; txt[i] != L'\0'; i++) 分でしっかりと最後まで、まで見ているはずなのですがどもう最後以上まで?見てるみたいなのですがその場合どうすればいいのでしょうか?
cpp
1 2void FrameWork::Text::Draw(glm::vec2 pos, const char* text, float scale, glm::vec3 color) 3//void FrameWork::Text::Draw(glm::vec2 pos, std::string text,float scale, glm::vec3 color) 4{ 5 setEnable(); //シェーダーを有効にする 6 7 pos.y = windowContext->getSize().y - pos.y - charSize; 8 9 //テクスチャをアクティブ 10 glActiveTexture(GL_TEXTURE0); 11 glBindVertexArray(vao); 12 13 //Unform 14 setUniform3f("textColor", color); 15 setUniformMatrix4fv("uViewProjection", glm::ortho(0.0f, windowContext->getSize().x, 0.0f, windowContext->getSize().y)); 16 17 //char text[] = "テスト"; 18 //wchar_t txt[strlen(text)] = { L'\0' }; 19 wchar_t* txt = (wchar_t*)malloc(strlen(text)); 20 21 22 23 int i, j, f; 24 for (i = 0, j = 0; text[j]; i++, j += f) 25 { 26 f = mbrtowc(txt + i, &text[j], MB_CUR_MAX, nullptr); 27 } 28/////////////////////////////////// 29 txt[j] = L'\0'; 30////////////////////////////////// 31 32 for (int i = 0; txt[i] != L'\0'; i++) 33 { 34 //std::cout << txt[i] <<std::endl; 35 unsigned int texture = 0; 36 37 // load character glyph 38 FT_Load_Glyph(face, FT_Get_Char_Index(face, txt[i]), FT_LOAD_RENDER); 39 40 41 // now store character for later use 42 Character ch = { 43 texture, 44 glm::ivec2(face->glyph->bitmap.width, face->glyph->bitmap.rows), 45 glm::ivec2(face->glyph->bitmap_left, face->glyph->bitmap_top), 46 (unsigned int)face->glyph->advance.x 47 48 }; 49 50 51 // generate texture 52 glGenTextures(1, &ch.textureID); 53 glBindTexture(GL_TEXTURE_2D, ch.textureID); 54 55 glTexImage2D( 56 GL_TEXTURE_2D, 57 0, 58 GL_RED, 59 face->glyph->bitmap.width, 60 face->glyph->bitmap.rows, 61 0, 62 GL_RED, 63 GL_UNSIGNED_BYTE, 64 face->glyph->bitmap.buffer 65 ); 66 // set texture options 67 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 68 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 69 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 70 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 71 // now store character for later use 72 73 74 75 float xpos = pos.x + ch.Bearing.x * scale; 76 float ypos = pos.y - (ch.Size.y - ch.Bearing.y) * scale; 77 78 float w = ch.Size.x * scale; 79 float h = ch.Size.y * scale; 80 // update VBO for each character 81 float vertices[6][4] = { 82 { xpos, ypos + h, 0.0f, 0.0f }, 83 { xpos, ypos, 0.0f, 1.0f }, 84 { xpos + w, ypos, 1.0f, 1.0f }, 85 86 { xpos, ypos + h, 0.0f, 0.0f }, 87 { xpos + w, ypos, 1.0f, 1.0f }, 88 { xpos + w, ypos + h, 1.0f, 0.0f } 89 }; 90 // render glyph texture over quad 91 // update content of VBO memory 92 glBindBuffer(GL_ARRAY_BUFFER, vbo); 93 glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(vertices), vertices); 94 glBindBuffer(GL_ARRAY_BUFFER, 0); 95 96 // render quad 97 glDrawArrays(GL_TRIANGLES, 0, 6); 98 99 100 101 // now advance cursors for next glyph (note that advance is number of 1/64 pixels) 102 pos.x += ((ch.Advance >> 6) * scale); // bitshift by 6 to get value in pixels (2^6 = 64) 103 } 104 105 106 107 free(txt); 108 txt = nullptr; 109 glBindVertexArray(0); 110 glBindTexture(GL_TEXTURE_2D, 0); 111 setDisable(); //シェーダーを無効にする 112} 113
> wchar_t* txt = (wchar_t*)malloc(strlen(text));
正気ですか?
なぜでしょうか?
「malloc()」や「strlen()」の動きを理解してますか?
「wchar_t」の大きさは理解してますか?
仮に「テスト」というシフトJISのマルチバイト文字列があったとして。
1. 上記「テスト」を対象とした「strlen()」の結果
2. 「wchar_t」のサイズ
3. 「テスト」をワイド文字列として格納する際、必要なサイズ
4. 「malloc()」で実際確保されているサイズ
上記を説明できますか?
また、「テスト」ではなく「Test」の場合も合わせて説明していただければと思います。
回答2件
あなたの回答
tips
プレビュー