我在寫一個遊戲引擎,並且在z軸上翻譯時遇到了問題。 當我在z軸上翻譯多個單位時,對象消失。小於1的值對它保持在相同位置的對象沒有影響。 所有其他轉換似乎工作正常。OpenGL轉換不能像預期的那樣在z軸上工作
主循環的部分:
while (unprocessedTime > frameTime) {
rendering = true;
unprocessedTime -= frameTime;
if (window.isClosed()) {
stop();
}
Time::setDelta(frameTime);
game.update();
if (frameCounter >= Time::SECOND) {
std::cout << fps << std::endl;
fps = 0;
frameCounter = 0;
}
}
if (rendering) {
render();
fps++;
}
Render方法:
void MainController::render() {
window.clear();
game.render();
window.update();
}
遊戲更新和渲染方法:
void Game::update() {
tmp += Time::getDelta();
float sinTemp = sin(tmp);
transform.setPos(glm::vec3(0, 0, sinTemp));
}
void Game::render() {
shader.bind();
shader.setUniform("transform", transform.getTransformation());
mesh.draw();
}
着色setUniform方法:
void Shader::setUniform(std::string uniformName, glm::mat4 value) {
glUniformMatrix4fv(uniforms[uniformName], 1, GL_FALSE, &value[0][0]);
}
變換getTransformation方法:
inline glm::mat4 getTransformation() const {
glm::mat4 posMat = glm::translate(pos);
glm::mat4 rotXMat = glm::rotate(rot.x, glm::vec3(1, 0, 0));
glm::mat4 rotYMat = glm::rotate(rot.y, glm::vec3(0, 1, 0));
glm::mat4 rotZMat = glm::rotate(rot.z, glm::vec3(0, 0, 1));
glm::mat4 scaleMat = glm::scale(scale);
glm::mat4 rotMat = rotZMat * rotYMat * rotXMat;
return posMat * rotMat * scaleMat;
}
編輯頂點着色器:
#version 330
layout (location = 0) in vec3 position;
out vec4 color;
uniform mat4 transform;
void main() {
color = vec4(clamp(position, 0.0, 1.0), 1.0);
gl_Position = transform * vec4(position, 1.0);
}
你正在翻譯哪個方向?改變標誌,看看會發生什麼。一個目標指向相機(即,物體將在你身後),另一個遠離相機。 –
更糟糕的是,按照慣例,正z指向你,根據也在左下角出現的圖紙類比,而大多數人現在似乎認爲更大的z值應該意味着更遠,而不是在虛擬屏幕前面(即靠近你或在你後面)。 – Tommy
是的,我認爲這是由於DirectX和OpenGL具有相反的習慣。 –