Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从一个VAO应用到另一个VAO的纹理_C++_Opengl - Fatal编程技术网

C++ 从一个VAO应用到另一个VAO的纹理

C++ 从一个VAO应用到另一个VAO的纹理,c++,opengl,C++,Opengl,我目前正在尝试使用位图文件在OpenGL中渲染文本。单独使用时,字体看起来与预期一致 附件A: 在单独的VAO中添加单独的纹理(图片)或在同一VAO中添加更多文本时,“此引擎可以渲染文本!”看起来仍然相同 但是,当在单独的VAO中添加纹理和在同一VAO中添加更多文本时,“此引擎可以渲染文本!”的纹理会被修改 附件B: 对我来说真正奇怪的是,纹理似乎是混合的,它只影响少数顶点,而不是整个VBO 这是OpenGL/糟糕的驱动程序的问题,还是其他问题?我仔细检查了顶点,没有在图片纹理处于活动状

我目前正在尝试使用位图文件在OpenGL中渲染文本。单独使用时,字体看起来与预期一致

附件A:

在单独的VAO中添加单独的纹理(图片)或在同一VAO中添加更多文本时,“此引擎可以渲染文本!”看起来仍然相同

但是,当在单独的VAO中添加纹理和在同一VAO中添加更多文本时,“此引擎可以渲染文本!”的纹理会被修改

附件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);
图片的着色器:

//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;
    }
}
编辑: 我相信引起问题的代码与生成缓冲区有关。每次为每个场景(VAO、VBO、EBO、纹理)对象渲染时,都会调用它

当我们注释掉glBufferSubData以便总是调用glBufferData时,问题区域会闪烁并迭代所有纹理,包括其他VAO中的纹理

编辑2:


出于某种原因,当文本以与图片不同的模式渲染时,一切都会按预期进行,例如GL_STREAM_DRAW和GL_DYNAMIC_DRAW。这怎么可能呢?

所以我搞砸了,getDrawCount()返回的是顶点数,而不是索引数。令人惊讶的是,这并没有导致OpenGL抛出任何错误,修复它解决了闪烁问题。

损坏了吗?在我看来是一样的,只是文字下面有一个纹理。也许“损坏”不是正确的词,但纹理有点不对劲。在我当前的渲染代码中,一些顶点不可能有其他顶点没有的纹理;要么全是,要么什么都不是。我把截图剪了下来,让它们相互匹配,然后。所以没有明显的损坏或修改。我更新了图片,希望问题更加明显。下面的纹理不应该存在,但它确实存在。
//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;
    }
}
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);