2017-04-08 20 views
-1

現在、ビットマップファイルを使用してOpenGLでテキストをレンダリングしようとしています。それ自体では、フォントは期待通りに見えます。VAOのテクスチャが別のVAOに適用されています

別紙A:同じVAOで別々のVAO以上のテキストに別々のテクスチャ(画像)を追加する場合

exhibit

、 "このエンジンはテキストをレンダリングすることができます!"それでも同じように見えます。

a.1 a.2

別々VAOで質感と同じVAOでより多くのテキストの両方を追加するときしかし、テクスチャの「このエンジンはテキストをレンダリングすることができます!」変更されます。

別紙B:私には本当に奇妙何

exhibit b

はテクスチャが配合されているように見えること、そしてそれだけではなく、全体VBOよりも少数の頂点に影響を与えることがあります。

これはOpenGL /貧弱なドライバの問題ですか、それとも別のものですか?私は頂点をダブルチェックし、 'his'は画像テクスチャをアクティブにしてレンダリングされていません。 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; 
    } 
} 

EDIT: 私はあるコードを信じて問題を引き起こす原因は、ジェネティンバッファー。各シーン(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); 

glBufferDataが常に呼び出されるように、我々はglBufferSubDataをコメントアウトすると、問題領域は、他のVAOs中のものを含む、すべてのテクスチャを介して、点滅して反復します。

video

EDIT 2:

何らかの理由で、期待通りにテキストが画像とは異なるモードでレンダリングされたときにすべての作品、例えば、GL_STREAM_DRAWとGL_DYNAMIC_DRAWを言います。どうすればいいの?

+0

破損?それはテキストの下にテクスチャがあるだけで私には同じように見えます。 – Vallentin

+0

おそらく壊れているのは正しい言葉ではありませんが、何かがテクスチャで狂ってしまっています。現在のレンダリングコードでは、いくつかの頂点が他の頂点にないテクスチャを持つことはできません。それはすべてか何もない。 – hwinston

+0

私はお互いに一致するようにスクリーンショットをカットし、[ここではそれらの違いがあります。あなたが見ることができるように、下のテクスチャだけが異なる](https://i.stack.imgur.com/sJZmH.png)。したがって、明らかに壊れていたり改変されたものはありません – Vallentin

答えて

0

だから、私がうんざりしたことは、getDrawCount()がインデックスの数ではなく、VERTICESの数を返すことでした。驚いたことに、これはOpenGLにエラーを投げ込ませず、それを修正することでちらつきを解決しました。

関連する問題