mardi 16 août 2016

line-width for ellipse is not constant

I am drawing hollow ellipse using opengl. I calculate vertices in c++ code using standard ellipse formula. In fragment shader i just assign color to each fragment. The ellipse that i see on the screen has thinner line width on the sharper curves as compared to that where curve is not that sharp. Please see the image below: not worried about jagged edges at this point but it would be great if someone can point out technique to do anti-aliasing

C++ code :

std::vector<float> BCCircleHelper::GetCircleLine(float centerX, float centerY, float radiusX, float radiusY, float lineWidth, int32_t segmentCount)
{
    auto vertexCount = (segmentCount + 1) * 2;
    auto floatCount = vertexCount * 3;

    std::vector<float> array(floatCount);
    const std::vector<float>& data = GetCircleData (segmentCount);
    float halfWidth = lineWidth * 0.5f;

    for (int32_t i = 0; i < segmentCount + 1; ++i)
    {
        float sin = data [i * 2];
        float cos = data [i * 2 + 1];

        array [i * 6 + 0] = centerX + sin * (radiusX - halfWidth);
        array [i * 6 + 1] = centerY + cos * (radiusY - halfWidth);

        array [i * 6 + 3] = centerX + sin * (radiusX + halfWidth);
        array [i * 6 + 4] = centerY + cos * (radiusY + halfWidth);

        array [i * 6 + 2] = 0;
        array [i * 6 + 5] = 0;
    }
    return std::move(array);
}

const std::vector<float>& BCCircleHelper::GetCircleData(int32_t segmentCount)
{
    int32_t floatCount = (segmentCount + 1) * 2;
    float segmentAngle = static_cast<float>(M_PI * 2) / segmentCount;

    std::vector<float> array(floatCount);

    for (int32_t i = 0; i < segmentCount + 1; ++i)
    {
        array[i * 2 + 0] = sin(segmentAngle * i);
        array[i * 2 + 1] = cos(segmentAngle * i);
    }

    return array;
}

Aucun commentaire:

Enregistrer un commentaire