Матрица / вектор OpenGL GLM не инициализируется должным образом - PullRequest
1 голос
/ 27 мая 2020

Я пытаюсь использовать GLM в проекте SDL / OpenGL, используя MinGW-w64 в качестве компилятора, и мне не удается установить значение для любой матрицы или вектора, который я пытаюсь инициализировать (все значения в структуре устанавливаются на 0.)

Я не получаю никаких ошибок или предупреждений компилятора, и кажется, что память распределяется правильно, но значения просто не устанавливаются.

#include "engine.hpp"
#include <GL/GLew.h>
#include <SDL2/SDL.h>
#include <SDL2/SDL_opengl.h>
#include <GL/GL.h>
#include <GL/glu.h>
#include <GL/glext.h>
#include <stdio.h>

...

void Engine::run(){
  ...
  GLuint shaderProg = renderer::loadShaders("shaders/vertShader.glsl", "shaders/fragShader.glsl");

  if(shaderProg==0)
    return;

  glm::mat4 projMat = glm::perspective(glm::radians(45.0f), float(SCREEN_WIDTH)/float(SCREEN_HEIGHT), 0.1f, 100.0f);
  //glm::mat4 projMat = glm::ortho(-10.0f, 10.0f, -10.0f, 10.0f, 0.0f, 100.0f);

  glm::mat4 viewMat = glm::lookAt(glm::vec3(4,3,3),
                                  glm::vec3(0,0,0),
                                  glm::vec3(0,1,0));

  glm::mat4 modelMat = glm::mat4(1.0f);

  glm::mat4 mvp = projMat*viewMat*modelMat;

  glm::vec4 test(1, 1.0f, 1.0f, 1.0f);

  GLuint mvpID = glGetUniformLocation(shaderProg, "MVP");
  glUniformMatrix4fv(mvpID, 1, GL_FALSE, &mvp[0][0]);

  for(int i = 0; i < 4; i++)
  {
    for(int j = 0; j < 4; j++)
    {
      printf("%f ", &projMat[i][j]);
    }
    printf("\n");
  }
  ...
}

1 Ответ

0 голосов
/ 27 мая 2020

glUniform* устанавливает значение униформ в стандартном блоке униформ текущей установленной программы. Следовательно, программа должна быть установлена ​​до glUseProgram:

GLuint mvpID = glGetUniformLocation(shaderProg, "MVP");

glUseProgram(shaderProg);

glUniformMatrix4fv(mvpID, 1, GL_FALSE, &mvp[0][0]);

Начиная с версии OpenGL 4.1, предоставляется glProgramUniform*, в котором указывается значение унифицированной переменной для указанного программного объекта:

GLuint mvpID = glGetUniformLocation(shaderProg, "MVP");
glProgramUniformMatrix4fv(shaderProg, mvpID, 1, GL_FALSE, &mvp[0][0]);
...