OPENGL如何有一个背景精灵表,并在顶部有另一个相同类的对象

问题描述

我被同一问题困住了一段时间,非常感谢您的帮助。我正在尝试为我的游戏背景加载纹理,其中我在图像前面只有一辆移动的汽车作为背景,但纹理根本没有为背景渲染,我不知道为什么。相关的代码片段是:

void display()                                  
{
    //clear the colour and depth buffers
    glClear(GL_COLOR_BUFFER_BIT);
    glm::mat4 ModelViewMatrix;
    glm::mat4 ModelViewMatrixBackground;
    ViewMatrix = glm::translate(glm::mat4(1.0),glm::vec3(0.0,0.0,0.0));

    glEnable(GL_BLEND);
    ModelViewMatrixBackground = glm::translate(ViewMatrix,glm::vec3(0,0.0));
    ModelViewMatrix = glm::translate(ViewMatrix,glm::vec3(mySpriteSquare.GetXPos(),mySpriteSquare.GetYPos(),0.0));

    //ModelViewMatrix = glm::rotate(ModelViewMatrix,glm::radians(AngleInDegrees),1.0));
    //ModelViewMatrix = glm::rotate(ModelViewMatrix,glm::radians(degrees),1,0));

    myBackground.Render(shader,ModelViewMatrixBackground,ProjectionMatrix);
    mySpriteSquare.Render(shader,ModelViewMatrix,ProjectionMatrix);



    glDisable(GL_BLEND);
    glm::mat4 TriangleTransform = glm::translate(ViewMatrix,glm::vec3(Xtri,Ytri,0.0));
    myCircle.Render(shader,TriangleTransform,ProjectionMatrix);

    glutSwapBuffers();

}
void init()
{
    FreeImage_Initialise();

    glClearColor(0.0,1.0,0.0);                      //sets the clear colour to black
     
    //Load the GLSL program 
    if (!shader.load("Basic","./glslfiles/basicTexture.vert","./glslfiles/basicTexture.frag"))
    {
        std::cout << "failed to load shader" << std::endl;
    }

    ///This part commented is to scale the width of the sprite to match the dimensions of the car.png image.
    mySpriteSquare.SetWidth(5.0f *(500 / 264.0f));
    mySpriteSquare.SetHeight(5.0f);
    float red[3] = { 1,0 };
    mySpriteSquare.Init(shader,red,"textures/car.png");


    myBackground.SetWidth(900.0f);
    myBackground.SetHeight(900.0f);
    float redBackground[3] = { 1,0 };
    myBackground.Init(shader,redBackground,"textures/bricks.png");



    glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
}
    #include "Background.h"
    #include "shaders\Shader.h"
    #include <string>
    #include "ImageLoading.h"
    
    #include <string>
    
    #include <iostream>
    
    
    
    Background::Background()
    {
        m_vaoID = 0;
        m_vboID[0] = 0;
        m_vboID[1] = 0;
        m_Width = 0.0f;
        m_Height = 0.0f;
        m_NumberOfVerts = 0;
        m_xpos = 0;
        m_ypos = 0;
    }
    
    void Background::SetWidth(float size)
    {
        m_Width = size;
    }
    
    void Background::SetHeight(float size)
    {
        m_Height = size;
    }
    
    void Background::SetXpos(float x)
    {
        m_xpos = x;
    }
    void Background::SetYpos(float y)
    {
        m_ypos = y;
    }
    float Background::GetXPos()
    {
        return m_xpos;
    }
    float Background::GetYPos()
    {
        return m_ypos;
    }
    
    void Background::IncPos(float x,float y)
    {
        m_xpos += x;
        m_ypos += y;
    }
    void Background::Init(Shader& shader,float colour[3],std::string filename)
    {
        //load png image
        int imageHeight = 0;
        int imageWidth = 0;
    
        //create the texture on the GPU
        glGenTextures(1,&m_TexName);
        glBindTexture(GL_TEXTURE_2D,m_TexName);
    
        glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP);  //or use GL_CLAMP
        glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP);
        glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
        glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
    
        bool success = ImageLoading::loadImage(filename);
        if (!success) {
            std::cout << "Unable to load image file" << std::endl;
            glDeleteTextures(1,&m_TexName);
            return;
        }
        else
        {
            std::cout << "Image loaded " << std::endl;
        }
    
    
    
    
        //Create the geometry
        m_NumberOfVerts = 6;
        float vert[18]; // create a vertex array
    
        float halfWidth = m_Width / 2.0f;
        float halfHeight = m_Height / 2.0f;
    
        vert[0] = -halfWidth; vert[1] = halfHeight; vert[2] = 0.0; //x,y,z values for each vertex
        vert[3] = -halfWidth; vert[4] = -halfHeight; vert[5] = 0.0;
        vert[6] = halfWidth; vert[7] = -halfHeight; vert[8] = 0.0;
    
        vert[9] = -halfWidth; vert[10] = halfHeight; vert[11] = 0.0;
        vert[12] = halfWidth; vert[13] = halfHeight; vert[14] = 0.0;
        vert[15] = halfWidth; vert[16] = -halfHeight; vert[17] = 0.0;
    
        /********INIT CORNERS FOR OBB***********/
    
        obb.vertOriginal[0].x = -halfWidth;
        obb.vertOriginal[0].y = -halfHeight;
    
        obb.vertOriginal[1].x = halfWidth;
        obb.vertOriginal[1].y = -halfHeight;
    
        obb.vertOriginal[2].x = halfWidth;
        obb.vertOriginal[2].y = halfHeight;
    
        obb.vertOriginal[3].x = -halfWidth;
        obb.vertOriginal[3].y = halfHeight;
    
        /*******************/
    
    
        float tex[12];
        tex[0] = 0.0f;   tex[1] = 1.0f;
        tex[2] = 0.0f;   tex[3] = 0.0;
        tex[4] = 1.0f;   tex[5] = 0.0;
    
        tex[6] = 0.0f;   tex[7] = 1.0f;
        tex[8] = 1.0f;   tex[9] = 1.0f;
        tex[10] = 1.0f;  tex[11] = 0.0;
    
    
        float col[18];  // colour array
        col[0] = colour[0]; col[1] = colour[1]; col[2] = colour[2]; //r,g,b values for each vertex
        col[3] = colour[0]; col[4] = colour[1]; col[5] = colour[2]; //r,b values for each vertex
        col[6] = colour[0]; col[7] = colour[1]; col[8] = colour[2]; //r,b values for each vertex
        col[9] = colour[0]; col[10] = colour[1]; col[11] = colour[2]; //r,b values for each vertex
        col[12] = colour[0]; col[13] = colour[1]; col[14] = colour[2]; //r,b values for each vertex
        col[15] = colour[0]; col[16] = colour[1]; col[17] = colour[2]; //r,b values for each vertex
    
        //VAO allocation
        glGenVertexArrays(1,&m_vaoID);
    
        // First VAO setup
        glBindVertexArray(m_vaoID);
    
        glGenBuffers(3,m_vboID); // we need three VBOs - one for the vertices and one for the colours
                                //and an extra one for the texture coordinates
    
        //Lets set up the vertices.
        glBindBuffer(GL_ARRAY_BUFFER,m_vboID[0]);
    
        //initialises data storage of vertex buffer object
        glBufferData(GL_ARRAY_BUFFER,m_NumberOfVerts * 3 * sizeof(GLfloat),vert,GL_STATIC_DRAW);
    
        //set the position - linked to the position shader input
        GLint vertexLocation = glGetAttribLocation(shader.handle(),"in_Position");
        glEnableVertexAttribArray(vertexLocation);
        glVertexAttribPointer(vertexLocation,3,GL_FLOAT,GL_FALSE,0);
    
        //Now set up the colours
        glBindBuffer(GL_ARRAY_BUFFER,m_vboID[1]);
        glBufferData(GL_ARRAY_BUFFER,col,GL_STATIC_DRAW);
    
        //set the colour - linked to the colour shader input.
        GLint colorLocation = glGetAttribLocation(shader.handle(),"in_Color");
        glEnableVertexAttribArray(colorLocation);
        //location in shader,number of componentns,type,normalised,stride,pointer to first attribute
        glVertexAttribPointer(colorLocation,0);
    
        //Now set up the texture coordinates
        glBindBuffer(GL_ARRAY_BUFFER,m_vboID[2]);
        glBufferData(GL_ARRAY_BUFFER,tex,GL_STATIC_DRAW);
    
        //set the texture coords - linked to the texcoord shader input.
        GLint texLocation = glGetAttribLocation(shader.handle(),"in_TexCoord");
        glEnableVertexAttribArray(texLocation);
        //location in shader,pointer to first attribute
        glVertexAttribPointer(texLocation,2,0);
    
        //good practice to bind to 0.
        glEnableVertexAttribArray(0);
    
        glBindVertexArray(0);
    }
    
    void Background::Render(Shader& shader,glm::mat4& ModelViewMatrix,glm::mat4& ProjectionMatrix)
    {
        /****UPDATE THE CORNER VALUES BASED ON TRANSFORMATION***/
        obb.transformPoints(ModelViewMatrix);
        /*******************************************************/
    
        glUseProgram(shader.handle());  // use the shader
    
        //set the DiffuseMap in GLSL to the texture unit 0.
        glUniform1i(glGetUniformLocation(shader.handle(),"DiffuseMap"),0);
    
        glBindTexture(GL_TEXTURE_2D,m_TexName);
    
        //set the uniform for the projectionmatrix
        glUniformMatrix4fv(glGetUniformLocation(shader.handle(),"ProjectionMatrix"),&ProjectionMatrix[0][0]);
    
        //pass the uniform for the ModelView matrix to the shader
        glUniformMatrix4fv(glGetUniformLocation(shader.handle(),"ModelViewMatrix"),&ModelViewMatrix[0][0]);
    
        //Draw the object
        glBindVertexArray(m_vaoID);     // select first VAO
        glDrawArrays(GL_TRIANGLES,m_NumberOfVerts); // draw first object
    
        glBindVertexArray(0); //unbind the vertex array object
        glUseProgram(0); //turn off the current shader
    }
    
    OBB& Background::GetOBB()
    {
        return obb;
    }
    
    bool Background::IsInCollision(OBB& anotherOBB)
    {
        if (obb.SAT2D(anotherOBB))
        {
            return true;
        }
        return false;
    }

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)