Jump to content

  • Log In with Google      Sign In   
  • Create Account


opengl window and vbo vertexes


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
14 replies to this topic

#1 giugio   Members   -  Reputation: 209

Like
0Likes
Like

Posted 11 January 2013 - 12:58 PM

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






 

 



Sponsor:

#2 Brother Bob   Moderators   -  Reputation: 7795

Like
0Likes
Like

Posted 11 January 2013 - 01:33 PM

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.



#3 giugio   Members   -  Reputation: 209

Like
0Likes
Like

Posted 11 January 2013 - 02:13 PM

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.



#4 Brother Bob   Moderators   -  Reputation: 7795

Like
0Likes
Like

Posted 11 January 2013 - 02:46 PM

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.



#5 giugio   Members   -  Reputation: 209

Like
0Likes
Like

Posted 12 January 2013 - 04:50 AM

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?



#6 Brother Bob   Moderators   -  Reputation: 7795

Like
0Likes
Like

Posted 12 January 2013 - 05:10 AM

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



#7 giugio   Members   -  Reputation: 209

Like
0Likes
Like

Posted 12 January 2013 - 05:19 AM

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.



#8 Brother Bob   Moderators   -  Reputation: 7795

Like
0Likes
Like

Posted 12 January 2013 - 05:33 AM

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



#9 giugio   Members   -  Reputation: 209

Like
0Likes
Like

Posted 12 January 2013 - 05:54 AM

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:

</p><ol><li>0, 0, 0.5,</li>
	<li>0, 600, 0.5,</li>
	<li>800, 600, 0.5,</li>
</ol>

but with the matrix that i post ....



#10 Brother Bob   Moderators   -  Reputation: 7795

Like
0Likes
Like

Posted 12 January 2013 - 06:10 AM

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.



#11 giugio   Members   -  Reputation: 209

Like
0Likes
Like

Posted 12 January 2013 - 06:57 AM

I see a problem:

if i use a glViewport(0, 0, 1920, 1080); that is my full resolution screen all works fine, but if i use a 800 x 600 glViewport(0, 0, 800, 600); the triangle is an half of the correct rectangle that must occupy the half of the screen.
Then the error may be in the creation of the window?
this is my window's creation code:

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.
        int n = 0;
        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, 1920, 1080, 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;
    };



#12 giugio   Members   -  Reputation: 209

Like
0Likes
Like

Posted 12 January 2013 - 07:04 AM

also if i set this

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

to

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

 

if i set the viewport to 1920w 1080h all work fine.

what can be'



#13 Brother Bob   Moderators   -  Reputation: 7795

Like
0Likes
Like

Posted 12 January 2013 - 07:17 AM

As I said in my first post, your triangle is drawn in the viewport, not in the window. If you have a 1920x1080 window and set the viewport to the bottom-left 800x600 region, then the triangle will be drawn to that bottom-left 800x600 region of the whole 1920x1080 window. If you want the viewport to cover the whole window, then the viewport shall have the same size as the window.



#14 giugio   Members   -  Reputation: 209

Like
0Likes
Like

Posted 12 January 2013 - 08:57 AM

then the vbo points are related to the viewport, is correct?

If so

1)i can create a window of 400 x 400

2)set this vbo  :

 

-1, -1, 0,
-1, 1, 0,
1,1, 0,

 


3)set the ortho matrix with glm(m_MP = glm::ortho<GLfloat>(-1, 1, -1, 1); to

 

{1, 0, 0, 0}
{0, 1, 0, 0}
{0, 0, -1, 0}
{-0, -0, 0, 1}

 

 

4)all works fine.

 

but if:

1)ok,

2)set this vbo

 

0, 0, 0,
0,400,0
400,400,0

 

3)the ortho matrix sended to the shader as a mvp(now i change the name) is :

 

{0.0049999999, 0, 0, 0}
{0, 0.0049999999, 0, 0}
{0, 0, -1, 0}
{-1, -1, 0, 1}

but,i see nothing

this is all that i change , from the first to the second i change only the ortho projection and the vbo points from -1 1 to 0 400 ecc....

thanks again for your help, and sorry if i 'm a newbe

and the mview matrix is to use? i suppose that is identity .

by.



#15 Brother Bob   Moderators   -  Reputation: 7795

Like
0Likes
Like

Posted 12 January 2013 - 09:32 AM

Start with the case that works and slowly change the numbers towards the case that doesn't work. You will hopefully see where the triangle goes and why it doesn't show up.






Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS