CXX0030: ошибка c ++ - PullRequest
       1

CXX0030: ошибка c ++

0 голосов
/ 30 марта 2011

во время выполнения проекта opengl я собираюсь скомпилировать мою программу, и она останавливается и создает точку останова в моем коде

CSkybox::CSkybox()
{
    for (int idx = 0; idx < 6; idx++)
        m_textures[idx] = 0;
}

CSkybox::~CSkybox()
{
    Release();
}


void CSkybox::Initialize(float size)
{
    m_size = size;
}


bool CSkybox::LoadTextures(char* top, char* bottom, char* front, char* back, char* left, char* right)
{
    CTargaImage image;

    image.Load(top);
    glGenTextures(1, &m_textures[SKY_TOP]);
    glBindTexture(GL_TEXTURE_2D, m_textures[SKY_TOP]);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB, image.GetWidth(), image.GetHeight(), GL_RGB, GL_UNSIGNED_BYTE, image.GetImage());
    image.Release();

    image.Load(bottom);
    glGenTextures(1, &m_textures[SKY_BOTTOM]);
    glBindTexture(GL_TEXTURE_2D, m_textures[SKY_BOTTOM]);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB, image.GetWidth(), image.GetHeight(), GL_RGB, GL_UNSIGNED_BYTE, image.GetImage());
    image.Release();

    image.Load(front);
    glGenTextures(1, &m_textures[SKY_FRONT]);
    glBindTexture(GL_TEXTURE_2D, m_textures[SKY_FRONT]);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB, image.GetWidth(), image.GetHeight(), GL_RGB, GL_UNSIGNED_BYTE, image.GetImage());
    image.Release();

    image.Load(back);
    glGenTextures(1, &m_textures[SKY_BACK]);
    glBindTexture(GL_TEXTURE_2D, m_textures[SKY_BACK]);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB, image.GetWidth(), image.GetHeight(), GL_RGB, GL_UNSIGNED_BYTE, image.GetImage());
    image.Release();

    image.Load(left);
    glGenTextures(1, &m_textures[SKY_LEFT]);
    glBindTexture(GL_TEXTURE_2D, m_textures[SKY_LEFT]);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB, image.GetWidth(), image.GetHeight(), GL_RGB, GL_UNSIGNED_BYTE, image.GetImage());
    image.Release();

    image.Load(right);
    glGenTextures(1, &m_textures[SKY_RIGHT]);
    glBindTexture(GL_TEXTURE_2D, m_textures[SKY_RIGHT]);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB, image.GetWidth(), image.GetHeight(), GL_RGB, GL_UNSIGNED_BYTE, image.GetImage());
    image.Release();

    return true;
}


void CSkybox::Render(float cameraX, float cameraY, float cameraZ)
{
    glPushMatrix();

    // Move the skybox so that it's centered on the camera.
    glTranslatef(cameraX, cameraY, cameraZ);

    glPushAttrib(GL_FOG_BIT | GL_DEPTH_BUFFER_BIT | GL_LIGHTING_BIT);
    glDisable(GL_DEPTH_TEST);

    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);

    // Top
    glBindTexture(GL_TEXTURE_2D, m_textures[SKY_TOP]);
    glBegin(GL_QUADS);
        glTexCoord2f(1.0f, 1.0f); glVertex3f(-m_size, m_size, -m_size);
        glTexCoord2f(0.0f, 1.0f); glVertex3f(m_size, m_size, -m_size);
        glTexCoord2f(0.0f, 0.0f); glVertex3f(m_size, m_size, m_size);
        glTexCoord2f(1.0f, 0.0f); glVertex3f(-m_size, m_size, m_size);
    glEnd();

    // Bottom
    glBindTexture(GL_TEXTURE_2D, m_textures[SKY_BOTTOM]);
    glBegin(GL_QUADS);
        glTexCoord2f(1.0f, 1.0f); glVertex3f(m_size, -m_size, -m_size);
        glTexCoord2f(0.0f, 1.0f); glVertex3f(-m_size, -m_size, -m_size);
        glTexCoord2f(0.0f, 0.0f); glVertex3f(-m_size, -m_size, m_size);
        glTexCoord2f(1.0f, 0.0f); glVertex3f(m_size, -m_size, m_size);
    glEnd();

    // Front
    glBindTexture(GL_TEXTURE_2D, m_textures[SKY_FRONT]);
    glBegin(GL_QUADS);
    glTexCoord2f(0.0f, 0.0f); glVertex3f(-m_size, -m_size, -m_size);
    glTexCoord2f(1.0f, 0.0f); glVertex3f(m_size, -m_size, -m_size);
    glTexCoord2f(1.0f, 1.0f); glVertex3f(m_size, m_size, -m_size);
    glTexCoord2f(0.0f, 1.0f); glVertex3f(-m_size, m_size, -m_size);
    glEnd();

    // Back
    glBindTexture(GL_TEXTURE_2D, m_textures[SKY_BACK]);
    glBegin(GL_QUADS);
        glTexCoord2f(0.0f, 0.0f); glVertex3f(m_size, -m_size, m_size);
        glTexCoord2f(1.0f, 0.0f); glVertex3f(-m_size, -m_size, m_size);
        glTexCoord2f(1.0f, 1.0f); glVertex3f(-m_size, m_size, m_size);
        glTexCoord2f(0.0f, 1.0f); glVertex3f(m_size, m_size, m_size);
    glEnd();

    // Right
    glBindTexture(GL_TEXTURE_2D, m_textures[SKY_RIGHT]);
    glBegin(GL_QUADS);
        glTexCoord2f(1.0f, 0.0f); glVertex3f(m_size, -m_size, m_size);
        glTexCoord2f(1.0f, 1.0f); glVertex3f(m_size, m_size, m_size);
        glTexCoord2f(0.0f, 1.0f); glVertex3f(m_size, m_size, -m_size);
        glTexCoord2f(0.0f, 0.0f); glVertex3f(m_size, -m_size, -m_size);
    glEnd();

    // Left
    glBindTexture(GL_TEXTURE_2D, m_textures[SKY_LEFT]);
    glBegin(GL_QUADS);
    glTexCoord2f(1.0f, 0.0f); glVertex3f(-m_size, -m_size, -m_size);
        glTexCoord2f(1.0f, 1.0f); glVertex3f(-m_size, m_size, -m_size); 
        glTexCoord2f(0.0f, 1.0f); glVertex3f(-m_size, m_size, m_size);
        glTexCoord2f(0.0f, 0.0f); glVertex3f(-m_size, -m_size, m_size);
    glEnd();

    glPopAttrib();
    glEndList();
    glPopMatrix();
}


void CSkybox::Release()
{
    for (int i = 0; i < 6; ++i)
        glDeleteTextures(6, &m_textures[0]);
}

Ответы [ 2 ]

3 голосов
/ 30 марта 2011

Метод Release () выполняет удаление всех шести текстур шесть раз:

  for (int i = 0; i < 6; ++i)
        glDeleteTextures(6, &m_textures[0]);

Должно быть либо:

 for (int i = 0; i < 6; ++i)
        glDeleteTextures(1, &m_textures[i]);

или

  glDeleteTextures(6, &m_textures[0]);

Кроме того, вы не показываете это, но SKY_ должно быть в диапазоне [0..5], а не, например. [1..6].

Я бы также посмотрел, правильно ли загружаются изображения и есть ли обработка ошибок для этого.

1 голос
/ 30 марта 2011

Похоже на переполнение границ массива.m_textures Полагаю, это массив, в котором должны храниться сгенерированные имена текстур.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...