纹理渲染bug?

时间:2014-04-28 18:00:47

标签: opengl textures gpu

我正在与一些朋友一起做一个单身汉项目,而且我们遇到了一个非常混乱的OpenGL纹理错误。而且我想知道这里有没有关于这些事情的知识...

我们遇到的问题是,在我们的笔记本电脑(运行英特尔高清显卡)上,我们可以看到纹理很好。但是,如果我们将其改为在专用显卡上运行,我们就无法看到纹理。我们无法在我们的桌面上看到他们使用专用的Craphics卡(AMD和Nvidia)。

那么,那是什么呢?有什么想法吗?

编辑:添加纹理&渲染代码,不是我做的所以我不知道它是如何工作的。但我想我找到了一切。

纹理加载:

Texture::Texture(const char* imagepath)
{


    textureImage = IMG_Load(imagepath);
    if (!textureImage)
    {
        fprintf(stderr, "Couldn't load %s.\n", imagepath);

    }
    else{
    textureID = 0;

    glGenTextures(1, &textureID);
    glBindTexture(GL_TEXTURE_2D, textureID);

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

    glTexImage2D(GL_TEXTURE_2D,
        0, GL_RGB,
        textureImage->w,
        textureImage->h,
        0,
        GL_RGB,
        GL_UNSIGNED_BYTE,
        textureImage->pixels);
    SDL_FreeSurface(textureImage);

    }
}

平台VBO:

PlatformVBO::PlatformVBO() {
    glGenBuffers(1, &vboID);
    glGenBuffers(1, &colorID);
    glGenBuffers(1, &texID);
    //glGenBuffers(1, &indID);

    texCoords.push_back(0.0f);
    texCoords.push_back(0.0f);

    texCoords.push_back(1.0f);
    texCoords.push_back(0.0f);

    texCoords.push_back(1.0f);
    texCoords.push_back(1.0f);

    texCoords.push_back(0.0f);
    texCoords.push_back(1.0f);

    //
    indices.push_back(0);
    indices.push_back(1);
    indices.push_back(2);

    indices.push_back(0);
    indices.push_back(2);
    indices.push_back(3);


    bgTexture = new Texture("./Texture/shiphull.png");
    platform = new Texture("./Texture/Abstract_Vector_Background.png");
    // Give the image to OpenGL


    glBindBuffer(GL_ARRAY_BUFFER, texID);
    glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) *texCoords.size() / 2, &texCoords, GL_STATIC_DRAW);


    //glBindBuffer(GL_ARRAY_BUFFER, texID);
    //glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) *texCoords.size() / 2, &texCoords, GL_STATIC_DRAW);


}

更新VBO:

void PlatformVBO::setVBO(){
    // Vertices:
    glBindBuffer(GL_ARRAY_BUFFER, vboID);
    glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) *vertices.size(), &vertices.front(), GL_STATIC_DRAW);


    glBindBuffer(GL_ARRAY_BUFFER, colorID);
    glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) *colors.size(), &colors.front(), GL_STATIC_DRAW);



}

绘制:

void PlatformVBO::drawTexture(){


    if (vertices.size() > 0){
        setVBO();


        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indID);

            //Enable states, and render (as if using vertex arrays directly)
            glEnableClientState(GL_VERTEX_ARRAY);

            glBindBuffer(GL_ARRAY_BUFFER, vboID);
            glVertexPointer(2, GL_FLOAT, 0, 0);

            glEnableClientState(GL_TEXTURE_COORD_ARRAY);
            glBindBuffer(GL_ARRAY_BUFFER, texID);
            glTexCoordPointer(2, GL_FLOAT, 0, 0);

            if (bgTexture->GetTexture() >= 0) {
                glEnable(GL_TEXTURE_2D);      // Turn on Texturing
            //  glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
                glBindTexture(GL_TEXTURE_2D, bgTexture->GetTexture());
            }

            //Draw the thing!
            glDrawElements(GL_TRIANGLES, indices.size(), GL_UNSIGNED_INT, &indices[0]);

            //restore the GL state back

            glDisableClientState(GL_TEXTURE_COORD_ARRAY);
            glDisableClientState(GL_VERTEX_ARRAY);

            if (bgTexture->GetTexture() >= 0) {
                glDisable(GL_TEXTURE_2D);      // Turn off Texturing
                glBindTexture(GL_TEXTURE_2D, bgTexture->GetTexture());
            }



            glBindBuffer(GL_ARRAY_BUFFER, 0); //Restore non VBO mode
            glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);



    }
}

1 个答案:

答案 0 :(得分:1)

不要将纹理坐标大小除以2(将坐标切成两半),并且不传递向量的地址(这将给出未定义的结果,因为不能保证{{1的内存布局}})。

请改用:

std::vector

请注意这是如何使用glBufferData (GL_ARRAY_BUFFER, sizeof(GLfloat) * texCoords.size(), &texCoords [0], GL_STATIC_DRAW); std::vector返回的引用地址的? C ++ 03保证内部用于元素存储的内存是一个连续的数组。许多早期的C ++标准库实现都是这样的,但规范。不保证。 C ++ 11添加了operator [],它有效地做了同样的事情,但是使你的代码需要更新的编译器。