我目前正在尝试使用位图文件在OpenGL中呈现文本。当它本身时,字体看起来像预期的那样。从一个VAO应用到另一个VAO的纹理
附件A: “这个引擎可以渲染文本”
当添加一个单独的VAO一个单独的纹理(图片)以上的文字在同一VAO,仍然看起来一样。
然而,增加双方在一个单独的VAO质地和在同一VAO,质地更文本时,“这个引擎可以呈现的文字!”被修改。
附件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的那些闪烁和迭代。
编辑2:
出于某种原因,一切正常,当文字与不同的模式比图片上呈现为预期的,说GL_STREAM_DRAW和GL_DYNAMIC_DRAW,例如。怎么会这样?
损坏?它看起来与我一样,只是在文本下面有纹理。 – Vallentin
也许被破坏不是正确的词,但有些纹理出了问题。使用我当前的渲染代码,几个顶点不可能具有其他顶点所不具备的纹理;这是全部或没有。 – hwinston
我剪切截图以匹配对方,[这里是他们之间的区别。正如你所看到的,只有下面的纹理是不同的](https://i.stack.imgur.com/sJZmH.png)。所以没有什么是明显的腐败或修改。 – Vallentin