История изменений
Исправление peregrine, (текущая версия) :
А если прямо на OpenGL делать?
Сейчас в меня полетят какашки за очень плохой код, который сгенерирован нейронкой (я паскаль лет 10 не видел в глаза) и не использует шейдеры и всё то за что вообще OpenGL используют, но:
program OpenGLTextureGlut;
{$mode objfpc}{$H+}
uses
gl, glu, glut;
const
WindowWidth = 640;
WindowHeight = 480;
var
TextureID: GLuint;
// Массив пикселей 2x2 в формате RGB (Красный, Желтый, Синий, Зеленый)
TextureData: array[0..3, 0..2] of GLubyte = (
(255, 0, 0), // Пиксель 0: Красный
(255, 255, 0), // Пиксель 1: Желтый
(0, 0, 255), // Пиксель 2: Синий
(0, 255, 0) // Пиксель 3: Зеленый
);
{ Инициализация OpenGL и создание текстуры }
procedure InitGL; cdecl;
begin
// Устанавливаем черный цвет фона
glClearColor(0.0, 0.0, 0.0, 0.0);
// Включаем поддержку двумерных текстур
glEnable(GL_TEXTURE_2D);
// Генерируем 1 уникальный ID для нашей текстуры
glGenTextures(1, @TextureID);
// Делаем текстуру активной для последующей настройки
glBindTexture(GL_TEXTURE_2D, TextureID);
// Настраиваем фильтрацию (критично для отображения!)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
// Загружаем массив пикселей из памяти CPU в память видеокарты
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 2, 2, 0, GL_RGB, GL_UNSIGNED_BYTE, @TextureData);
end;
{ Отрисовка сцены }
procedure Display; cdecl;
begin
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
glLoadIdentity;
// Привязываем нашу текстуру перед началом рисования quads
glBindTexture(GL_TEXTURE_2D, TextureID);
// Рисуем квадрат и сопоставляем текстурные координаты (от 0.0 до 1.0) с вершинами
glBegin(GL_QUADS);
glTexCoord2f(0.0, 0.0); glVertex2f(-0.5, -0.5); // Левый нижний угол
glTexCoord2f(1.0, 0.0); glVertex2f( 0.5, -0.5); // Правый нижний угол
glTexCoord2f(1.0, 1.0); glVertex2f( 0.5, 0.5); // Правый верхний угол
glTexCoord2f(0.0, 1.0); glVertex2f(-0.5, 0.5); // Левый верхний угол
glEnd;
glutSwapBuffers;
end;
{ Изменение размеров окна }
procedure Reshape(Width, Height: Integer); cdecl;
begin
if Height = 0 then Height := 1;
glViewport(0, 0, Width, Height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity;
gluOrtho2D(-1.0, 1.0, -1.0, 1.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity;
end;
var
CmdCount: Integer;
Cmd: array of PChar;
I: Integer;
begin
// Безопасная передача аргументов командной строки в GLUT для Free Pascal
CmdCount := ParamCount + 1;
SetLength(Cmd, CmdCount);
for I := 0 to CmdCount - 1 do
Cmd[I] := PChar(ParamStr(I));
// Инициализация GLUT
glutInit(@CmdCount, @Cmd);
glutInitDisplayMode(GLUT_DOUBLE or GLUT_RGB or GLUT_DEPTH);
glutInitWindowSize(WindowWidth, WindowHeight);
glutCreateWindow('Free Pascal OpenGL Texture');
// Настройка состояния OpenGL
InitGL;
// Регистрация функций обратного вызова
glutDisplayFunc(@Display);
glutReshapeFunc(@Reshape);
// Запуск главного цикла
glutMainLoop;
end.
Для работы ему надо:
sudo apt install fpc freeglut3-dev mesa-common-dev
Компилировать можно как-то так:
fpc -Mobjfpc -Sh -O2 graphics.pas
Будет проблема с запуском (у паскаля линковщик не сишный, а свой говёный), так что потребует костыликов или курения доков паскаля (мне лень), поэтому в папке проекта:
ln -s /lib/x86_64-linux-gnu/libglut.so.3.12 ./libglut.so.3
Запускать командой
LD_LIBRARY_PATH=. ./graphics
Это концепт просто, моя заслуга только в том, что я гугловской нейронке 5 вопросов задал. И никаких чудовищных SDL-ей, которые даже музыку умеют играть.
ЗЫ
Не уверен, что в коде нет лишних uses.
Исправление peregrine, :
А если прямо на OpenGL делать?
Сейчас в меня полетят какашки за очень плохой код, который сгенерирован нейронкой (я паскаль лет 10 не видел в глаза) и не использует шейдеры и всё то за что вообще OpenGL используют, но:
program OpenGLTextureGlut;
{$mode objfpc}{$H+}
uses
gl, glu, glut;
const
WindowWidth = 640;
WindowHeight = 480;
var
TextureID: GLuint;
// Массив пикселей 2x2 в формате RGB (Красный, Желтый, Синий, Зеленый)
TextureData: array[0..3, 0..2] of GLubyte = (
(255, 0, 0), // Пиксель 0: Красный
(255, 255, 0), // Пиксель 1: Желтый
(0, 0, 255), // Пиксель 2: Синий
(0, 255, 0) // Пиксель 3: Зеленый
);
{ Инициализация OpenGL и создание текстуры }
procedure InitGL; cdecl;
begin
// Устанавливаем черный цвет фона
glClearColor(0.0, 0.0, 0.0, 0.0);
// Включаем поддержку двумерных текстур
glEnable(GL_TEXTURE_2D);
// Генерируем 1 уникальный ID для нашей текстуры
glGenTextures(1, @TextureID);
// Делаем текстуру активной для последующей настройки
glBindTexture(GL_TEXTURE_2D, TextureID);
// Настраиваем фильтрацию (критично для отображения!)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
// Загружаем массив пикселей из памяти CPU в память видеокарты
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 2, 2, 0, GL_RGB, GL_UNSIGNED_BYTE, @TextureData);
end;
{ Отрисовка сцены }
procedure Display; cdecl;
begin
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
glLoadIdentity;
// Привязываем нашу текстуру перед началом рисования quads
glBindTexture(GL_TEXTURE_2D, TextureID);
// Рисуем квадрат и сопоставляем текстурные координаты (от 0.0 до 1.0) с вершинами
glBegin(GL_QUADS);
glTexCoord2f(0.0, 0.0); glVertex2f(-0.5, -0.5); // Левый нижний угол
glTexCoord2f(1.0, 0.0); glVertex2f( 0.5, -0.5); // Правый нижний угол
glTexCoord2f(1.0, 1.0); glVertex2f( 0.5, 0.5); // Правый верхний угол
glTexCoord2f(0.0, 1.0); glVertex2f(-0.5, 0.5); // Левый верхний угол
glEnd;
glutSwapBuffers;
end;
{ Изменение размеров окна }
procedure Reshape(Width, Height: Integer); cdecl;
begin
if Height = 0 then Height := 1;
glViewport(0, 0, Width, Height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity;
gluOrtho2D(-1.0, 1.0, -1.0, 1.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity;
end;
var
CmdCount: Integer;
Cmd: array of PChar;
I: Integer;
begin
// Безопасная передача аргументов командной строки в GLUT для Free Pascal
CmdCount := ParamCount + 1;
SetLength(Cmd, CmdCount);
for I := 0 to CmdCount - 1 do
Cmd[I] := PChar(ParamStr(I));
// Инициализация GLUT
glutInit(@CmdCount, @Cmd);
glutInitDisplayMode(GLUT_DOUBLE or GLUT_RGB or GLUT_DEPTH);
glutInitWindowSize(WindowWidth, WindowHeight);
glutCreateWindow('Free Pascal OpenGL Texture');
// Настройка состояния OpenGL
InitGL;
// Регистрация функций обратного вызова
glutDisplayFunc(@Display);
glutReshapeFunc(@Reshape);
// Запуск главного цикла
glutMainLoop;
end.
Для работы ему надо:
sudo apt install fpc freeglut3-dev mesa-common-dev
Компилировать можно как-то так:
fpc -Mobjfpc -Sh -O2 graphics.pas
Будет проблема с запуском (у паскаля линковщик не сишный, а свой говёный), так что потребует костыликов или курения доков паскаля (мне лень), поэтому в папке проекта:
ln -s /lib/x86_64-linux-gnu/libglut.so.3.12 ./libglut.so.3
Запускать командой
LD_LIBRARY_PATH=. ./graphics
Это концепт просто, моя заслуга только в том, что я гугловской нейронке 5 вопросов задал. И никаких чудовищных SDL-ей, которые даже музыку умеют играть.
Исходная версия peregrine, :
А если прямо на OpenGL делать?
Сейчас в меня полетят какашки за очень плохой код, который сгенерирован нейронкой (я паскаль лет 10 не видел в глаза) и не использует шейдеры и всё то за что вообще OpenGL используют, но:
program OpenGLTextureGlut;
{$mode objfpc}{$H+}
uses
gl, glu, glut;
const
WindowWidth = 640;
WindowHeight = 480;
var
TextureID: GLuint;
// Массив пикселей 2x2 в формате RGB (Красный, Желтый, Синий, Зеленый)
TextureData: array[0..3, 0..2] of GLubyte = (
(255, 0, 0), // Пиксель 0: Красный
(255, 255, 0), // Пиксель 1: Желтый
(0, 0, 255), // Пиксель 2: Синий
(0, 255, 0) // Пиксель 3: Зеленый
);
{ Инициализация OpenGL и создание текстуры }
procedure InitGL; cdecl;
begin
// Устанавливаем черный цвет фона
glClearColor(0.0, 0.0, 0.0, 0.0);
// Включаем поддержку двумерных текстур
glEnable(GL_TEXTURE_2D);
// Генерируем 1 уникальный ID для нашей текстуры
glGenTextures(1, @TextureID);
// Делаем текстуру активной для последующей настройки
glBindTexture(GL_TEXTURE_2D, TextureID);
// Настраиваем фильтрацию (критично для отображения!)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
// Загружаем массив пикселей из памяти CPU в память видеокарты
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 2, 2, 0, GL_RGB, GL_UNSIGNED_BYTE, @TextureData);
end;
{ Отрисовка сцены }
procedure Display; cdecl;
begin
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
glLoadIdentity;
// Привязываем нашу текстуру перед началом рисования quads
glBindTexture(GL_TEXTURE_2D, TextureID);
// Рисуем квадрат и сопоставляем текстурные координаты (от 0.0 до 1.0) с вершинами
glBegin(GL_QUADS);
glTexCoord2f(0.0, 0.0); glVertex2f(-0.5, -0.5); // Левый нижний угол
glTexCoord2f(1.0, 0.0); glVertex2f( 0.5, -0.5); // Правый нижний угол
glTexCoord2f(1.0, 1.0); glVertex2f( 0.5, 0.5); // Правый верхний угол
glTexCoord2f(0.0, 1.0); glVertex2f(-0.5, 0.5); // Левый верхний угол
glEnd;
glutSwapBuffers;
end;
{ Изменение размеров окна }
procedure Reshape(Width, Height: Integer); cdecl;
begin
if Height = 0 then Height := 1;
glViewport(0, 0, Width, Height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity;
gluOrtho2D(-1.0, 1.0, -1.0, 1.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity;
end;
var
CmdCount: Integer;
Cmd: array of PChar;
I: Integer;
begin
// Безопасная передача аргументов командной строки в GLUT для Free Pascal
CmdCount := ParamCount + 1;
SetLength(Cmd, CmdCount);
for I := 0 to CmdCount - 1 do
Cmd[I] := PChar(ParamStr(I));
// Инициализация GLUT
glutInit(@CmdCount, @Cmd);
glutInitDisplayMode(GLUT_DOUBLE or GLUT_RGB or GLUT_DEPTH);
glutInitWindowSize(WindowWidth, WindowHeight);
glutCreateWindow('Free Pascal OpenGL Texture');
// Настройка состояния OpenGL
InitGL;
// Регистрация функций обратного вызова
glutDisplayFunc(@Display);
glutReshapeFunc(@Reshape);
// Запуск главного цикла
glutMainLoop;
end.
Для работы ему надо:
sudo apt install fpc freeglut3-dev mesa-common-dev
Компилировать можно как-то так:
fpc -Mobjfpc -Sh -O2 graphics.pas
Будет проблема с запуском (у паскаля линковщик не сишный, а свой говёный), так что потребует костыликов или курения доков паскаля (мне лень), поэтому в папке проекта:
ln -s /lib/x86_64-linux-gnu/libglut.so.3.12 ./libglut.so.3
Запускать командой
LD_LIBRARY_PATH=. ./graphics
Это концепт просто, моя заслуга только в том, что я гугловской нейронке 5 вопросов задал.