2016-08-07 8 views
1

私は最近フリースタイルのライブラリを使ってテキストファイルを読み、2Dでテキストを表示する方法についていくつかのガイドを続けました。 私は3Dテキストのレンダリングをサポートするためにコードを拡張しようとしましたが、OpenGLに関連する問題が発生しました。 特定の角度で、テキスト画像が消え始め、テキストが配置されている軸全体がその色を継承し始めます。 Fading;Black Sliceランダムな色のブロック

すべての関連コードは:(learnopengl.comから継承)

描画機能

glEnable(GL_BLEND); 
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
// Activate corresponding render state 
glActiveTexture(GL_TEXTURE0); 
glBindVertexArray(VAO); 
glEnableVertexAttribArray(0); 

scale /= RESOLUTION; 
vec2 start(x, y); 
// Iterate through all characters 
std::string::const_iterator c; 
for (c = text.begin(); c != text.end(); c++) 
{ 
    Character ch = Characters[*c]; 
    if (*c == '\r' || (x-start.x > xMax && xMax != 0.0f)) 
    { 
     y += ((ch.Advance >> 6) + 16) * scale ; 
     x = start.x; 
     continue; 
    } 

    GLfloat xpos = x + ch.Bearing.x * scale; 
    GLfloat ypos = y + (ch.Size.y - ch.Bearing.y) * scale; 

    GLfloat w = ch.Size.x * scale; 
    GLfloat h = ch.Size.y * scale; 
    // Update VBO for each character 
    GLfloat vertices[6][4] = { 
     { xpos,  ypos - h, 0.0, 0.0 }, 
     { xpos,  ypos,  0.0, 1.0 }, 
     { xpos + w, ypos,  1.0, 1.0 }, 

     { xpos,  ypos - h, 0.0, 0.0 }, 
     { xpos + w, ypos,  1.0, 1.0 }, 
     { xpos + w, ypos - h, 1.0, 0.0 } 
    }; 
    // Render glyph texture over quad 
    glBindTexture(GL_TEXTURE_2D, ch.TextureID); 

    // Update content of VBO memory 
    glBindBuffer(GL_ARRAY_BUFFER, VBO); 
    glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(vertices), vertices); 
    // Render quad 
    glDrawArrays(GL_TRIANGLES, 0, 6); 
    glBindBuffer(GL_ARRAY_BUFFER, 0); 
    // Now advance cursors for next glyph (note that advance is number of 1/64 pixels) 
    x += (ch.Advance >> 6) * scale; // Bitshift by 6 to get value in pixels (2^6 = 64) 
} 
glBindVertexArray(0); 
glBindTexture(GL_TEXTURE_2D, 0); 
glDisable(GL_BLEND); 

シェーダ均一初期

ShaderBuilder::LoadShader(shader)->Add_mat4("projection", projection).Add_mat4("view", view). 
    Add_mat4("model", model).Add_vec3("textColor", color).Add_texture("text", 0); 

頂点シェーダ #version 400コア vec4頂点のレイアウト(位置= 0)。 // out vec2 TexCoords;

uniform mat4 projection; 
uniform mat4 view; 
uniform mat4 model; 

void main() 
{ 
    vec2 vertexGL = (vertex.xy - vec2(400,300))/vec2(400,300); 
    vertexGL = vertex.xy; 
    vec4 position = projection * view * model * vec4(vertexGL.xy, 0.0, 1.0); 
    gl_Position = position/position.w; 

    TexCoords = vertex.zw; 
} 

フラグメントシェーダ #version 400コア VEC2でTexCoords。 vec4の色は です。

uniform sampler2D text; 
uniform vec3 textColor; 

void main() 
{  
    vec4 sampled = vec4(1.0, 1.0, 1.0, texture(text, TexCoords).r); 
    color = vec4(textColor, 1.0) * sampled; 
    //color = vec4(1); 
} 
+0

どちらの画像も* z-fighting *のように見えます。 – usr2564301

+1

確かに、そこには他のレンダリングがないので、それらの文字だけ、巨大な無限大の正方形など何もないので、それは直接質問したときに完全にうまく見えるということです。小さい角度でしか厄介であること – user3092114

+0

よろしくお願いします - それを確認し、支配してくれてありがとう。 – usr2564301

答えて

0

私は最終的に私は行列の乗算を適用した後、私の頂点COORDSを正規化することをお勧めだろうと思ったいくつかの未知の理由で、間違いを発見しました。 明らかにそうではありません。

vec4 position = projection * view * model * vec4(vertexGL.xy, 0.0, 1.0); 
    gl_Position = position;///position.w; 

コメントで宣言すると、間違いがなくなります。

関連する問題