Здраствуйте, пробую реализовать арканоид, но столкнулся с проблемой, что текстуры привязуется к не правильным участкам пространства. У меня есть пока- что 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);
}
Нужно было использовать:
shader.Use() до вызова glUniformMatrix4fv(this->modelCoor,1,GL_FALSE,glm::value_ptr(model))
В этом и была вся ошибка, и насколько я понял, вызов: glUseProgram(program)
, должен вызываться раньше, чем выше упомянатая функция.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
ООП в плюсах для меня тема новаяНужно написать класс my_sample который должен иметь среди своих приватных полей вектор long double, который назвать...
А для чего нужны спецификации исключения noexcept(true) и noexcept(false), как и когда они используются?
Я пытаюсь сделать диалог vuetify(библиотека vue js) растягиваемым с помощью resize jqueryЯ столкнулся с рядом проблем: 1) jquery расширяет диалог по всем...