Ортогональная проекция

Я установил все необходимые элементы (шейдеры,vao/vbo, привязка, рисование), но моя форма все еще не появляется. Если я опускаю матрицы вида и проекции, появляется форма, но если я добавляю их, все они исчезают, что я забыл включить в следующий код:

Отредактированный код, который работает:

main.cpp:

#include <GL/glew.h>
#include <SFML/Window.hpp>

#include <glm/glm.hpp>
#include <glm/gtc/type_ptr.hpp>
#include <glm/gtc/matrix_transform.hpp>

#include <vector>

#include "ShaderProgram.h"
#include "VHandler.h"

using namespace std;
using namespace sf;

const int WIDTH = 800;
const int HEIGHT = 600;

int main()
{
    /*************************************/
    ContextSettings settings;
    settings.depthBits = 24;
    settings.stencilBits = 8;
    /*************************************/

    /*************************************/
    Window window(VideoMode(WIDTH,HEIGHT),
                  "GLWindow",
                  Style::Titlebar|Style::Close,
                  settings);    
    bool running = true;
    /*************************************/

    /*************************************/
    glewExperimental = GL_TRUE;
    glewInit();
    /*************************************/

    /*************************************/
    ShaderProgram shader;
    shader.loadShaders("shaders/vShader.vert","shaders/fShader.frag");
    /*************************************/

    /*************************************/
    /**VAOs & VBOs**/
    vector<float> vertices{{0.0f, 0.0f,0.0f,
                            0.0f, 1.0f,0.0f,
                            1.0f, 1.0f,0.0f,

                            0.0f, 0.0f,0.0f,
                            1.0f, 1.0f,0.0f,
                            1.0f, 0.0f,0.0f}};

    vector<float> colors{{1,0,0,0,1,0,0,0,1,1,1,1}};

    VHandler handler;
    handler.loadData(vertices,colors);
    /*************************************/


    /*************************************/
    GLuint uniProjection = glGetUniformLocation(shader.getProgram(),"projection");
    GLuint uniView = glGetUniformLocation(shader.getProgram(),"view");
    GLuint uniTransform = glGetUniformLocation(shader.getProgram(),"transform");

    glm::mat4 projection = glm::mat4(1);
    projection = glm::ortho(0.0f,static_cast<float>(WIDTH),static_cast<float>(HEIGHT),0.0f,1.0f,-1.0f);
    /*************************************/

    while(running)
    {
        Event windowEvt;
        while(window.pollEvent(windowEvt))
        {
            if(windowEvt.type == Event::Closed){running = false; break;}
        }

        /*************************************/
        glClearColor(0,0,0,1);
        glClear(GL_COLOR_BUFFER_BIT);
        /*************************************/

        /*************************************/
        shader.startProgram();
        handler.bindVao();
        /*************************************/

        /*************************************/     
        glUniformMatrix4fv(uniProjection,1,GL_FALSE,glm::value_ptr(projection));

        glm::mat4 view;
        glUniformMatrix4fv(uniView, 1, GL_FALSE, glm::value_ptr(view));

        glm::mat4 transform = glm::mat4(1);
        transform = glm::translate(transform, glm::vec3(0.0f, 0.0f, 0.0f));
        transform = glm::scale(transform, glm::vec3(10.0f, 10.0f, 0.0f));
        glUniformMatrix4fv(uniTransform, 1, GL_FALSE, glm::value_ptr(transform));
        /*************************************/

        /*************************************/
        glDrawArrays(GL_TRIANGLES, 0, 6);
        handler.unbindVao();
        shader.endProgram();
        /*************************************/

        /*************************************/
        window.display();
        /*************************************/
    }

    /*************************************/
    handler.cleanMemory();
    shader.cleanShaders();
    window.close();
    /*************************************/

    return 0;
}

vertexShader:

#version 330 core

layout (location = 0) in vec3 position;
layout (location = 1) in vec3 color;
out vec3 Color;

uniform mat4 projection;
uniform mat4 view;
uniform mat4 transform;

void main()
{
Color = color;
//gl_Position = projection * view * transform * vec4(position, 1.0); //Can't see anything
//gl_Position = projection * transform * vec4(position, 1.0); //Can't see anything
gl_Position = transform * vec4(position, 1.0); //Works correctly
}

Если я понимаю, как работает ортографическая проекция, моя форма должна появиться в левом верхнем углу с шириной и высотой 10 пикселей, но я не знаю, чего мне не хватает.

1 ответ

Решение

Ответ на этот вопрос, как прокомментировал @Ripi, использовать:

glUniformMatrix4fv(uniProjection,1,GL_FALSE,glm::value_ptr(projection));

после активации шейдера shader.startProgram(); Так что матрица учитывается внутри вершинного шейдера.

Другие вопросы по тегам