nvoglv32.dll glTexSubImage中的OpenGL未处理异常

时间:2015-03-18 20:42:04

标签: c++ opengl

我发生了一次非常随机的崩溃,在10次左右的时间里我会在nvoglv32.dll中崩溃。它并不总是发生在完全相同的地方,但确实发生在同一地方的10行左右。

我添加了使用glTexSubImage2D()更新纹理的功能,现在我有这些间歇性的崩溃。

  void UpdateTexture(const GLuint textureID, const CaffApp::Dev::Format format, const CaffApp::Dev::TextureD dimention, const uint32_t offsetX, const uint32_t offsetY, const uint32_t width, const uint32_t height, void *data)
  {
    using namespace CaffApp::Dev;

    const auto externalFormat = format == Format::DEV ? GL_RGBA32F : GL_RGBA ;
    const auto internalFormat = GL_RGBA;
    const auto formatType     = format == Format::R8G8B8 ? GL_UNSIGNED_BYTE : GL_FLOAT;
    const auto glDimention    = GetDimentionTarget(dimention);

    assert(CaffMath::IsPOW2(texWidth));
    assert(CaffMath::IsPOW2(texHeight));

    glBindTexture(glDimention, textureID);

    switch(glDimention)
    {
      case(GL_TEXTURE_1D):
      {
        glTexSubImage1D(GL_TEXTURE_1D, offsetX, 0, texWidth, internalFormat, formatType, data);
        break;
      }
      case(GL_TEXTURE_2D):
      {
        glTexSubImage2D(GL_TEXTURE_2D, 0, offsetX, offsetY, texWidth, texHeight, internalFormat, formatType, data);
        break;
      }
    };

    glBindTexture(glDimention, 0);
    GL_ERROR("Updating texture.")
  }

void Texture::updateSubset(const std::vector<float> &data, const uint32_t offsetX, const uint32_t offsetY)
{
  assert(m_textureID);

  uint32_t sizeX = m_width;
  uint32_t sizeY = m_height;

  if(sizeX == 0 || sizeY == 0)
  {
    SetTextureDimentionFromDataSize(m_dimention, data.size(), sizeX, sizeY);
  }

  UpdateTexture(m_textureID, m_format, m_dimention, offsetX, offsetY, sizeX, sizeY, (void*)data.data());

  GL_ERROR("Updating texture.")
}

如果崩溃发生,它只在第一次调用glTexSubImage ...时发生。否则罚款。

我确实看到了一些关于顶点属性未正确设置的内容,但是我无法在那里看到任何错误,并且该代码在2年左右的时间内没有被更改过,所以我在思考它在这附近。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

无论data点是什么,你都可能访问越界。如果未正确设置对齐和步幅,则会发生这种情况。如果将数据分配为short,也会发生这种情况;当第一个东西写出越界时,它不会崩溃,它可以污染地址空间并在其他地方触发崩溃。