GLSL преобразует действительную матрицу glm :: mat4 в матрицу nan - PullRequest
0 голосов
/ 18 марта 2020

Я следую инструкциям http://www.mbsoftworks.sk/tutorials/opengl3/ и пытаюсь скомпилировать 10-й пример.

Все отлично работает, кроме места, которое я отправляю (матрица проекции и матрица вида модели) в шейдер.

Есть место, куда я отправляю матрицу:

//...
// render.cpp
    glm::mat4 projectionMatrix = *(oglControl->getProjectionMatrix());
    glm::mat4 cam = glm::translate(mModelView, cCamera.vEye);
    auto newM = projectionMatrix * cam;
    spDirectionalLight.setUniform("projectionMatrixMulModelViewMatrix",&newM);
//...
//...
// setUniform implementation
void CShaderProgram::setUniform(string sName, glm::mat4* mMatrices, int iCount)
{
    int iLoc = glGetUniformLocation(uiProgram, sName.c_str());
    glUniformMatrix4fv(iLoc, iCount, FALSE, (GLfloat*)mMatrices);
}
//...

и в конце mMatrices содержат [mMatrix content].

Код шейдера

#version 330 core

uniform mat4 projectionMatrixMulModelViewMatrix;
uniform mat4 normalMatrix;

layout (location = 0) in vec3 inPosition;
layout (location = 1) in vec2 inCoord;
layout (location = 2) in vec3 inNormal;

out vec2 texCoord;

smooth out vec3 vNormal;

void main()
{
    gl_Position = projectionMatrixMulModelViewMatrix*vec4(inPosition, 1.0);
    texCoord = inCoord;
    vec4 vRes = normalMatrix*vec4(inNormal, 0.0);
    vNormal = vRes.xyz;
}

Результатом является пустой экран. Отладчик Renderdo c говорит мне, что матрица gl_position полностью NaN. Renderdo c screeenshot

Когда я отправляю glm :: mat4 (1), я получаю действительный результат.

Почему после умножения шейдер получает вектор NaN?

1 Ответ

0 голосов
/ 20 марта 2020

Похоже, VS2017 обманул меня. Я не инициализировал матрицу глубоко внутри кода:

glm::mat4 mModelView = cCamera.look();
glm::mat4 CFlyingCamera::look()
{   
    glm::mat4 result = glm::mat4(1.0f);
    result = glm::lookAt(vEye, vView, vUp);
    return result;
}

и вот моя ошибка

void CFlyingCamera::update()
{
    // Change camera view direction
    rotateWithMouse();

    // Get view direction
    glm::vec3 vMove = vView-vEye;
    vMove = glm::normalize(vMove);
    vMove *= fSpeed;

    // Get normal to view direction vector 
    glm::vec3 vStrafe = glm::cross(vView-vEye, vUp);
    vStrafe = glm::normalize(vStrafe);
    vStrafe *= fSpeed;

    int iMove = 0;
////
////
///// ERROR HERE, vMoveBy isn't initialized
    glm::vec3 vMoveBy;
///// 
////
////    
// Get vector of move
    if(Keys::key(iForw))vMoveBy += vMove*appMain.sof(1.0f);
    if(Keys::key(iBack))vMoveBy -= vMove*appMain.sof(1.0f);
    if(Keys::key(iLeft))vMoveBy -= vStrafe*appMain.sof(1.0f);
    if(Keys::key(iRight))vMoveBy += vStrafe*appMain.sof(1.0f);
    vEye += vMoveBy; vView += vMoveBy;
}

Но отладчик все равно дал мне действительную матрицу. Вы знаете, почему это произошло?

...