Подтвердить что ты не робот

Рисование сглаженного круга с использованием шейдеров

Я новичок в программировании шейдеров. Я пытаюсь нарисовать круг с glsl. Я использовал точку с размером и попытался отфильтровать точки за пределами радиуса (изменение альфа-значения). Код выглядит следующим образом:

Фрагментный шейдер:

#version 130
varying  vec2 textureCoordinate;
const float circleBorderWidth = 0.08;//for anti aliasing
void main() {
      float d = smoothstep(circleBorderWidth,0.1, 1.0-length(textureCoordinate));
      gl_FragColor = vec4(0.0, 1.0, 0.0, d);
}

Vertex Shader:

#version 130
attribute vec4 coord3d;
attribute vec2 varPos;
varying vec2 textureCoordinate;
void
main()
{
        textureCoordinate = varPos;
        gl_FrontColor = gl_Color;
        gl_Position = vec4(coord3d.xyz,1.);
        gl_PointSize = coord3d.w;
}

Данные

float pos[] = {
    -1, -1,
     -1, 1,
     1, 1,
     1, -1,
};

float vertices[]={0.0,0.0f,0.0f,100.0f};

Метод рисования:

void drawScene() {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    program->makeCurrent();
    glEnable(GL_POINT_SMOOTH);
    glEnable(GL_VERTEX_PROGRAM_POINT_SIZE);
    glEnable(GL_BLEND);
    glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

    if (varPosAttrib>=0) {
        glVertexAttribPointer( varPosAttrib, 2, GL_FLOAT, GL_FALSE,
                               0, pos ); // -->varPos in Vertex Shader.
        glEnableVertexAttribArray( varPosAttrib );
    }

    if (posAttrib>=0) {
        glVertexAttribPointer(posAttrib, 4, GL_FLOAT, GL_FALSE, 0, vertices); // -->coord3d in vertex shader
        glEnableVertexAttribArray(posAttrib);
        glDrawArrays(GL_POINTS, 0, 1);
    }
    glDisable(GL_POINT_SMOOTH);
    glDisable(GL_VERTEX_PROGRAM_POINT_SIZE);
    glDisable(GL_BLEND);
    program->release();
    glutSwapBuffers(); //Send the 3D scene to the screen
}

Это приводит к рисованию квадрата, если заменить d на 1.0 в следующей строке (в шейдере фрагмента):

gl_FragColor = vec4(0.0, 1.0, 0.0, d); // -> if d is replaced by 1.0

Я попытался заменить значения x и y в gl_FragColor на textureCoordinate.x и textureCoordinate.y. Результат был черным (поэтому я принимаю значения 0.0). Вещь, которую я не понимаю, заключается в том, что если я беру длину textureCoordinate, чем всегда 1.0. (Экспериментировал, заменив значение в gl_FragColor). Я не могу понять, что я делаю неправильно здесь. Я ожидал, что значение textureCoordinate будет интерполировать относительно переданных данных (varPos).

4b9b3361

Ответ 1

Вот моя текущая попытка. Он работает в том смысле, что он рисует диск с гладкой границей. Я использую подход дистанционного поля, т.е. Я вычисляю расстояние от границы диска

Фрагментный шейдер

#version 110

varying vec2 uv;

void
main() {
    float border = 0.01;
    float radius = 0.5;
    vec4 color0 = vec4(0.0, 0.0, 0.0, 1.0);
    vec4 color1 = vec4(1.0, 1.0, 1.0, 1.0);

    vec2 m = uv - vec2(0.5, 0.5);
    float dist = radius - sqrt(m.x * m.x + m.y * m.y);

    float t = 0.0;
    if (dist > border)
      t = 1.0;
    else if (dist > 0.0)
      t = dist / border;

    gl_FragColor = mix(color0, color1, t);
}

Vertex shader

#version 110

varying vec2 uv;

void
main() {
  gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
  uv = vec2(gl_MultiTexCoord0);
}

Это означало рисование на квадрате с координатой текстуры (-0,5, -0,5) x (0,5, 0,5)