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
Opengl 纹理渲染错误?_Opengl_Textures_Gpu - Fatal编程技术网

Opengl 纹理渲染错误?

Opengl 纹理渲染错误?,opengl,textures,gpu,Opengl,Textures,Gpu,我正在和一些freinds做一个学士学位项目,我们遇到了一个OpenGL纹理的相当混乱的bug。我想知道这里是否有关于这些事情的知识 我们面临的问题是,在笔记本电脑上(运行英特尔高清图形),我们可以很好地看到纹理。但如果我们将其改为在专用图形卡上运行,我们就看不到纹理。在我们的台式机上,我们也看不到有专门的垃圾卡(AMD和Nvidia) 那么,这是怎么回事?有什么想法吗 编辑:添加了纹理和渲染代码,不是我做的,所以我不知道它是如何100%工作的。但我想我找到了一切 纹理加载: Texture::

我正在和一些freinds做一个学士学位项目,我们遇到了一个OpenGL纹理的相当混乱的bug。我想知道这里是否有关于这些事情的知识

我们面临的问题是,在笔记本电脑上(运行英特尔高清图形),我们可以很好地看到纹理。但如果我们将其改为在专用图形卡上运行,我们就看不到纹理。在我们的台式机上,我们也看不到有专门的垃圾卡(AMD和Nvidia)

那么,这是怎么回事?有什么想法吗

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

纹理加载:

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);



}
抽签:


不要将纹理坐标大小除以2(这会将坐标减半),也不要传递向量的地址(这会给出未定义的结果,因为无法保证
std::vector
的内存布局)

改用这个:
注意这是如何使用
std::vector
操作符[]
返回的引用地址的?C++03保证内部用于元素存储的内存是连续数组。C++标准库的许多早期实现都是这样工作的,但是规范并不能保证它。C++11添加了
std::vector::data()
,有效地实现了同样的功能,但使您的代码需要更新的编译器。

“适用于英特尔,但不适用于其他供应商”这一说法非常模糊。尝试启动OpenGL调试上下文并阅读调试消息,或者至少在一些地方使用glGetError来尝试了解更多信息。如果你需要更多的帮助,你可能应该发布更多的细节。虽然没有错误。它运行良好,只是我们看不到纹理。是的,我知道这有点模糊。但这大概是我唯一需要帮助的时候了(x)至少为我们提供一些关于如何上传和绑定纹理的代码为什么要创建/填充IBO,然后不在
glPaureElements()
调用中使用它(如果要使用绑定的IBO,最后一个参数应该是字节偏移量而不是客户端指针)?
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);



    }
}
glBufferData (GL_ARRAY_BUFFER, sizeof(GLfloat) * texCoords.size(), &texCoords [0], GL_STATIC_DRAW);