Проблема с отображением текстур

260
29 ноября 2021, 02:10

Здраствуйте, пробую реализовать арканоид, но столкнулся с проблемой, что текстуры привязуется к не правильным участкам пространства. У меня есть пока- что 2 объекта ball и platform. Если я отрисовую только шар или платформу, то оно отображается там где нужно, но если я рисую два, то текстуры отображаются в не правильном порядке. В чём может быть ошибка?

Вот так выглядит если закоментировать ball->draw(model):

А так если закометить platform->draw(model): Код базового класса:

     class BaseGameObject
     {
     protected:
        GLuint vbo, vao, ebo;
        GLuint texture;
        Shader shader;
        GLFWwindow * window;
        bool value;
     public:
        BaseGameObject();
        BaseGameObject(ObjectCreater object, GLFWwindow *mainwindow, Shader shader);
        BaseGameObject(const BaseGameObject & other);
        BaseGameObject(BaseGameObject && other);
        BaseGameObject & operator =(const BaseGameObject & other);
        BaseGameObject & operator =(BaseGameObject && other) noexcept;
        virtual void draw(glm::mat4 model) = 0;
        virtual ~BaseGameObject();
    };
    BaseGameObject::BaseGameObject()
    {
        vbo=0, vao=0, ebo=0;
        texture=0;
        shader=Shader();
        window= nullptr;
        value=false;
    }
    BaseGameObject::BaseGameObject(ObjectCreater object, GLFWwindow *mainwindow, Shader shader)
                                   :window(mainwindow),shader(shader),value(false)
    {
        if(!object.isInitializate())
        {
            object.initializate();
        }
        std::array<GLuint,4> data;
        data=object.returnData();
        vao=data.at(0);
        vbo=data.at(1);
        ebo=data.at(2);
        texture=data.at(3);
    }
    BaseGameObject::BaseGameObject(const BaseGameObject &other)
    {
        this->vao=other.vao;
        this->vbo=other.vbo;
        this->ebo=other.ebo;
        this->texture=other.texture;
        this->shader=other.shader;
        this->value=other.value;
        this->window=other.window;
        //this->modelCoor = other.modelCoor;
    }
    BaseGameObject::BaseGameObject(BaseGameObject &&other)
    {
        this->vao=other.vao;
        this->vbo=other.vbo;
        this->ebo=other.ebo;
        this->texture=other.texture;
        this->shader=other.shader;
        this->value=other.value;
        this->window=other.window;
        //this->modelCoor = other.modelCoor;
        other.vao=0;
        other.vbo=0;
        other.ebo=0;
        other.texture=0;
        //other.shader= nullptr;
        other.value=false;
        other.window= nullptr;
        //other.modelCoor = 0;
    }
    BaseGameObject& BaseGameObject::operator=(const BaseGameObject &other)
    {
        this->vao=other.vao;
        this->vbo=other.vbo;
        this->ebo=other.ebo;
        this->texture=other.texture;
        this->shader=other.shader;
        this->value=other.value;
        this->window=other.window;
        //this->modelCoor = other.modelCoor;
    }
    BaseGameObject& BaseGameObject::operator=(BaseGameObject &&other) noexcept
    {
        this->vao=other.vao;
        this->vbo=other.vbo;
        this->ebo=other.ebo;
        this->texture=other.texture;
        this->shader=other.shader;
        this->value=other.value;
        this->window=other.window;
        //this->modelCoor = other.modelCoor;
        other.vao=0;
        other.vbo=0;
        other.ebo=0;
        other.texture=0;
        //other.shader= nullptr;
        other.value=false;
        other.window= nullptr;
        //other.modelCoor = 0;
    }

    BaseGameObject::~BaseGameObject()
    {
        glDeleteVertexArrays(1, &vao);
        glDeleteBuffers(1, &vbo);
        glDeleteBuffers(1, &ebo);
    }
Код шара:
    class Ball:public BaseGameObject
    {
        GLint modelCoor;
        float a,b,c;
        float sx,sy,sz;
        void func();
        int verticalSpeed, gorizontalSpeed;
    public:
        Ball(ObjectCreater object, GLFWwindow *mainwindow, Shader shader);
        void draw(glm::mat4 model) override;
        void calcBallForwarding();
    };
    Ball::Ball(ObjectCreater object, GLFWwindow *mainwindow, Shader shader)
        : BaseGameObject(object, mainwindow,shader)
        ,verticalSpeed(0),gorizontalSpeed(0),
        a(0.),b(0.),c(1.),sx(0.03),sy(0.03),sz(0.),modelCoor(glGetUniformLocation(shader.program,"model")){}

    void Ball::func()
    {
        return;
    }
    void Ball::calcBallForwarding()
    {
        return;
    }
    void Ball::draw(glm::mat4 model)
    {
        int screenHeigth=800,screenWidth=600;
        glm::mat4 projection = glm::ortho(-1.0f, +1.0f, -1.0f, +1.0f, +1.0f, -1.0f);
        glm::mat4 camera = glm::lookAt(
                glm::vec3(+0.0f,+0.0f,+1.0f),
                glm::vec3(0.0f,0.0f,0.0f),
                glm::vec3(0.0f,1.0f,0.0f)
        );
        float screen;
        model=glm::translate(model, glm::vec3(a,b,c));
        model=glm::scale(model,glm::vec3(sx,sy,sz));
        model = projection * camera * model;
        /*
         * glfwGetWindowSize(window,&screenWidth,&screenHeigth);
        screen=(float)screenWidth/(float)screenHeigth;
    */
        glUniformMatrix4fv(this->modelCoor,1,GL_FALSE,glm::value_ptr(model));
        glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
        glEnable(GL_BLEND);
        glBindTexture(GL_TEXTURE_2D, texture);
        shader.Use();
        glBindVertexArray(vao);
        glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
        glBindTexture(GL_TEXTURE_2D,0);
        glBindVertexArray(0);
        glDisable(GL_BLEND);
        return;
    }
Код платформы:
class Platform:public BaseGameObject
{
    GLint modelCoor;
    float a,b,c;
    float sx,sy,sz;
    const std::size_t lenBoolArr;
    bool *motionSet;
public:
    Platform()=default;
    Platform(ObjectCreater object, GLFWwindow *mainwindow, Shader shader, bool *motionSetting);
    void draw(glm::mat4 model) override;
    void getCurrentPositionPlatform();
};
Platform::Platform(ObjectCreater object, GLFWwindow *mainwindow, Shader shader, bool *motionSetting)
    : BaseGameObject(object, mainwindow,shader),motionSet(motionSetting),lenBoolArr(2),
    a(0.),b(-0.75),c(1.),sx(0.25),sy(0.25),sz(0.),modelCoor(glGetUniformLocation(shader.program,"model")){}

void Platform::draw(glm::mat4 model)
{
    static const float lim = 0.7f;
    int screenHeigth=800,screenWidth=600;
    float screen;
    glm::mat4 projection = glm::ortho(-1.0f, +1.0f, -1.0f, +1.0f, +1.0f, -1.0f);
    glm::mat4 camera = glm::lookAt(
            glm::vec3(+0.0f,+0.0f,1.0f),
            glm::vec3(0.0f,0.0f,0.0f),
            glm::vec3(0.0f,1.0f,0.0f)
    );
    model=glm::translate(model, glm::vec3(a,b,c));
    model=glm::scale(model,glm::vec3(sx,sy,sz));
    model = projection * camera * model;
    /*
     * glfwGetWindowSize(window,&screenWidth,&screenHeigth);
    screen=(float)screenWidth/(float)screenHeigth;
*/
    if(motionSet[0] && a > -lim)
    {
        a+=-0.1f;
        motionSet[0]=false;
    }
    if(motionSet[1] && a < lim)
    {
        a+=0.1f;
        motionSet[1]=false;
    }
    glUniformMatrix4fv(this->modelCoor,1,GL_FALSE,glm::value_ptr(model));
    glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
    glEnable(GL_BLEND);
    glBindTexture(GL_TEXTURE_2D, texture);
    shader.Use();
    glBindVertexArray(vao);
    glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
    glBindTexture(GL_TEXTURE_2D,0);
    glBindVertexArray(0);
    glDisable(GL_BLEND);
    return;
}
void render(BaseGameObject * ball,BaseGameObject * platform, glm::mat4 model)
{
    glClearColor(0.f, 0.f, 0.f, 1.f);
    glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT);
    platform->draw(model);
    ball->draw(model);
}
Answer 1

Нужно было использовать:

shader.Use() до вызова glUniformMatrix4fv(this->modelCoor,1,GL_FALSE,glm::value_ptr(model))

В этом и была вся ошибка, и насколько я понял, вызов: glUseProgram(program), должен вызываться раньше, чем выше упомянатая функция.

READ ALSO
Ошибка при переписывание кода в функции

Ошибка при переписывание кода в функции

Попалась вот такая задача:

129
Создать класс по обработке массива данных

Создать класс по обработке массива данных

ООП в плюсах для меня тема новаяНужно написать класс my_sample который должен иметь среди своих приватных полей вектор long double, который назвать...

104
Спецификатор времени компиляции noexcept

Спецификатор времени компиляции noexcept

А для чего нужны спецификации исключения noexcept(true) и noexcept(false), как и когда они используются?

96
Диалог vuetify vue js и jquery

Диалог vuetify vue js и jquery

Я пытаюсь сделать диалог vuetify(библиотека vue js) растягиваемым с помощью resize jqueryЯ столкнулся с рядом проблем: 1) jquery расширяет диалог по всем...

121