Итак, я создал класс, который помогает мне абстрагировать большую часть процесса рисования, когда дело доходит до создания базовых c форм для прототипирования шейдеров.
Этот класс с именем Geometry.h отлично работает для рисования только один объект, однако при добавлении второго объекта, например, так:
// Main Render Loop
glm::mat4 projection = glm::perspective(glm::radians(camera.Zoom), (float)SCR_WIDTH / (float)SCR_HEIGHT, 0.1f, 100.0f);
glm::mat4 view = camera.GetViewMatrix();
cube.shader.setMat4("projection", projection);
cube.shader.setMat4("view", view);
plane.shader.setMat4("view", view);
plane.shader.setMat4("projection", projection);
glm::mat4 model = glm::mat4(1.0f);
cube.shader.setMat4("model", model);
cube.shader.setFloat("time", currentFrame);
cube.Draw();
model = glm::mat4(1.0f);
model = glm::scale(model, glm::vec3(2.0f, 0.0f, 2.0f));
plane.shader.setMat4("model", model);
plane.shader.setFloat("time", currentFrame);
plane.Draw();
"куб" и "плоскость" являются моделями одного и того же набора вершин, один будет только масштабироваться таким образом, чтобы удалить ось Y и сделать его плоскостью. Проблема в том, что когда я рисую их, рисуется только первый, и он рисуется с помощью шейдера последнего.
Вот соответствующий код моего Geometry
класса
// Geometry.h
class Geometry {
public:
std::vector<float> mesh;
std::vector<GLuint> indices;
GLuint VAO;
Shader shader;
Geometry(std::vector<float> vertices, std::vector<GLuint> indices);
void Draw();
void setShader(const char* vs, const char* fs);
private:
GLuint VBO, EBO;
void setup();
};
// Geometry.cpp
void Geometry::Draw()
{
shader.use();
glBindVertexArray(VAO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
glDrawElements(GL_TRIANGLES, indices.size(), GL_UNSIGNED_INT, 0);
glBindVertexArray(0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
}
// Called in constructor[![enter image description here][1]][1]
void Geometry::setup()
{
glGenVertexArrays(1, &VAO);
glGenBuffers(1, &VBO);
glGenBuffers(1, &EBO);
glBindVertexArray(VAO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, mesh.size() * sizeof(float), &mesh[0], GL_STATIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices.size() * sizeof(GLuint), &indices[0], GL_STATIC_DRAW);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
glBindVertexArray(0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
}
В настоящее время мы получаем результат, подобный следующему: Результат , который показывает, что он использует шейдер плоскостей, потому что шейдер кубов имеет цвет в зависимости от положения. Где шейдер плоскостей использует постоянный белый цвет в своем фрагментном шейдере.