← Назад к вопросам

Что такое текстура?

2.2 Middle🔥 211 комментариев
#Тестирование

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Текстура в компьютерной графике

Текстура — это 2D изображение (обычно квадратное), которое накладывается на 3D модель для придания ей реалистичного вида. Вместо того чтобы вручную раскрашивать каждый пиксель модели, используется изображение, которое "оборачивается" вокруг геометрии.

Базовая концепция

Текстура — это просто файл изображения (PNG, JPG, TGA), который GPU применяет к 3D поверхности. Каждый пиксель модели получает цвет из соответствующей координаты текстуры.

Текстурные координаты (UV Mapping)

# В 3D графике (например, Blender API или Three.js)
# Каждая вершина 3D модели имеет координаты UV
# U и V — это координаты на текстуре (0.0 до 1.0)

import numpy as np

# Пример куба с текстурой
vertices = np.array([
    [-1, -1, -1],  # вершина 0
    [ 1, -1, -1],  # вершина 1
    [ 1,  1, -1],  # вершина 2
    [-1,  1, -1],  # вершина 3
])

# UV координаты для каждой вершины
uv_coordinates = np.array([
    [0.0, 0.0],  # левый нижний угол текстуры
    [1.0, 0.0],  # правый нижний угол текстуры
    [1.0, 1.0],  # правый верхний угол текстуры
    [0.0, 1.0],  # левый верхний угол текстуры
])

Практический пример: работа с текстурами в Python (Pygame)

import pygame
from pygame.locals import *
from OpenGL.GL import *
from OpenGL.GLU import *

def load_texture(path):
    """Загружает изображение как текстуру"""
    image = pygame.image.load(path)
    image_data = pygame.image.tostring(image, "RGBA", True)
    
    texture_id = glGenTextures(1)
    glBindTexture(GL_TEXTURE_2D, texture_id)
    
    # Установить параметры текстуры
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)
    
    # Загрузить данные текстуры в GPU
    glTexImage2D(
        GL_TEXTURE_2D,
        0,
        GL_RGBA,
        image.get_width(),
        image.get_height(),
        0,
        GL_RGBA,
        GL_UNSIGNED_BYTE,
        image_data
    )
    
    return texture_id

# Использование
texture = load_texture('wall.png')

# Когда рисуем куб:
glBindTexture(GL_TEXTURE_2D, texture)
# Куб будет окрашен текстурой wall.png

Типы текстур

1. Diffuse Map (Диффузная текстура):

# Самая базовая текстура — просто цвет поверхности
# wood_diffuse.png — коричневая текстура дерева

2. Normal Map (Карта нормалей):

# Определяет, как свет отражается с поверхности
# wood_normal.png — синяя/фиолетовая текстура с деталями рельефа
# Создаёт иллюзию неровности без добавления геометрии

3. Specular Map (Карта блеска):

# Определяет, какие части блестящие, а какие матовые
# wood_specular.png — чёрно-белая карта
# Белые области — блестящие, чёрные — матовые

4. Ambient Occlusion (AO):

# Затемняет углы и швы для глубины
# wood_ao.png — показывает, где тень в уголках

Параметры фильтрации

# Как текстура выглядит при увеличении/уменьшении

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)
# GL_NEAREST — пиксельный вид (резкий, ретро)
# GL_LINEAR — гладкий вид (размытый, реалистичный)

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)
# Аналогично для увеличения

# Обёртывание координат
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT)
# GL_REPEAT — повторить текстуру
# GL_CLAMP — растянуть последний пиксель
# GL_MIRROR — отразить текстуру

Оптимизация текстур

# Mipmap — уменьшенные версии текстуры для дальних объектов
glGenerateMipmap(GL_TEXTURE_2D)

# Это ускоряет отрисовку и уменьшает артефакты
# 1024x1024 текстура → 512x512 → 256x256 → 128x128 → ...

# Использование:
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR)

Текстурирование в шейдерах

// GLSL фрагмент шейдер
precision mediump float;

uniform sampler2D uTexture;  // Текстура
varying vec2 vUV;  // UV координаты из вершинного шейдера

void main() {
    // Получить цвет из текстуры по UV координатам
    gl_FragColor = texture2D(uTexture, vUV);
}

Практическое применение в Python (Three.js with Babylon.js через WebGL)

# Python код для подготовки текстур для веб-приложения
import PIL
from PIL import Image

def prepare_texture(input_path, output_path, size=(1024, 1024)):
    """Подготавливает текстуру для веб-приложения"""
    img = Image.open(input_path)
    
    # Изменить размер в степень двойки (требование GPU)
    img = img.resize(size, Image.LANCZOS)
    
    # Конвертировать в RGB если нужно
    if img.mode != 'RGB':
        img = img.convert('RGB')
    
    # Сохранить как PNG (сжатие без потерь)
    img.save(output_path, 'PNG')

# Использование
prepare_texture('raw_wood.jpg', 'wood_optimized.png')

Текстуры в реальных примерах

  • Деревянная доска: diffuse (коричневая), normal (рельеф колец), specular (участки блеска)
  • Кирпичная стена: diffuse (красная/коричневая), normal (выпуклость кирпичей), ao (тени в швах)
  • Металл: diffuse (тёмный), specular (очень блестящий), normal (потёртости)

Заключение

Текстура — это фундаментальный элемент 3D графики. Без текстур модели выглядели бы как однотонные пластмассовые игрушки. Правильно наложенные текстуры создают реалистичность и качество визуализации. В Python работа с текстурами обычно проходит через библиотеки OpenGL, Pygame, Three.js (через Pyodide) или специализованные 3D движки.