```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
```
Сфера не рисуется полностью, рисуется только верхняя часть. Исправь это.
Вот все функции рендера:
renderDrawLine(float pos1X, float pos1Y, float pos2X, float pos2Y, float width, uint color)
renderDrawBox(float posX, float posY, float sizeX, float sizeY, uint color)
renderDrawBoxWithBorder(float posX, float posY, float sizeX, float sizeY, uint color, float bsize, uint bcolor)
float length = renderGetFontDrawTextLength(DxFont font, zstring text, [bool ignoreColorTags=false])
float height = renderGetFontDrawHeight(DxFont font)
uint index = renderGetFontCharIndexAt(DxFont font, string text, float x, [bool ignoreColorTags=false])
float width = renderGetFontCharWidth(DxFont font, string/uint char)
DxFont font = renderCreateFont(zstring font, int height, uint flags, [uint charset])
renderReleaseFont(DxFont font)
renderFontDrawText(DxFont font, zstring text, float posX, float posY, uint color, [bool ignoreColorTags=false])
renderDrawPolygon(float posX, float posY, float sizeX, float sizeY, int corners, float rotation, uint color)
DxTexture texture = renderLoadTextureFromFile(zstring file)
renderReleaseTexture(DxTexture texture)
renderDrawTexture(DxTexture texture, float posX, float posY, float sizeX, float sizeY, float rotation, uint color)
renderBegin(int type)
renderEnd()
renderColor(uint color)
renderVertex(float vX, float vY)
renderSetTexCoord(float posX, float posY)
renderBindTexture(DxTexture texture)
uint struct = renderGetTextureStruct(DxTexture texture)
uint sprite = renderGetTextureSprite(DxTexture texture)
uint sizeX, uint sizeY = renderGetTextureSize(DxTexture texture)
renderSetRenderState(int state, uint value)
DxTexture texture = renderLoadTextureFromFileInMemory(uint pointer, uint size)