C++ 如何使用glm为glsl设置正交视图?

C++ 如何使用glm为glsl设置正交视图?,c++,opengl,glsl,glm-math,orthographic,C++,Opengl,Glsl,Glm Math,Orthographic,我正在尝试使用glm设置正交视图矩阵,并将其传递给glsl。poster也有同样的问题,我希望能够渲染远离摄影机的像素,但当它们距离不到1.0时会被剪裁 MVP矩阵的设置如下: // Setup MVP Matrix glm::mat4 model = glm::mat4(1.0); model = glm::translate(model, glm::vec3(sprite->getPositionX(), sprite->getPositionY(), 0.0f)); mode

我正在尝试使用glm设置正交视图矩阵,并将其传递给glsl。poster也有同样的问题,我希望能够渲染远离摄影机的像素,但当它们距离不到1.0时会被剪裁

MVP矩阵的设置如下:

// Setup MVP Matrix
glm::mat4 model = glm::mat4(1.0);

model = glm::translate(model, glm::vec3(sprite->getPositionX(), sprite->getPositionY(), 0.0f));
model = glm::rotate(model, rotation, glm::vec3(0.0f, 0.0f, 1.0f));
model = glm::translate(model, glm::vec3(-sprite->getOffsetX(), -sprite->getOffsetY(), 0.0f));
//model = glm::scale(model, glm::vec3(1.0f, 1.0f, 1.0f)); // Unused for now

glm::mat4 view = glm::lookAt(glm::vec3(0,0,0), glm::vec3(0,0,-1), glm::vec3(0,1,0));
glm::mat4 projection = glm::ortho(0.0f, 800.0f, 600.0f, 0.0f, 1.0f, 1000.0f);

glm::mat4 mvp = projection * view * model;

// Set mpv matrix in shader
GLint mvpLoc = glGetUniformLocation(this->m_shader, "u_mvpMatrix");

glProgramUniformMatrix4fv(this->m_shader, mvpLoc, 1, GL_FALSE, &mvp[0][0]);

我可以看到在应用平移和旋转的情况下渲染四边形,但是当垂直方向在z轴上的任何位置都不是-1.0f时,它们就不会被绘制,因为我希望它能够绘制从-1.0到-1000.0个单位之间的任何东西,正如调用glm::ortho中指定的那样。有人知道如何做到这一点吗?

原因之一是:您以错误的顺序应用缩放、旋转和平移。GLM是主列,执行后乘法。正确的顺序应该是平移、旋转、缩放。现在,由于用于缩放操作的值有效地产生了no op,而translate也产生了no op,这并不重要,但无论如何,你应该知道做这些事情的正确顺序。在我开始旋转四边形后,我已经将它们更改为正确的顺序。我意识到了错误,但更改z轴仍然会给我带来问题,我已经更新了新的代码,它在围绕中心旋转四边形后也会再次转换。你说的不可操作是什么意思?不可操作的意思是,在所有方向上平移0.0个单位并按1.0的因子进行缩放实际上与乘以单位矩阵是一样的。因此,没有真正的操作发生(没有操作)。哦,我明白了,当我使用它们时,它就在那里准备好了,会一直保留到使用为止。我让它工作,但我不确定是什么修复了它,我能想到的唯一不同之处是使用浮点而不是整数作为向量等的参数。虽然更改渲染四边形的z位置在绘制时不会向前或向后发送,但这是预期的吗?