On this link I found the formulas for glViewport.
<www.opengl.org/wiki/GLAPI/glViewport>
xw = (xnd + 1) (width / 2) + x;
yw = (ynd + 1) (height / 2) + y;
First test: Assume x=0 and width=800, then the window coordinates go from 0 to 799.
xnd = 1 should result in the rightmost pixel 799.
xw ( 1 ) = ( 1 + 1 ) * 800 / 2 + 0 = 800; And not 799.
I derivated the formula for normalized device to window coordinates and came to a slightly different result
to replace "width" by "(width - 1)":
xw = (xnd + 1) ((width - 1) / 2) + x;
yw = (ynd + 1) ((height - 1) / 2) + y;
Can someone confirm or disprove that?
Here my derivation for glViewport( x, y, width, height ):
So the rectangle is from (x) to (x + width - 1), and from (y) to (y + height - 1).
Example: glViewport( 400, 200, 800, 600 ) has a rectangle from x: 400 to 1199, and y: 200 to 799.
Formula for x:
xw - x = xnd * a + b; // Linear equation, resolve a and b.
1. xnd = -1, and xw = x:
x - x = -1 * a + b; -> a = b;
2. xnd = +1, and xw = x + width - 1:
x + width - 1 - x = 1 * a + b; -> width - 1 = 2 a; -> a = ( width - 1 ) / 2;
Insert in formula for x:
xw - x = xnd * (width - 1) / 2 + (width - 1) / 2;
xw = ( xnd + 1 ) * (( width - 1 ) / 2 ) + x;
Test:
1. xnd = -1: xw = ( -1 + 1 ) * (( width - 1 ) / 2 ) + x = x; -> ok, 400 by the example.
2. xnd = +1: xw = ( 1 + 1 ) * (( width - 1 ) / 2 ) + x = width - 1 + x; -> ok, 1199 by the example.
Analogical for y.