Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
8 / 6 / 4
Регистрация: 21.05.2022
Сообщений: 141

SDL3_image - не отрисовывается текстура

23.02.2025, 17:23. Показов 28746. Ответов 166
Метки sdl (Все метки)

Студворк — интернет-сервис помощи студентам
Не отрисовывается текстура! Путь, формат img, установки и подключения dll - проверил трижды. При наложении текстуры, просто белое поле.
Участок кода (ошибок нет):
C++
1
2
3
4
5
6
7
8
SDL_Texture* player = IMG_LoadTexture(renderer, "2.png");
if (!player) {
    SDL_Log("IMG_LoadTexture: %s\n", SDL_GetError());
}
SDL_RenderTexture(renderer, player, NULL, &rect);
SDL_DestroyTexture(player);
 
SDL_RenderPresent(renderer);
Полный код. Может кто то взглянет опытным глазом где я накосячил?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#define SDL_MAIN_USE_CALLBACKS 1
#include <SDL3/SDL.h>
#include <SDL3/SDL_main.h>
#include<SDL3_image/SDL_image.h>
#include<iostream>
 
static SDL_Window* window = NULL;
static SDL_Renderer* renderer = NULL;
SDL_FRect rect = { 0, 0, 100, 100 }; // создаем квадрат
int speed = 10;
 
SDL_AppResult SDL_AppInit(void** appstate, int argc, char* argv[])
{
    SDL_Init(SDL_INIT_VIDEO);
    SDL_CreateWindowAndRenderer("SDL3 Game", 800, 640, 0, &window, &renderer);
    return(SDL_APP_CONTINUE);
}
 
 
SDL_AppResult SDL_AppIterate(void* appstate)
{
    SDL_SetRenderDrawColor(renderer, 30, 30, 30, 255);
    SDL_RenderClear(renderer);
 
    // Получаем массив нажатых клавиш
    const bool* keys = SDL_GetKeyboardState(NULL);
    if (keys[SDL_SCANCODE_W]) {
        rect.y -= speed;
    }
    if (keys[SDL_SCANCODE_S]) {
        rect.y += speed;
    }
    if (keys[SDL_SCANCODE_A]) {
        rect.x -= speed;
    }
    if (keys[SDL_SCANCODE_D]) {
        rect.x += speed;
    }
 
    // Отрисовка квадрата и движение вправо
    SDL_SetRenderDrawColor(renderer, 30, 200, 30, 255);
    SDL_RenderFillRect(renderer, &rect);
 
    SDL_Texture* player = IMG_LoadTexture(renderer, "2.png");
    if (!player) {
        SDL_Log("IMG_LoadTexture: %s\n", SDL_GetError());
    }
    SDL_RenderTexture(renderer, player, NULL, &rect);
    SDL_DestroyTexture(player);
 
    SDL_RenderPresent(renderer);
    SDL_Delay(16);
    return SDL_APP_CONTINUE;
}
 
SDL_AppResult SDL_AppEvent(void* appstate, SDL_Event* event)
{
    switch (event->type)
    {
    case SDL_EVENT_QUIT:
        return SDL_APP_SUCCESS;
        break;
 
    default:
        break;
    }
    return SDL_APP_CONTINUE;
}
 
void SDL_AppQuit(void* appstate, SDL_AppResult result)
{
    /* SDL will clean up the window/renderer for us. */
}
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
23.02.2025, 17:23
Ответы с готовыми решениями:

Использование opengl. Не отрисовывается квадрат
Начал изучать opengl и столкнулся с трудностью уже на 1 примере, согласно которому должен просто отрисовываться белый квадрат, а у меня как...

Удаление текстур OpenGL
Ребята подскажите как удалить текстуру? Через метод glDeleteTextures, если да то какие параметры она принимает? И есть ли другой способ...

SDL : Неадекватная загрузка текстур
Есть следующее приложение: Programm.h #include &lt;windows.h&gt; #include &lt;SDL.h&gt; #include &lt;iostream&gt; #include &lt;string&gt; #pragma...

166
9933 / 2936 / 494
Регистрация: 05.10.2013
Сообщений: 7,965
Записей в блоге: 229
11.04.2025, 18:13
Студворк — интернет-сервис помощи студентам
cosmos44, я зашёл к вам в профиль и увидел, что вы смотрите тему SDL: функция для определения размеров окна, которая находится в разделе OpenGL. Тема старая (2012 года) - там используется SDL2, а в SDL3 по-другому. По умолчанию в SDL3 размеры окна нельзя изменить мышкой или растянуть на весь экран. Есть два способа, как изменить это поведение:
  1. При создании окна и рисовальщика добавить флаг SDL_WINDOW_RESIZABLE: https://wiki.libsdl.org/SDL3/SDL_WindowFlags
    C++
    1
    
    SDL_CreateWindowAndRenderer("SDL3, C++", 500, 500, SDL_WINDOW_RESIZABLE, &window, &renderer)
  2. Либо вызвать функцию SDL_SetWindowResizable: https://wiki.libsdl.org/SDL3/S... wResizable
    C++
    1
    
    SDL_SetWindowResizable(window, SDL_WINDOW_RESIZABLE);
Для определения размера окна можно вызвать функцию SDL_GetWindowSurface: https://wiki.libsdl.org/SDL3/SDL_GetWindowSurface
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// This function runs when a new event (mouse input, keypresses, etc) occurs
SDL_AppResult SDL_AppEvent(void* appstate, SDL_Event* event)
{
    switch (event->type)
    {
        case SDL_EVENT_QUIT:
        {
            return SDL_APP_SUCCESS;
            break;
        }
        case SDL_EVENT_WINDOW_RESIZED:
        {
            int w = SDL_GetWindowSurface(window)->w;
            int h = SDL_GetWindowSurface(window)->h;
            SDL_Log("w = %d, h = %d", w, h);
            break;
        }
    default:
        break;
    }
    return SDL_APP_CONTINUE; // Carry on with the program
}
main.cpp

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#define SDL_MAIN_USE_CALLBACKS 1 // Use the callbacks instead of main()
 
#include <SDL3/SDL.h>
#include <SDL3/SDL_main.h>
 
// We will use this renderer to draw into this window every frame
static SDL_Window* window = NULL;
static SDL_Renderer* renderer = NULL;
 
// This function runs once at startup
SDL_AppResult SDL_AppInit(void** appstate, int argc, char* argv[])
{
    if (!SDL_Init(SDL_INIT_VIDEO))
    {
        SDL_Log("Couldn't initialize SDL: %s", SDL_GetError());
        return SDL_APP_FAILURE;
    }
 
    if (!SDL_CreateWindowAndRenderer("SDL3, C++", 500, 500,
        SDL_WINDOW_RESIZABLE, &window, &renderer))
    {
        SDL_Log("Couldn't create window/renderer: %s", SDL_GetError());
        return SDL_APP_FAILURE;
    }
 
    // SDL_SetWindowResizable(window, SDL_WINDOW_RESIZABLE);
 
    int w = SDL_GetWindowSurface(window)->w;
    int h = SDL_GetWindowSurface(window)->h;
    SDL_Log("w = %d, h = %d", w, h);
 
    return SDL_APP_CONTINUE; // Carry on with the program
}
 
// This function runs when a new event (mouse input, keypresses, etc) occurs
SDL_AppResult SDL_AppEvent(void* appstate, SDL_Event* event)
{
    switch (event->type)
    {
        case SDL_EVENT_QUIT:
        {
            return SDL_APP_SUCCESS;
            break;
        }
        case SDL_EVENT_WINDOW_RESIZED:
        {
            int w = SDL_GetWindowSurface(window)->w;
            int h = SDL_GetWindowSurface(window)->h;
            SDL_Log("w = %d, h = %d", w, h);
            break;
        }
    default:
        break;
    }
    return SDL_APP_CONTINUE; // Carry on with the program
}
 
// This function runs once per frame, and is the heart of the program
SDL_AppResult SDL_AppIterate(void* appstate)
{
    SDL_SetRenderDrawColor(renderer, 50, 50, 50, 255);
    SDL_RenderClear(renderer);
 
    // Draw your stuff here
 
    // Update the screen
    SDL_RenderPresent(renderer);
    return SDL_APP_CONTINUE;  /* carry on with the program! */
}
 
// This function runs once at shutdown
void SDL_AppQuit(void* appstate, SDL_AppResult result)
{
    // SDL will clean up the window/renderer for us
}
Вложения
Тип файла: zip get-window-size-sdl3-cpp.zip (3.0 Кб, 0 просмотров)
0
8 / 6 / 4
Регистрация: 21.05.2022
Сообщений: 141
12.04.2025, 18:48  [ТС]
Цитата Сообщение от 8Observer8 Посмотреть сообщение
При создании окна и рисовальщика добавить флаг SDL_WINDOW_RESIZABLE:
Данный вопрос я решил для себя.
Сейчас стоит следующий вопрос который я не могу решить. Не соображу как реализовать наложение текстуры.
Есть ТРАПЕЦИЯ (дорога). Как наложить (текстуру) к примеру левый отбойник, что бы это все правильно двигалось.
так как трапеция состоит из двух треугольников.

1) Пример трапеции (дорога) - main.cpp (Движение Вправо-Влево -> клавиши A, D). Собственно игрок стоит всегда в центре, а двигается дорога, что приводит к изменению углов трапеции. Одним словом все видно и понятно в main.cpp
2) ooo.png (пример как должно быть в результате)
3) otb.png (отбойник)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#define SDL_MAIN_USE_CALLBACKS 1 // Use the callbacks instead of main()
#include <SDL3/SDL.h>
#include <SDL3/SDL_main.h>
#include <SDL3_image/SDL_image.h>
#include <iostream>
#include <vector>
 
SDL_Window* window = NULL;
SDL_Renderer* renderer = NULL;
SDL_Texture* texture = NULL;
 
struct Point { float x, y; };
 
float VertexBottomLeft = 50.0f;
float VertexBottomRight = 1150.0f;
float speedPlayer = 3.0f;
 
// Рисует трапецию попиксельно
void DrawTrapezoidPixelByPixel(SDL_Renderer* renderer, const Point& topLeft, const Point& topRight, const Point& bottomLeft, const Point& bottomRight, SDL_Color color) {
    // Определяем диапазон Y (от верхней до нижней границы)
    int yStart = static_cast<int>(topLeft.y);
    int yEnd = static_cast<int>(bottomLeft.y);
 
    for (int y = yStart; y <= yEnd; ++y) {
        // Линейная интерполяция для левой и правой границ
        float t = static_cast<float>(y - yStart) / (yEnd - yStart);
        float x1 = topLeft.x + (bottomLeft.x - topLeft.x) * t;  // Левая граница
        float x2 = topRight.x + (bottomRight.x - topRight.x) * t; // Правая граница
 
        // Отрисовываем горизонтальную линию от x1 до x2
        SDL_SetRenderDrawColor(renderer, color.r, color.g, color.b, color.a);
        SDL_RenderLine(renderer, x1, y, x2, y);
    }
}
 
 
 
 
SDL_AppResult SDL_AppInit(void** appState, int argc, char* argv[])
{
    SDL_Init(SDL_INIT_VIDEO);
    SDL_CreateWindowAndRenderer("Blue Warrior, SDL3, C++", 1200, 600, 0, &window, &renderer);
    
    //SDL_Surface* imageSurface = IMG_Load("assets/vertex.png");  // Укажите путь к изображению
    //texture = SDL_CreateTextureFromSurface(renderer, imageSurface);
    //SDL_DestroySurface(imageSurface);  // Освобождаем поверхность
 
    return SDL_APP_CONTINUE;
}
 
SDL_AppResult SDL_AppIterate(void* appState)
{
    SDL_SetRenderDrawColor(renderer, 0, 211, 211, 211);
    SDL_RenderClear(renderer);
 
    // Вершины трапеции (верхнее основание уже нижнего)
    Point topLeft = { 400.0f, 0.0f };
    Point topRight = { 800.0f, 0.0f };
    Point bottomLeft = { VertexBottomLeft, 600.0f };
    Point bottomRight = { VertexBottomRight, 600.0f };
    // Цвет заливки (синий)
    SDL_Color blue = { 92, 92, 92, 255 };
    // Рисуем трапецию попиксельно - дорога.
    DrawTrapezoidPixelByPixel(renderer, topLeft, topRight, bottomLeft, bottomRight, blue);
 
    // Вершины трапеции (верхнее основание уже нижнего)
    Point topLeftW = { 450.0f, 0.0f };
    Point topRightW = { 480.0f, 0.0f };
    Point bottomLeftW = { VertexBottomLeft + 50, 600.0f };
    Point bottomRightW = { VertexBottomRight - 1000, 600.0f };
    // Цвет заливки (белый)
    SDL_Color wihte = { 226, 226, 226, 255 };
    // Рисуем линию белая попиксельно
    DrawTrapezoidPixelByPixel(renderer, topLeftW, topRightW, bottomLeftW, bottomRightW, wihte);
 
    // Вершины трапеции (верхнее основание уже нижнего)
    Point topLeftT = { 750.0f, 0.0f };
    Point topRightT = { 720.0f, 0.0f };
    Point bottomLeftT = { VertexBottomLeft + 1050, 600.0f };
    Point bottomRightT = { VertexBottomRight - 90, 600.0f };
    
    // Рисуем линию белая попиксельно
    DrawTrapezoidPixelByPixel(renderer, topLeftT, topRightT, bottomLeftT, bottomRightT, wihte);
 
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////
    const bool* keys = SDL_GetKeyboardState(NULL);
    if (keys[SDL_SCANCODE_W]) {
    }
    if (keys[SDL_SCANCODE_S]) {       
    }
    if (keys[SDL_SCANCODE_A]) {
        VertexBottomLeft += speedPlayer;
        VertexBottomRight += speedPlayer;
    }
    if (keys[SDL_SCANCODE_D]) {
        VertexBottomLeft -= speedPlayer;
        VertexBottomRight -= speedPlayer;  
    }
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////
    
    SDL_RenderPresent(renderer);   
    //std::cout << "currentTime: " << currentTime << std::endl;
    SDL_Delay(16);
    return SDL_APP_CONTINUE;
}
 
SDL_AppResult SDL_AppEvent(void* appState, SDL_Event* event)
{
    if (event->type == SDL_EVENT_QUIT)
    {
        return SDL_APP_SUCCESS;
    }
 
    return SDL_APP_CONTINUE;
}
 
// This function runs once at shutdown
void SDL_AppQuit(void* appState, SDL_AppResult result)
{
 
}



Ссылка на видео игры https://www.youtube.com/watch?v=aSpxC7GWVVU
0
9933 / 2936 / 494
Регистрация: 05.10.2013
Сообщений: 7,965
Записей в блоге: 229
13.04.2025, 01:48
Цитата Сообщение от cosmos44 Посмотреть сообщение
Есть ТРАПЕЦИЯ (дорога). Как наложить (текстуру) к примеру левый отбойник, что бы это все правильно двигалось.
так как трапеция состоит из двух треугольников.
Это 3D игра. Здесь дорога прямоугольная. Трапецией её делает матрица перспективы. Это матрица имеет размер 4x4. Её свойство такое, что если умножить эту матрицу на вершины прямоугольника, а точнее на вершины двух треугольников из которых состоит прямоугольник, то дальняя сторона будет меньше, чем ближняя. Это очень наглядно можно увидеть в шейдерном OpenGL. Есть ещё матрица вида - она трансформирует объекты так, что нам кажется, что мы смотрим из камеры. Третья матрица - это так называемая матрица модели. Она задаёт позицию модели, её ориентацию, то есть углы поворота вокруг трёх осей и размеры по трём осям. Матрицы можно комбинировать перемножая их. Матрица модели - это комбинация матриц: матрица позиции, патрица поворота и матрица размера. Для работы с матрицами на C++ лучше всего взять библиотеку GLM. В ней уже есть готовые матрицы:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <iostream>
 
#define GLM_FORCE_PURE
#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
#include <glm/gtc/type_ptr.hpp>
#define GLM_ENABLE_EXPERIMENTAL
#include <glm/gtx/transform.hpp>
 
int main()
{
    // Матрица вида или камера
    glm::mat4 viewMatrix = glm::lookAt(
        glm::vec3(0.f, 3.f, 5.f), // Позиция камеры
        glm::vec3(0.f, 0.f, 0.f), // Точка наблюдения
        glm::vec3(0.f, 1.f, 0.f)); // Ориентация камеры - направление макушки
 
    // Матрица перспективной проектции
    float fovy = 45.f; // Угол обзора камеры
    float near = 0.1f; // Ближняя плоскость отсечения
    float far = 100.f; // Дальняя плоскость отсечения
    float aspect = 1.f; // Отношение ширины окна к высоте
    glm::mat4 projMatrix = glm::perspective(glm::radians(fovy),
        aspect, near, far);
 
    // Комбинация матрицы проекции и матрицы вида
    glm::mat4 projViewMatrix = projMatrix * viewMatrix;
 
    // Комбинируем матрицы позиции, поворота и размера в одну матрицу модели
    glm::mat4 modelMatrix = glm::translate(glm::mat4(1), glm::vec3(1.f, 2.f, 0));
    modelMatrix = glm::rotate(modelMatrix, glm::radians(20.f), glm::vec3(0.f, 0.f, 1.f));
    modelMatrix = glm::scale(modelMatrix, glm::vec3(1.f, 1.f, 1.f));
 
    return 0;
}
Библиотеку GLM можно скачать здесь: https://github.com/g-truc/glm/releases Это header-only библиотека, то есть её не нужно собирать из исходников, а достаточно подключить следующей строкой в CMakeLists.txt, если поместите GLM в папку libs в папку с вашим проектом:

Code
1
target_include_directories(app PRIVATE ./libs/glm-1.0.1-light)
CMakeLists.txt

C++
1
2
3
4
5
6
7
8
9
10
11
cmake_minimum_required(VERSION 3.21)
 
project(model-view-projection-glm-cpp)
 
add_executable(app)
 
target_include_directories(app PRIVATE ./libs/glm-1.0.1-light)
 
target_sources(app PRIVATE
    src/main.cpp
)
Лучше распаковать GLM в одну общую папку, например, на E:/libs, чтобы не копировать её в каждый проект и тогда подключить, используя путь E:/libs/glm-1.0.1-light

Code
1
target_include_directories(app PRIVATE E:/libs/glm-1.0.1-light)
В прикреплённом примере есть папка libs, где лежит GLM и подключение происходит по локальному пути: ./libs/glm-1.0.1-light

Можете открыть в VS2022, запустить, программа выполнится, но в консоль ничего не выводится.

Я компилирую из консоли с помощью MinGW, используя команды:

Bash
1
config
Bash
1
build
Которые запускают два батника:

config.bat

Bash
1
2
cmake -G "MinGW Makefiles" -S . -B dist\win ^
-DCMAKE_BUILD_TYPE=Debug
build.bat

Bash
1
2
3
cd dist\win
cmake --build .
cd ..\..
Программу запускаю командой из консоли:

Bash
1
dist\win\app
Если хотите, можете попробовать собрать прикреплённый пример с помощью MinGW и команд выше, если скачаете MinGW с Mediafire или TeraBox, а папку mingw/bin добавите в Path.
Вложения
Тип файла: zip model-view-projection-glm-cpp.zip (452.9 Кб, 0 просмотров)
1
8 / 6 / 4
Регистрация: 21.05.2022
Сообщений: 141
13.04.2025, 08:10  [ТС]
Цитата Сообщение от 8Observer8 Посмотреть сообщение
Это 3D игра. Здесь дорога прямоугольная.
Спасибо, понял.
В данный момент не хотелось бы переходить на что то другое. Разобраться нужно с одним, да и в c++ я еще зеленый.
Вопрос следующего характера!?
Возможно ли повторить что то подобное на на 2D с SDL? Персонажи перемещаются не совсем под углом 45 градусов, но под строгими углами. Повторить именно вторую часть видео. ссылка ниже.
https://www.youtube.com/watch?v=nMo_AFTBFpA
0
9933 / 2936 / 494
Регистрация: 05.10.2013
Сообщений: 7,965
Записей в блоге: 229
13.04.2025, 20:03
Цитата Сообщение от cosmos44 Посмотреть сообщение
Возможно ли повторить что то подобное на на 2D с SDL? Персонажи перемещаются не совсем под углом 45 градусов, но под строгими углами. Повторить именно вторую часть видео. ссылка ниже.
https://www.youtube.com/watch?v=nMo_AFTBFpA
Я навёл справки по Википедии и Deep Seek. На английской версии Википедии даётся больше информации. Это браузерная и мобильная 3D-игра на Unity (C#). Как вариант, вы можете найти конторы по вакансиям, которые делают игры на Unity и устроится к ним. Некоторые конторы набирают стажёров на низкую заработную плату. Так вы узнаете, как делаются подобные игры. Больше всего контор и вакансий с подобными играми именно на Unity и в основном они делают мобильные или браузерные игры для социальных сетей, по крайней мере в РФ. В Википедии написано, что эту игру к ноябрю 2023 скачали 130 млн. раз и она заработала $1.2 млрд.:
На ноябрь 2023 год Hero Wars Alliance была установлена 130 миллионов раз. Поступления в игру составили $1,2 млрд
В одиночку повторить такую игру даже на Unity, да ещё и стабильно зарабатывать на ней, чтобы на жизнь хватало - это, по-моему, очень маловероятно. Самая большая возможность зарабатывать на разработке игр - найти контору на Unity, где делают подобные мобильные или браузерные игры, в своём городе и устроиться стажёром.

Другое дело, если вы просто ради саморазвития в качестве хобби хотите сделать короткую демку похожую на эту игру с целью практики для изучения C++. Но лучше тогда использовать SDL3 вместе с OpenGL. На шейдерах лучше видно, как работают основы 2D/3D графики. На SDL 2D API можно сделать 3D-демку. Так ответил Deep Seek на мой вопрос:

Возможно ли делать 3D-игры с помощью 2D API в SDL3?
Да, можно создавать простые 3D-игры, используя 2D API SDL3, но с серьёзными ограничениями. SDL (Simple DirectMedia Layer) изначально разработан для 2D-рендеринга, поэтому любые 3D-эффекты придётся реализовывать вручную с помощью программных методов.

Способы создания 3D с помощью 2D API SDL3:

1. Рэйкастинг (как в Wolfenstein 3D)
  • Можно реализовать алгоритм рейкастинга для псевдо-3D окружения.
  • Именно так работали ранние "3D"-игры (например, Wolfenstein 3D и DOOM до перехода на настоящий 3D).

2. Спрайтовая 3D-графика (в стиле Mode 7, как на SNES)
  • Использование масштабирования и перспективных искажений для имитации глубины.
  • Функция SDL_RenderGeometry() в SDL3 позволяет применять простые аффинные преобразования.

3. Программный растеризатор (полигональная 3D-графика)
  • Вручную проецировать 3D-точки в 2D-пространство и отрисовывать треугольники.
  • SDL_RenderGeometry() может помочь с текстурированными треугольниками.

4. "Фейковый" 3D с помощью слоёв 2D-спрайтов
  • Параллакс-скроллинг и сортировка по глубине для создания эффекта 3D.

Ограничения:
  • Нет аппаратного ускорения 3D – 2D-рендерер SDL3 не поддерживает OpenGL/Direct3D/Vulkan напрямую.
  • Низкая производительность для сложных 3D-сцен, так как всё рендерится на CPU.
  • Нет встроенного буфера глубины, освещения или шейдеров.

Лучшие альтернативы:

Если нужна настоящая 3D-графика, лучше рассмотреть:
  • Использование SDL3 вместе с OpenGL/Vulkan (SDL3 может создавать окно и контекст рендеринга).
  • Готовые 3D-движки (Godot, Unity, Unreal или фреймворки вроде bgfx, OGRE).
  • Экспериментальный GPU API в SDL3 (если будет доступен в будущих версиях).

Пример (простая 3D-проекция на SDL3):

C++
1
2
3
4
5
6
7
8
9
// Ручное проецирование 3D-точки
void render_3d_point(SDL_Renderer *renderer, float x, float y, float z) {
    // Простая перспективная проекция
    float scale = 500.0f / (z + 10.0f);
    int screenX = (int)(x * scale + 400);
    int screenY = (int)(y * scale + 300);
    
    SDL_RenderDrawPoint(renderer, screenX, screenY);
}
Вывод:

Для простых 3D-эффектов 2D API SDL3 подойдёт, но для полноценных 3D-игр лучше комбинировать SDL3 с OpenGL/Vulkan.
0
8 / 6 / 4
Регистрация: 21.05.2022
Сообщений: 141
13.04.2025, 21:02  [ТС]
Цитата Сообщение от 8Observer8 Посмотреть сообщение
В Википедии написано, что эту игру к ноябрю 2023 скачали 130 млн. раз и она заработала $1.2 млрд.:
Думаю тут заслуга рекламы - +130т. скачиваний.
Попробую повторить чисто 2D. Посмотрим что будет )))))))))))))))
0
9933 / 2936 / 494
Регистрация: 05.10.2013
Сообщений: 7,965
Записей в блоге: 229
06.06.2025, 15:34
Вы ещё не пробовали проигрывать аудио-файлы с помощью SDL3_mixer. Но с другой стороны, вы сейчас сконцентрированы на Unity и C#, судя по недавним темам. Скорее всего, вам лучше не отвлекаться на C++.

Не помню, публиковал ли я эту информацию. Ещё раз опубликую, может кому-то пригодится. Я когда собирал библиотеки SDL3 с помощью CMake и VS 2022, то записал каждый шаг со скриншотами, а так же как подключил их к VS 2022:

CMake позволяет открывать, запускать и отлаживать проекты не только в VS, но и в Qt Creator, VSCode, KDevelop, CLion и т.д.

На официальном Discord'е SDL (Discord запрещён в РФ) писали, что надо использовать версии SDL3 выше или равной 3.2.0, так как версии ниже 3.2.0 считаются pre-release, но я всё равно использую. Пока не сталкивался с какими-либо проблемами по этому поводу, потому что использую SDL3 для сборки OpenGL-приложений в WebAssembly (WASM) с помощью Emscripten и для сборки в APK для Android из WASM с помощью Cordova.
Вложения
Тип файла: zip sdl-3.1.10.zip (6.39 Мб, 0 просмотров)
Тип файла: zip sdl3_image-3.1.1.zip (532.5 Кб, 0 просмотров)
Тип файла: zip sdl3_mixer-3.0.0.zip (803.6 Кб, 0 просмотров)
Тип файла: zip sdl3_ttf-3.1.0.zip (1.68 Мб, 0 просмотров)
Тип файла: zip freetype-2.13.3.zip (2.23 Мб, 0 просмотров)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.06.2025, 15:34
Помогаю со студенческими работами здесь

Неправильная отрисовка текстур в OpenGL
Всем доброго дня, недавно начал изучать как работать с графикой и решил повторить пример из урока, а именно - вращающийся кубик. Но...

QRubberBand медленно отрисовывается
С помощью QRubberBand выделяю участок наследника QGraphicsView для последующего сохранения, решил поставить ограничение на мышь чтобы если...

Не отрисовывается график
учусь делать оконное приложение вот по этому уроку. http://doc.qt.io/Qt-5/Qtqml-tutorials-extending-qml-example.html получилось...

Генератор текстур( с чего начать)
Всем привет, решил для своего 3д проекта написать генератор текстур, пока что необходима текстура булыжника. Никто не подскажет с помощью...

Qt с++ картинка постоянно отрисовывается
Ребята помогите пожалуйста, картинки один раз перемешивались и орисовывались и всё... а у меня эти действии повторяются каждый раз когда я...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
167
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru