LINUX.ORG.RU

История изменений

Исправление 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 вопросов задал.