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

Я установил все необходимые элементы (шейдеры, 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 пикселей, но я не знаю, чего мне не хватает.

-2

Решение

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

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

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

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]