c++ - OpenGL 正交投影

标签 c++ opengl

我试图在 OpenGL 中设置正交投影,但似乎无法找到此三角形未正确呈现(不可见)的原因。我使用了具有相同代码的透视投影(当然,除了我的顶点坐标和投影矩阵)并且它工作正常。我将三角形顶点构造为:

Vertex vertices[] = { Vertex(glm::vec3(0, 600, 0.0),        glm::vec2(0.0, 0.0)),
                      Vertex(glm::vec3(300, 0, 0.0),        glm::vec2(0.5, 1.0)),
                      Vertex(glm::vec3(800 , 600, 0.0),     glm::vec2(1.0, 0.0)) };

我的相机构造函数是:

Camera::Camera(const glm::vec3& pos, int width, int height) {

    ortho = glm::ortho(0, width, height, 0, 0, 1000);
    this->position = pos;
    this->up = glm::vec3(0.0f, 1.0f, 0.0f);
    this->forward = glm::vec3(0.0f, 0.0f, 1.0f);

}

我称之为:

camera = Camera(glm::vec3(0, 0, 2), window->getSize().x, window->getSize().y);

其中窗口为 800 x 600 像素。我正在通过函数将转换上传到着色器:

 void Shader::update(const Transform& transform, const Camera& camera) {

     glm::mat4 model = camera.getProjection() * transform.getModel();

     glUniformMatrix4fv(uniforms[TRANSFORM_U], 1, GL_FALSE, &model[0][0]);

 }

其中 camera.getProjection() 是:

glm::mat4 Camera::getProjection() const {

    return ortho * glm::lookAt(position, glm::vec3(0, 0, 0), up);

}

transform.getModel() 是:

glm::mat4 Transform::getModel() const {

    glm::mat4 posMat = glm::translate(pos);

    glm::quat rotQuat = glm::quat(glm::radians(rot));
    glm::mat4 rotMat = glm::toMat4(rotQuat);

    glm::mat4 scaleMat = glm::scale(scl);

    return posMat * rotMat * scaleMat;

}

尽管我怀疑问题出在我的正交投影设置上,而不是我的变换,因为这对于透视投影来说效果很好。谁能看出为什么用这些坐标渲染的三角形不可见?在渲染网格之前,我正在绑定(bind)我的着色器并将投影矩阵上传到它。如果有帮助,我的顶点着色器是:

#version 120

attribute vec3 position;
attribute vec2 texCoord;

varying vec2 texCoord0;

uniform mat4 transform;

void main()
{
    gl_Position = transform * vec4(position, 1.0);
    texCoord0 = texCoord;
}

最佳答案

对于任何对此问题感兴趣的人,它与:

ortho = glm::ortho(0, width, height, 0, 0, 1000);

参数以整数形式提供,而不是 float 。因此,glm::ortho 中应用的整数除法创建了一个不正确的正交投影矩阵。

关于c++ - OpenGL 正交投影,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25166520/

相关文章:

java - OpenGL 1.1 和当前 4.3 之间的主要区别是什么?

c++ - 创建一个可选的元组

opengl - 如何在 OpenGL/Glut 中更改鼠标光标的位置?

c++ - 精度问题 - 远离原点的观点 - OpenGL C++

c++ - 重载 char* 和 std::string 是否安全?

c++ - 添加额外的渲染调用时 GLFW 在关闭时挂起

opengl - 有没有人在 3D 程序生成地形或分形地形生成方面有很好的资源?

c++ - 获取网络上事件 IP 的列表 (Linux)

c++ - How to compare "4A4B4C"(string shows hex value) 实际字符串是 "JKL"

c++ - 定义嵌套模板的合法语法是什么?