2017-04-08 42 views
-1

我目前正在嘗試使用位圖文件在OpenGL中呈現文本。當它本身時,字體看起來像預期的那樣。從一個VAO應用到另一個VAO的紋理

附件A: 「這個引擎可以渲染文本」

exhibit

當添加一個單獨的VAO一個單獨的紋理(圖片)以上的文字在同一VAO,仍然看起來一樣。

a.1 a.2

然而,增加雙方在一個單獨的VAO質地和在同一VAO,質地更文本時,「這個引擎可以呈現的文字!」被修改。

附件B:

exhibit b

什麼是真正奇怪,我是紋理似乎混合,它只會影響少數的頂點,而不是整個VBO。

這是OpenGL /可憐的驅動程序的問題,還是其他的東西?我仔細檢查了頂點,並且'他'沒有被渲染與圖片紋理激活。我使用的是OSX,如果它可能有所幫助,那麼臭名昭着的糟糕的OpenGL支持。

我的渲​​染循環:

//scene is just a class that bundles all the necessary information for rendering. 
//when rendering text, it is all batched inside of one scene, 
//so independent textures of text characters should be impossible 

glUseProgram(prgmid); 

for(auto& it : scene->getTextures()) 
{ 
    //load textures 
    const Texture::Data* data = static_cast<const Texture::Data*>(it->getData()); 
    glActiveTexture(GL_TEXTURE0 + it->getID()); 
    glBindTexture(GL_TEXTURE_2D, it->getID()); 
    glUniform1i(glGetUniformLocation(prgmid, data->name), it->getID()); 
} 

for(auto& it : scene->getUniforms()) 
{ 
    processUniforms(scene, it, prgmid); 
} 

glBindVertexArray(scene->getMesh()->getVAO()); 
glDrawElements(GL_TRIANGLES, scene->getMesh()->getDrawCount(), GL_UNSIGNED_INT, 0); 
glBindVertexArray(0); 

文本的着色器:圖像

//Vertex 
#version 330 core 
layout (location = 0) in vec4 pos; 
layout (location = 1) in vec2 fontTexCoord; 

out vec2 fontTexCoords; 

uniform mat4 __projection; 

void main() 
{ 
    fontTexCoords = vec2(fontTexCoord.x, fontTexCoord.y); 
    gl_Position = __projection * pos; 
} 

//Frag 
#version 330 core 
in vec2 fontTexCoords; 
out vec4 color; 

uniform sampler2D fontbmp; 

void main() 
{ 
    color = texture(fontbmp, fontTexCoords); 
    if(color.rgb == vec3(0.0, 0.0, 0.0)) discard; 
} 

着色器:

//vert 
#version 330 core 
layout (location = 0) in vec4 pos; 
layout (location = 1) in vec2 texCoord; 

out vec2 TexCoords; 

uniform mat4 __projection; 
uniform float __spriteFrameRatio; 
uniform float __spriteFramePos; 
uniform float __flipXMult; 
uniform float __flipYMult; 

void main() 
{ 
    TexCoords = vec2(((texCoord.x + __spriteFramePos) * __spriteFrameRatio) * __flipXMult, texCoord.y * __flipYMult); 
    gl_Position = __projection * pos; 
} 

//frag 
#version 330 core 
in vec2 TexCoords; 
out vec4 color; 

uniform sampler2D __image; 
uniform vec4 __spriteColor; 
uniform bool __is_texture; 

void main() 
{ 
    if(__is_texture) 
    { 
     color = __spriteColor * texture(__image, TexCoords); 
    } 
    else 
    { 
     color = __spriteColor; 
    } 
} 

編輯: 我相信代碼,導致問題與生成有關g緩衝區。每當渲染每個場景(VAO,VBO,EBO,紋理)對象時都會調用它。

if(!REALLOCATE_BUFFER && !ATTRIBUTE_ADDED) return; 

glBindVertexArray(_vao); 
glBindBuffer(GL_ARRAY_BUFFER, _vbo); 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _ebo); 

if(REALLOCATE_BUFFER) 
{ 

    size_t vsize = _vert.size() * sizeof(decltype(_vert)::value_type); 
    size_t isize = _indc.size() * sizeof(decltype(_indc)::value_type); 

    if(_prevsize != vsize) 
    { 

     _prevsize = vsize; 
     glBufferData(GL_ARRAY_BUFFER, vsize, &_vert[0], _mode); 
     glBufferData(GL_ELEMENT_ARRAY_BUFFER, isize, &_indc[0], _mode); 

    } 
    else 
    { 
     glBufferSubData(GL_ARRAY_BUFFER, 0, vsize, &_vert[0]); 
     glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, isize, &_indc[0]); 
    } 

} 

if(ATTRIBUTE_ADDED) 
{ 
    for(auto& itt : _attrib) 
    { 
     glVertexAttribPointer(itt.index, itt.size, GL_FLOAT, itt.normalized, _currstride * sizeof(GLfloat), (GLvoid*)(itt.pointer * sizeof(GLfloat))); 
     glEnableVertexAttribArray(itt.index); 
    } 
} 

glBindVertexArray(0); 

當我們註釋掉glBufferSubData使glBufferData總是被調用,問題區域通過所有紋理,包括在其他VAOs的那些閃爍和迭代。

video

編輯2:

出於某種原因,一切正常,當文字與不同的模式比圖片上呈現爲預期的,說GL_STREAM_DRAW和GL_DYNAMIC_DRAW,例如。怎麼會這樣?

+0

損壞?它看起來與我一樣,只是在文本下面有紋理。 – Vallentin

+0

也許被破壞不是正確的詞,但有些紋理出了問題。使用我當前的渲染代碼,幾個頂點不可能具有其他頂點所不具備的紋理;這是全部或沒有。 – hwinston

+0

我剪切截圖以匹配對方,[這裏是他們之間的區別。正如你所看到的,只有下面的紋理是不同的](https://i.stack.imgur.com/sJZmH.png)。所以沒有什麼是明顯的腐敗或修改。 – Vallentin

回答

0

因此,我搞砸了的事情是,getDrawCount()返回的是VERTICES的數量而不是索引的數量。令人驚訝的是,這並沒有導致OpenGL拋出任何錯誤並修復它解決了閃爍問題。