opengl window and vbo vertexes

Started by
13 comments, last by Brother Bob 11 years, 3 months ago

hello,
I use this chunk of code for setup a windows for opengl 3.3:


HWND CreateAppWindow(const WNDCLASSEX &wcl, const char *pszTitle)
    {
        // Create a window that is centered on the desktop. It's exactly 1/4 the
        // size of the desktop. Don't allow it to be resized.

        DWORD wndExStyle = WS_EX_OVERLAPPEDWINDOW;
        DWORD wndStyle = WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU |
                         WS_MINIMIZEBOX | WS_CLIPCHILDREN | WS_CLIPSIBLINGS;

        HWND hWnd = CreateWindowEx
            (wndExStyle, wcl.lpszClassName, "title",
                    wndStyle, 0, 0, 0, 0, 0, 0, wcl.hInstance, 0);

        if (hWnd)
        {
            int screenWidth = GetSystemMetrics(SM_CXSCREEN);
            int screenHeight = GetSystemMetrics(SM_CYSCREEN);
            int halfScreenWidth = screenWidth / 2;
            int halfScreenHeight = screenHeight / 2;
            int left = (screenWidth - halfScreenWidth) / 2;
            int top = (screenHeight - halfScreenHeight) / 2;
            RECT rc = {0};

            SetRect(&rc, left, top, left + halfScreenWidth, top + halfScreenHeight);
            AdjustWindowRectEx(&rc, wndStyle, FALSE, wndExStyle);
            MoveWindow(hWnd, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, TRUE);

            GetClientRect(hWnd, &rc);
            m_windowWidth = rc.right - rc.left;
            m_windowHeight = rc.bottom - rc.top;
        }

        return hWnd;
    };

The problem is that i can't understand how the vbo vertexes are related to the window.
For example i use these points:
-1.0, -1.0, 0.5;
-1.0 , 1.0, 0.5;
1.0, 1.0, 0.5;

and i use this two shaders:
vshader:
i set the uniform mat4 MVP to identity


#version 330
in vec3 VertexPosition;
uniform mat4 MVP;
void main()
{
    gl_Position = MVP * vec4( VertexPosition, 1.0 );
    
}

and this fragment shader(the uniform vec4 color is set corrected by my project:


#version 330

out vec4 outputColor;
uniform vec4 color;
void main()
{   
    outputColor = color;
}


the problem is that the triangle is not correct, it must be the half of the screen but it isn't, is more smaller.

i try to use the left/bottom 0 to -1 and the right/top to -1 , but don't work.
How i can create a triangle that is half of the entire screen ? and how are related the vbo vertexes to the width and height of the screen?
my goal is be able to set the entire coordinate for example 800 if the width of the screen is 800 ecc....
is possible?
my viewport recreated always in the render loop is
glViewport(0.0, 0.0, 800, 600);






Advertisement

You can think of glViewport as defining the drawable area in the window. If your window is larger than 800x600, then your fixed viewport will not cover the whole window. On the other hand, if your window is actually smaller than 800x600, the drawable region extends outside the window.

The coordinates you then draw will be mapped to the viewport such that the post-transformed coordinates (-1, -1) corresponds to the bottom-left corner of the viewport, and (1, 1) corresponds to the upper-left corner of the viewport. Since you have the MVP matrix set to the identity matrix, the coordinates you pass and the post-transformed coordinates are the same.

Let's say you have a window that is 1600x1200 pixels, and you define the viewport as in your code. The viewport then covers the bottom left-half of the window. If you then draw a triangle with coordinates (-1,-1) [the bottom-left corner of the viewport], (-1, 1) [the top-right corner of the viewport] and (1, -1) [the bottom-left corner of the viewport], the triangle will cover the bottom-left half of the viewport. However, the viewport only covers the bottom-left quadrant of the window, ans to the triangle cover, on the screen, the bottom-left half of the bottom-left quadrant; that is, one eight of the total area of the window.

You probably want to set the viewport to cover the whole window. From there, you control the coordinate range using the MVP matrix. For example, if you set the MPV matrix to an orthographic matrix with the coordinate range [0, 800] along the X-axis and [0, 600] along the Y-axis, you will have a fullscreen viewport, and a visible coordinate range from (0,0) in one corner and (800, 600) in the diagonally opposite corner.

thanks,but these ortho matrix ( i use glm with : m_MP = glm::ortho<GLfloat>( 0, 800, 0, 600, 1.0, -1.0 );)

i try

ptrVerteBufferManager ptrMakeVBa(new CVertexBufferManager());

ptrMakeVBa->Position.m_pPosition->AddData(glm::vec3(0.0, 0.0, 0.5));
ptrMakeVBa->Position.m_pPosition->AddData(glm::vec3(0.0 , 600.0, 0.5));
ptrMakeVBa->Position.m_pPosition->AddData(glm::vec3(800.0, 600.0, 0.5));

ptrMakeVBa->Position.SetDynamics(GL_STATIC_DRAW);
ptrMakeVBa->Position.SetSemantics("VertexPosition");
ptrMakeVBa->Position.SetType(GL_FLOAT);

but what i must insert in a vbo for draw an half of the entire screen with a triangle?
thanks.

With that projection matrix, the visible coordinate range is from 0 to 800 along the X-axis, and from 0 to 600 along the Y-axis. The coordinates you have there are the correct ones.

I can not understand, this is the matrix that comes to Shader, the MVP generated from this ortho function of glm:.

m_MP = glm::ortho<GLfloat>(0.0, 800.0, 0.0, 600.01 );

{0.0024999999, 0, 0, 0}
{0, 0.0033332778, 0, 0}
{0, 0, -1, 0}
{-1, -1, 0, 1}

and i use a 800(width)* 600(height) coords, this is the vbo that comes to the gpu(i use gdebugger)

0, 0, 0.5,
0, 600, 0.5,
800, 600, 0.5,

if i use a -1 1 -1 1 all works fine .

where is my mistake?

Perhaps you forgot to upload the projection matrix to the MVP uniform.

no, i see with gdebugger that the mvp matrix is that that i post, in the gpu there is that matrix.
but i trying to multiply the 800 for the matrix and i see that the results go from 0 to 2 is correct?
They don't must go from -1 to 1?
thanks.

The matrix is correct; the vector (0, 0, z, 1) transforms to (-1, -1, -z, 1) and the vector (800, 600, z, 1) transforms to (1, 1, -z, 1). Thus, the coordinate range (0,0) to (800, 600) maps correctly to the range (-1,-1) to (1, 1).

may be that the error is in 0.5 the z component?

i set 0.5 because i work in 2d and not in 3d:

  1. 0, 0, 0.5,
  2. 0, 600, 0.5,
  3. 800, 600, 0.5,

but with the matrix that i post ....

Nothing wrong with the Z-component with regards to that matrix. But what is the problem now, really? I assume you have fixed what I have said above, so the error must be something else now. Show the current code so I know what you have fixed and how you have fixed it.

This topic is closed to new replies.

Advertisement