Я установил все необходимые элементы (шейдеры, 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 пикселей, но я не знаю, чего мне не хватает.
Ответ на этот вопрос, как прокомментировал @Ripi, использовать:
glUniformMatrix4fv(uniProjection,1,GL_FALSE,glm::value_ptr(projection));
после активации шейдера shader.startProgram();
Так что матрица учитывается внутри вершинного шейдера.
Других решений пока нет …