Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

OpenGL Orthographic Projections

Tags:

c++

opengl

I'm attempting to set up an orthographic projection in OpenGL, but can't seem to find why this triangle is not rendering correctly (it isn't visible). I have used perspective projection with the same code (apart from my vertex coordinates and projection matrix, of course) and it works fine. I construct the triangle vertices as:

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

My camera constructor is:

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

}

I call this as:

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

Where the window is 800 by 600 pixels. I am uploading a transform to the shader via the function:

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

 }

In which camera.getProjection() is:

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

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

}

And transform.getModel() is:

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;

}

Though I suspect the problem lies in my set up of orthographic projection rather than my transforms, as this worked fine for perspective projection. Can anyone see why the triangle rendered with these coordinates is not visible? I am binding my shader and uploading the projection matrix to it before rendering the mesh. If it helps, my vertex shader is:

#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;
}
like image 714
FinalFanatic Avatar asked Aug 06 '14 17:08

FinalFanatic


People also ask

What is GLM :: ortho?

glm::orthoSpecifies a logical 2D coordinate system which is to be mapped into the window positions indicated. Often one matches the coordinates to match the size of the window being rendered to. In the template glm::ortho is used for 2D rendering of text.

What is the OpenGL function use to define orthographic projection for 3D objects?

Some uses of orthographic projections are making 2D games, or for creating isometric games. To setup this type of projection we use the OpenGL provided glOrtho() function.

What are the 3 common view of orthographic projection?

An orthographic projection is a way of representing a 3D object by using several 2D views of the object. Orthographic drawings are also known as multiviews. The most commonly used views are top, front, and right side.


1 Answers

For anyone interested in the issue, it was with:

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

Where the arguments are supplied as integers, not floats. Therefore the integer division applied within glm::ortho was creating an incorrect orthographic projection matrix.

like image 57
FinalFanatic Avatar answered Oct 04 '22 19:10

FinalFanatic