【问题标题】:GLSL convert valid glm::mat4 matrix to nan matrixGLSL 将有效 glm::mat4 矩阵转换为 nan 矩阵
【发布时间】:2020-06-29 21:59:02
【问题描述】:

我按照教程http://www.mbsoftworks.sk/tutorials/opengl3/ 并尝试编译第 10 个示例。

除了我发送到着色器的地方(投影矩阵 mul 模型视图矩阵)之外,一切正常。

有我发送矩阵的地方:

//...
// 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 包含 ] .

着色器代码

#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;
}

结果是空白屏幕。 Renderdoc 调试器告诉我 gl_position 矩阵完全是 NaN。 Renderdoc screeenshot

当我发送 glm::mat4(1) 时,我得到了有效的结果。

为什么乘法着色器得到 NaN 向量?

【问题讨论】:

  • 你必须初始化mModelView = glm::mat4(1.0f)
  • 其实mModelView之前已经初始化了。这不是原因。 glm::mat4 mModelView = cCamera.look();`glm::mat4 CFlyingCamera::look() { return glm::lookAt(vEye, vView, vUp); }
  • 正如我之前提到的 mMatrix 是 VALID 你可以看到它here
  • @Rabbid76:似乎不是重复的,因为 glm 矩阵没问题。问题可能是上传到着色器。
  • @DiliDup:你在setUniform之前打电话给glUseProgram吗? iLoc 的值是多少?为什么对setUniform的调用不包含第三个参数

标签: c++ opengl glsl glm-math opengl-3


【解决方案1】:

似乎 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;
}

但调试器还是给了我有效的矩阵。你知道为什么会这样吗?

【讨论】:

    猜你喜欢
    • 2016-05-23
    • 2012-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-14
    • 2017-02-21
    • 1970-01-01
    相关资源
    最近更新 更多