Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание игр: Unity, OpenGL, DirectX
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.12.2011, 17:20   #31
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,690
По умолчанию

Нет, не компилится, ошибок куча.
Kostia вне форума Ответить с цитированием
Старый 24.12.2011, 18:26   #32
Warn
Форумчанин
 
Аватар для Warn
 
Регистрация: 03.11.2011
Сообщений: 230
По умолчанию

Ну это и не удивительно, поскольку писалось под и для D2010 а не D7.
Т.е. запустилась та прога что с исходниками шла, но она вроде 1 в 1 с прогой из 20ого поста просто несжатая ) попробуй тогда ее сжать upx (compress.bat) и вновь запустить, может сжатые exe отказывались запускаться %
Warn вне форума Ответить с цитированием
Старый 24.12.2011, 18:37   #33
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,690
По умолчанию

И сжатая, и несжатая работает.
Kostia вне форума Ответить с цитированием
Старый 24.12.2011, 20:23   #34
Warn
Форумчанин
 
Аватар для Warn
 
Регистрация: 03.11.2011
Сообщений: 230
По умолчанию

Kostia, если я еще не замучил, то вот эту версию было бы крайне интересно протестировать. Глянул как производят инициализацию в dglOpenGL.pas сделал по аналогии (практически).
Вложения
Тип файла: rar gl33test.rar (271.4 Кб, 12 просмотров)

Последний раз редактировалось Warn; 24.12.2011 в 22:38.
Warn вне форума Ответить с цитированием
Старый 24.12.2011, 23:01   #35
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,690
По умолчанию

Всё работает.

Цитата:
ChoosePixelFormat = 9
ColorBits = 32
DepthBits = 24
StencilBits = 8
GetPixelFormat(DC) <> ChoosePixelFormat(DC) --> SetPixelFormat(DC)
First time wglCreateContext ( 1459687825 ) = 65536
GetLastError (wglCreateContext) = 0
wglCreateContextAttribsARB ( gl_context = 131072)
Load user resouces
Cleanup user resoures
Kostia вне форума Ответить с цитированием
Старый 25.12.2011, 21:09   #36
Warn
Форумчанин
 
Аватар для Warn
 
Регистрация: 03.11.2011
Сообщений: 230
По умолчанию

Отлично, теперь буду дальше ковырять техники рисования по пути наращивая функционал модулей. Если что может вновь обращусь с просьбой протестировать программу ).
Warn вне форума Ответить с цитированием
Старый 04.01.2012, 11:46   #37
Warn
Форумчанин
 
Аватар для Warn
 
Регистрация: 03.11.2011
Сообщений: 230
По умолчанию

Возник вопрос.
Как подготавливается матрица modelViewProjection которая используется в шейдере?

тестю сценку прямоугольник должен быть перед камерой.
Делаю пока так.
Код:
// матрица модели
model := mat4_idenity;

//вектора камеры
pos.value(0, 0, 5);
up.value(0, 1, 0);
look.value(0, 0, 0);

// Вид
view := GetLookAt(pos, look, up);

// Проекция
projection := GetPerspectiveProjection(45.0, (Width / Height), 0.1, 500.0);

// Вид-проекция
viewProjection := projection * view;

// Модель-Вид-Проекция (вершины в шейдере трансформируются с помощью ее)
modelViewProjection :=  viewProjection * model;
и почему-то объекта (прямоугольник с текстурой) перед камерой(и за нею) не наблюдаю.

геометрия прямоугольника
Код:
  geometry[0].pos.value(-1, 1, -2);
  geometry[0].tex.value(0, 1);

  geometry[1].pos.value(1, 1, -2);
  geometry[1].tex.value(1, 1);

  geometry[2].pos.value(1, -1, -2);
  geometry[2].tex.value(1, 0);

  geometry[3].pos.value(1, -1, -2);
  geometry[3].tex.value(1, 0);

  geometry[4].pos.value(-1, -1, -2);
  geometry[4].tex.value(0, 0);

  geometry[5].pos.value(-1, 1, -2);
  geometry[5].tex.value(0, 1);
Стоит
view := GetLookAt(pos, look, up);
заменить скажем на трансляцию view := GetTranslation(-pos); или поворот view := GetRotationZMat4(45);
объект видно перед камерой.


Проблема разрешилась код написанный выше работает нормально.
Проблема вскрылась, после того как я решил взять из матрицы вида(view : mat4) углы Эйлера (rotation : vec3) Посмотреть как же она так крутит камеру что ничего не видно.
Код:
rotation : vec3;
rotation := GetEulerFromMat4(GetLookAt(pos, look, up));
view := GetMat4FromEuler(rotation) * GetTranslation(-pos);
на мое удивлении там было (0, -270, 0) хотя должно было быть (0, 0, 0)
поскольку вектора имеют следующую ориентацию
Код:
pos.value(0, 0, 5);
up.value(0, 1, 0);
look.value(0, 0, 0);
вообщем далее я проверил всю GetLookAt()
проблема была тут
Код:
f := normalize((position - center));
а еще более точнее
Код:
class operator vec3.subtract(const a, b: vec3):vec3;
begin
  result.x := a.x - b.x;
  result.y := a.y - b.y;
  result.y := a.z - b.z; // исправил на result.z := a.z - b.z;
end;

Последний раз редактировалось Warn; 04.01.2012 в 18:01.
Warn вне форума Ответить с цитированием
Старый 07.01.2012, 23:44   #38
Warn
Форумчанин
 
Аватар для Warn
 
Регистрация: 03.11.2011
Сообщений: 230
По умолчанию

Не могу понять что нужно сделать что бы куст не обрезало.
Привожу пример безобразия. Итого как он должен выглядеть.
Программку тоже прилагаю чтобы воочию это понаблюдать,
Управление WASD + mouse + mouse wheel.
Деревья друг-другу закрывают/обрезают видимые части, как с таким борются?
Изображения
Тип файла: jpg h1.jpg (42.4 Кб, 89 просмотров)
Тип файла: jpg h2.jpg (17.8 Кб, 93 просмотров)
Вложения
Тип файла: rar gl33test.rar (1,015.1 Кб, 13 просмотров)
Warn вне форума Ответить с цитированием
Старый 08.01.2012, 11:24   #39
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,690
По умолчанию

Цитата:
Смешивание в OpenGL

Мы включаем эффект смешивания так же как что-либо другое. Затем мы задаем уравнение и выключаем буфер глубины на запись при рисовании прозрачных объектов, поскольку мы хотим увидеть объекты позади нарисованных полупрозрачных фигур. Это не идеальный способ смешивания, но в нашем простом проекте он будет работать достаточно хорошо.

Комментарий Rui Martins: более правильный путь состоит в том, чтобы вывести все прозрачные (с альфой < 1.0) полигоны после того, как Вы вывели полную сцену, и выводить их в обратном порядке глубины (сначала – дальние).

Это оттого, что смешивание двух полигонов (1 и 2) в различном порядке дает различные результаты, то есть если полигон 1 - самый близкий к наблюдателю, то нужно вывести полигон 2 и затем 1. Если провести аналогию с реальностью, то свет, проходящий сквозь эти два полигона (которые являются прозрачными), должен пройти сначала 2-й полигон и затем полигон 1 до того как достигнет глаза наблюдателя.

Вы должны СОРТИРОВАТЬ ПРОЗРАЧНЫЕ ПОЛИГОНЫ ПО ГЛУБИНЕ и выводить их ПОСЛЕ ТОГО, КАК БЫЛА ОТРИСОВАНА ПОЛНАЯ СЦЕНА с ВЫКЛЮЧЕННЫМ БУФЕРОМ ГЛУБИНЫ, или получится неправильно. Я знаю, что это иногда трудно, но это - правильный способ делать это.
http://pmg.org.ru/nehe/nehe08.htm
Kostia вне форума Ответить с цитированием
Старый 08.01.2012, 14:28   #40
Warn
Форумчанин
 
Аватар для Warn
 
Регистрация: 03.11.2011
Сообщений: 230
По умолчанию

Kostia
Спасибо.
Сделал простую пузырьковую сортировку.
Она сортирует позиции в зависимости от удаленности от камеры.
Последние в массиве - ближайшие к камере.

Код:
procedure MyGLApp.SortTreesByNearToCam(const campos: vec3; var treespos: array of vec3 );
var
  temp  : vec3;
  i,pass   : integer;
  t1    : single;
  t2    : single;
  max   : integer;
  
begin
  max := high(treespos);
  
  for pass := 0 to max do
  for i := 0 to (max-1) - pass do begin

    t1 := length(campos - treespos[i]);
    t2 := length(campos - treespos[i+1]);

    if ( t1 < t2 ) then begin
      temp := treespos[i];
      treespos[i] := treespos[i+1];
      treespos[i+1] := temp;
    end;

  end;
end;
Рисую следующим образом.

Код:
  // Позиции деревьев
  TreesPositions[0].value(1,1,2);
  TreesPositions[1].value(2,1, -2);
  TreesPositions[2].value(-2,1,2);
  TreesPositions[3].value(-2,1,4);
  TreesPositions[4].value(-2,1,-3);
  TreesPositions[5].value(3,1,3);
Код:
  // Рисуем деревья
  // Включаем смешивание
  glEnable (GL_BLEND);
  glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  // Отключаем запись в Z буффер, но тест продолжает работать 
  // glDepthMask(False); // !В приведеном ниже примере запись откл!.
  // Устанавливаем текстуру ветки
  glBindTexture(GL_TEXTURE_2D, Tree_Texture.id);
  // Отключаем отсечение задних треугольников
  glDisable(GL_CULL_FACE);

  // Сортировка позиций деревьев по удалению от камеры
  // Последние элементы отсортированного массива самые близкие к камере
  SortTreesByNearToCam(cam.pos, TreesPositions);

  // Прорисовка деревьев
  for i := 0 to 5 do begin
    // Сбраcываем матрицу объекта
    Tree.ModelMatrix.idenity();
    // Перемещаем дерево в позицию
    Tree.ModelMatrix.translate(TreesPositions[i]);
    // Обновляем и отправляем данные в шейдер
    Cam.SendTransforms(Shader.ShaderProgram, Tree.ModelMatrix);
    // Рисуем
    Tree.DrawMesh();
  end;

  // Востанавливаем настройки для непрозрачных объектов
  // Отключаем альфа смешивание
  glDisable (GL_BLEND);
  // Включаем запись в Z
  glDepthMask(True);
  // Включаем отсечение невидимых треугольников
  glEnable(GL_CULL_FACE);
При этом все-таки наблюдаются перекрытия деревьев. т.е. дерево с заднего плана рисуется впереди если к нему приближаться.
Не понятно, почему такое может сортировка кривая?

Однако, если я оставляю запись в Z буфер во время прорисовки деревьев, а в шейдере сделаю альфа тест (поскольку не понял, как его делать в gl33core ф-и в ядре - нет.) т.е вместо
Код:
  ResultColor = texture(colorTexture, fragTex)
пишу
Код:
  
  vec4 texel = texture(colorTexture, fragTex);
  if (texel.a < 0.5f) discard;
  ResultColor = texel;
Тогда все рисует более или менее нормально.
Но все-таки не понятно, почему по описанному выше алгоритму есть проблемы? Kostia, ты сортировку, если делал то как? Может сравнения по одной дистанции мало ?%
Прилагаю обновленную версию, с включенной записью в Z buffer и альфа тестом в шейдере. можно раскоментить отключение Z buffer в коде, а в шейдере закоментить альфа тест - получаем метод описанный nexe и проблемы с наложением деревьев.
Изображения
Тип файла: jpg ff.jpg (44.8 Кб, 84 просмотров)
Вложения
Тип файла: rar gl33test.rar (1,017.1 Кб, 8 просмотров)
Warn вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программа для проверки (правильности кода). Контекст. AmbaQ Софт 4 14.11.2010 16:50
Контекст устройства. Основы работы с изображением Claster Win Api 1 03.04.2010 00:26
BitBlt на контекст DC и его альтернатива notHaker Мультимедиа в Delphi 7 03.12.2009 01:04
Контекст воспроизведения OpenGL Gerzs Мультимедиа в Delphi 5 23.11.2009 11:33
Контекст воспроизведения OpenGL Sergeevich Gamedev - cоздание игр: Unity, OpenGL, DirectX 6 08.11.2009 21:50