GLSL-карта gl_FragCoord.xy с координатами в ортографической проекции - PullRequest
0 голосов
/ 17 ноября 2018

Здравствуйте, у меня есть программа opengl, которая визуализирует 2-мерные полигоны в ортографической проекции. В начале программы или при изменении размера окна вызывается функция reshape. Вот код для функции изменения формы:

    /* Call back when the windows is re-sized */
    void reshape(GLsizei width, GLsizei height) {
    // Compute aspect ratio of the new window
    if (height == 0) height = 1;                
    // To prevent divide by 0
    GLfloat aspect = (GLfloat)width / 
    (GLfloat)height;

    // Set the viewport to cover the new window
    glViewport(0, 0, width, height);

    // Set the aspect ratio of the clipping area to match the viewport
    glMatrixMode(GL_PROJECTION);  // To operate on the Projection matrix
    glLoadIdentity();             // Reset the projection matrix
    if (width >= height) {
    clipAreaXLeft = -1.0 * aspect;
    clipAreaXRight = 1.0 * aspect;
    clipAreaYBottom = -1.0;
    clipAreaYTop = 1.0;
    }
    else {
    clipAreaXLeft = -1.0;
    clipAreaXRight = 1.0;
    clipAreaYBottom = -1.0 / aspect;
    clipAreaYTop = 1.0 / aspect;
    }
    clipAreaXLeft *= 600;
    clipAreaYBottom *= 600;
    clipAreaXRight *= 600;
    clipAreaYTop *= 600;

   gluOrtho2D(clipAreaXLeft, clipAreaXRight, 
clipAreaYBottom, clipAreaYTop);
    glScissor(0, 0, width, height);
    glEnable(GL_SCISSOR_TEST);

    }

Вот код для фрагментного шейдера GLSL:

#version 420 core
out vec4 color
void main(){
vec2 orthoXY =... need help here, should 
convert window-space to ortho-space, 
maybe use projection matrix from fixed 
pipeline?
color=vec4{1,1,1,1}
}

1 Ответ

0 голосов
/ 17 ноября 2018

Если вы хотите преобразовать gl_FragCoord, чтобы нормализовать пространство устройства, я рекомендую создать форму, которая содержит размер области просмотра:

uniform vec2 u_resolution; // with and height of the viewport

gl_FragCoord.xy содержит координаты «окна» фрагмента, gl_FragCoord.z содержит глубину в диапазоне глубины, которая равна [0, 1], если вы не изменили ее на glDepthRange.

Нормализованное пространство устройства - это куб с левой, нижней, передней координатами (-1, -1, -1) и правой, верхней, задней координатой (1, 1, 1):

Итак, преобразование:

vec3 ndc = -1.0 + 2.0 * gl_FragCoord.xyz/vec3(u_resolution.xy, 1.0);

Или следующее, если вы хотите преобразовать только компоненты x и y:

vec2 ndc_xy = -1.0 + 2.0 * gl_FragCoord.xy/u_resolution.xy;
...