Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenGL正交投影_C++_Opengl - Fatal编程技术网

C++ OpenGL正交投影

C++ OpenGL正交投影,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,

我试图在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);

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

}
transform.getModel()
是:

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

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

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

}
虽然我怀疑问题在于我的正交投影设置,而不是我的变换,因为这对透视投影效果很好。有人知道为什么用这些坐标渲染的三角形不可见吗?在渲染网格之前,我将绑定着色器并将投影矩阵上载到着色器。如果有帮助,我的顶点着色器是:

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

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

能否检查剔除设置?也许三角形只是被剔除了,因为你看它的背面。老实说,我不知道怎么做(
glDisable(BACK\u FACE\u CULLING)
或类似的?)但是,如果我将
glm::lookAt
的位置从
glm::vec3(0,0,2)
改为
glm::vec3(0,0,-2)
,我相信如果这张脸被剔除,这会解决问题,但事实并非如此。编辑:更改顶点顺序也不起作用。谢谢,我正好遇到了这个问题。现在你指出这一点似乎很明显,但我被困了很长一段时间。:)