Рисование двух разных фигур перезаписывает друг друга [Основной профиль OpenGL] - PullRequest
0 голосов
/ 09 апреля 2020

Итак, я создал класс, который помогает мне абстрагировать большую часть процесса рисования, когда дело доходит до создания базовых 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);
}

В настоящее время мы получаем результат, подобный следующему: Результат , который показывает, что он использует шейдер плоскостей, потому что шейдер кубов имеет цвет в зависимости от положения. Где шейдер плоскостей использует постоянный белый цвет в своем фрагментном шейдере.

1 Ответ

1 голос
/ 10 апреля 2020

glUniform* устанавливает униформу в унифицированном кадре по умолчанию для текущей программы, поэтому программа должна быть установлена ​​раньше, glUseProgram:

cube.shader.use(); // <----- install program
cube.shader.setMat4("projection", projection);
cube.shader.setMat4("view", view);
cube.shader.setMat4("model", model);
cube.shader.setFloat("time", currentFrame);
cube.Draw();
plane.shader.use(); // <----- install program
plane.shader.setMat4("view", view);
plane.shader.setMat4("projection", projection);
plane.shader.setMat4("model", model);
plane.shader.setFloat("time", currentFrame);
plane.Draw();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...