```lua
local EPSILON = 0.00001

function vector3D(x, y, z)
    return {
        x = x,
        y = y,
        z = z
    }
end

-- Функция для преобразования 3D координат в экранные
function projectToScreen(v)
    return convert3DCoordsToScreenEx(v.x, v.y, v.z)
end

-- Функция для генерации вершин сферы
function generateSphereVertices(center, radius, latSegments, lonSegments)
    local vertices = {}
    for i = 0, latSegments do
        local theta = i * math.pi / latSegments
        local sinTheta = math.sin(theta)
        local cosTheta = math.cos(theta)
        for j = 0, lonSegments do
            local phi = j * 2 * math.pi / lonSegments
            local sinPhi = math.sin(phi)
            local cosPhi = math.cos(phi)
            local x = center.x + radius * sinTheta * cosPhi
            local y = center.y + radius * sinTheta * sinPhi
            local z = center.z + radius * cosTheta
            table.insert(vertices, vector3D(x, y, z))
        end
    end
    return vertices
end

-- Функция для рисования закрашенной сферы
function drawFilledSphere(center, radius, latSegments, lonSegments, color)
    local vertices = generateSphereVertices(center, radius, latSegments, lonSegments)

    -- Начинаем отрисовку треугольников
    renderBegin(4)
    renderColor(color)

    for i = 0, latSegments - 1 do
        for j = 0, lonSegments - 1 do
            local first = i * (lonSegments + 1) + j + 1
            local second = first + lonSegments + 1

            local v1 = vertices[first]
            local v2 = vertices[first + 1]
            local v3 = vertices[second]
            local v4 = vertices[second + 1]

            -- Проецируем 3D координаты в экранные
            local r1, x1, y1 = projectToScreen(v1)
            local r2, x2, y2 = projectToScreen(v2)
            local r3, x3, y3 = projectToScreen(v3)
            local r4, x4, y4 = projectToScreen(v4)

            -- Проверяем, находятся ли все вершины на экране
            if r1 and r2 and r3 and r4 and
               isPointOnScreen(v1.x, v1.y, v1.z, EPSILON) and
               isPointOnScreen(v2.x, v2.y, v2.z, EPSILON) and
               isPointOnScreen(v3.x, v3.y, v3.z, EPSILON) and
               isPointOnScreen(v4.x, v4.y, v4.z, EPSILON) then

                -- Рисуем два треугольника для каждой квадрата на сфере
                -- Первый треугольник (v1, v2, v3)
                renderVertex(x1, y1)
                renderVertex(x2, y2)
                renderVertex(x3, y3)

                -- Второй треугольник (v2, v4, v3)
                renderVertex(x2, y2)
                renderVertex(x4, y4)
                renderVertex(x3, y3)
            end
        end
    end

    renderEnd()
end

function main()
    while not isSampAvailable() do
        wait(0)
    end

    local center = vector3D(0, 0, 0) -- Центр сферы
    local radius = 5 -- Радиус сферы
    local latSegments = 16 -- Количество сегментов по широте
    local lonSegments = 16 -- Количество сегментов по долготе
    local color = 0xFFFFFFFF -- Цвет сферы (белый)

    while true do
        wait(0)
        drawFilledSphere(center, radius, latSegments, lonSegments, color)
    end
end
```
Существует баг, когда я отвожу взгляд от сферы, она начинает рендерить грани лучше, когда смотрю ровно на нее, то рендерится только верхняя часть.