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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.01.2011, 19:56   #1
k3rn3l
Пользователь
 
Регистрация: 09.01.2011
Сообщений: 16
По умолчанию Проблемы с освещением

Имеется четырехугольник, на него наложена текстура, не получается сделать освещение к ней. Да и без наложения текстуры четырехугольник при диффузном освещении (1,1,1) не был полностью белым.(или так и должно быть?).

Код:
procedure TForm1.FormCreate(Sender: TObject);
const
  diffuse_light:array[0..3] of GLFloat = (1,1,1,1);
begin
  ghDC := GetDC(Handle);
  if not SetDCPixelFormat(ghDC) then exit;
  ghRC := wglCreateContext(ghDC);
  wglMakeCurrent(ghDC, ghRC);
  glClearColor(0, 0, 0, 0);                      // Black Background

  glShadeModel(GL_SMOOTH);                // Enables Smooth Color Shading
  glClearDepth(1.0);                           // Depth Buffer Setup
  glEnable(GL_DEPTH_TEST);                // Enable Depth Buffer
  glDepthFunc(GL_LESS);                    // The Type Of Depth Test To Do
  glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);         //Realy Nice perspective calculations

  TextureInit();
  glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,GL_REPLACE);
  //  CreatePyramidList();
  //  CreateCubeList();

  glLightfv(GL_LIGHT1, GL_DIFFUSE, @diffuse_light);

  glViewPort(0,0,width,height);
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();
  glFrustum(-1,1,-1,1,1,40);
  moveX:=0;
  moveY:=0;
  moveZ:=0;

  glMatrixMode(GL_MODELVIEW);

end;



procedure TForm1.FormPaint(Sender: TObject);
begin

//CalculateFrameRate();

glClear(GL_DEPTH_BUFFER_BIT xor GL_COLOR_BUFFER_BIT);

    //    glLoadIdentity;
   //     glTranslatef(-2, 0.0, -8.0);
    //    glTranslatef(moveX,moveY,moveZ);
     //   glRotatef(Trot, 1, 1, 1);
     //   glCallList(PyramidDL);

       	glLoadIdentity();
        glTranslatef(0, 0.0, -8.0);
 //     glTranslatef(moveX,moveY,moveZ);
 //  	glRotatef(Qrot, 1.0, 1.0, 1.0);
 //     glCallList(CubeDL);

        glBindTexture(GL_TEXTURE_2D, myTex[1]);
        glEnable(GL_TEXTURE_2D);
        glEnable (GL_LIGHTING);
        glEnable (GL_LIGHT1);
        glBegin(GL_QUADS);
         glNormal3f(0.0, 0.0, 1.0);
      //передняя грань
 glTexCoord2f(0.0, 0.0);      glVertex3f(1.0, 1.0, 1.0);
 glTexCoord2f(0.0, 1.0);      glVertex3f(1.0, -1.0, 1.0);
 glTexCoord2f(1.0, 1.0);      glVertex3f(-1.0, -1.0, 1.0);
 glTexCoord2f(1.0, 0.0);      glVertex3f(-1.0, 1.0, 1.0);

        glEnd;

   //	Trot :=Trot + 1;
   //	Qrot :=Qrot - 1;

    SwapBuffers(ghDC);

end;
Может заменить GL_REPLACE на GL_MODULATE, но тогда насколько я понимаю во внимание принимается и цвет текселя, и цвет фона четырехугольника?

ps закоментированные строчки прошу во внимание не принимать.
Вложения
Тип файла: rar OpenGLProg.rar (242.1 Кб, 13 просмотров)

Последний раз редактировалось Beermonza; 12.01.2011 в 21:45.
k3rn3l вне форума Ответить с цитированием
Старый 13.01.2011, 09:09   #2
.pixel
c++, dx/ogl
Форумчанин
 
Аватар для .pixel
 
Регистрация: 10.11.2008
Сообщений: 131
По умолчанию

Цитата:
не получается сделать освещение к ней
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,GL_REPLACE); - не учитывает затенение объекта, с GL_MODULATE - учитывает (накладываемая текстура будет затенена так же как затенен объект). А уже как у вас затеняется объект разбирайтесь со светом.

Цитата:
но тогда насколько я понимаю во внимание принимается и цвет текселя, и цвет фона четырехугольника?
а вам как надо? Настройте материал для вашего квада.
“Batch, Batch, Batch:” What Does It Really Mean?
I am a donut! Ask not how many tris/batch, but
rather how many batches/frame!
.pixel вне форума Ответить с цитированием
Старый 13.01.2011, 13:25   #3
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

Код:
glEnable(GL_TEXTURE_2D);
glEnable (GL_LIGHTING);
glEnable (GL_LIGHT1);
это делается при инициализации приложения, а не при перерисовке


кстати, я где у вас установлена позиция света? По умолчанию наверно он стоит в 0,0,0
Код:
light_pos:array[0..2] of GLFloat = (0,2,5);
glLightfv(GL_LIGHT1, GL_POSITION, @light_pos);
тоже при инициализации

Последний раз редактировалось NiCola999; 13.01.2011 в 13:28.
NiCola999 вне форума Ответить с цитированием
Старый 13.01.2011, 15:10   #4
k3rn3l
Пользователь
 
Регистрация: 09.01.2011
Сообщений: 16
По умолчанию

Сейчас поэксперементировал, вроде работает, но только при включенном GL_MODULATE (при GL_REPLACE не работает). Почему не работает при GL_REPLACE, ведь при нем текстура просто накладывается на полигон как есть, а каким боком это влияет на освещение текстуры.

Цитата:
Сообщение от .pixel Посмотреть сообщение
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,GL_REPLACE); - не учитывает затенение объекта, с GL_MODULATE - учитывает (накладываемая текстура будет затенена так же как затенен объект). А уже как у вас затеняется объект разбирайтесь со светом.
Как понять затенение? Если объект на сцене один, то никакого затенения по идеи не должно быть => в моем примере, что при GL_MODULATE, что при GL_REPLACE результат должен быть одинаковым.

Цитата:
Сообщение от NiCola999 Посмотреть сообщение

кстати, я где у вас установлена позиция света? По умолчанию наверно он стоит в 0,0,0
Код:
procedure TForm1.FormCreate(Sender: TObject);
const
   diffuse_light:array[0..3] of GLFloat = (1.0,1.0,1.0,1);
   light_position:array[0..3] of GLFloat = (0,0,2,1);
   LightAmbient: array [0..3] of GLFloat = (1,1,1,1);
Код:
  glLightfv(GL_LIGHT0, GL_DIFFUSE, @diffuse_light);
  glLightfv(GL_LIGHT0, GL_AMBIENT, @LightAmbient);
  glLightfv(GL_LIGHT0,GL_POSITION, @light_position);
  glEnable (GL_LIGHTING);
  glEnable (GL_LIGHT0);
Еще не понятно, что делает фоновое освещение. Сколько не менял значение GL_AMBIENT, но так и не углядел разницы.
k3rn3l вне форума Ответить с цитированием
Старый 13.01.2011, 15:47   #5
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

gl_ambient это цвет зеркального блика
NiCola999 вне форума Ответить с цитированием
Старый 13.01.2011, 16:01   #6
.pixel
c++, dx/ogl
Форумчанин
 
Аватар для .pixel
 
Регистрация: 10.11.2008
Сообщений: 131
По умолчанию

Цитата:
Как понять затенение?


Стороны кубиков на представленном изображении имеют разное «затенение»( Shading)» в зависимости от угла нормали к источнику света.

Я честно говоря вообще не пойму чего вы хотели в итоге добиться то?)

Цитата:
Еще не понятно, что делает фоновое освещение.
Почитайте "OpenGL супер книга" там достаточно просто и понятно написано про «Свет», «Свет»+ материалы, «Свет»+ материал текстура…
“Batch, Batch, Batch:” What Does It Really Mean?
I am a donut! Ask not how many tris/batch, but
rather how many batches/frame!

Последний раз редактировалось .pixel; 13.01.2011 в 16:07. Причина: время
.pixel вне форума Ответить с цитированием
Старый 13.01.2011, 16:38   #7
k3rn3l
Пользователь
 
Регистрация: 09.01.2011
Сообщений: 16
По умолчанию

Всё норм, надо было
Код:
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,GL_REPLACE);
поменять на

Код:
glTexEnvf(GL_TEXTURE_2D, GL_TEXTURE_ENV_MODE,GL_REPLACE);
Хотя можно было вообще без этой строчки обойтись)
k3rn3l вне форума Ответить с цитированием
Старый 13.01.2011, 21:34   #8
k3rn3l
Пользователь
 
Регистрация: 09.01.2011
Сообщений: 16
По умолчанию

Да, и еще один вопрос, не совсем по теме:
Как можно реализовать управление мышью как в игре? (желательно код)
k3rn3l вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблемы с С# PDV199003 Помощь студентам 0 04.06.2010 14:38
проблемы с if Vergil Общие вопросы C/C++ 8 21.04.2010 21:43
Проблемы с .exe Randjar Свободное общение 7 29.03.2009 10:26
проблемы с IE xakzona Помощь студентам 1 16.12.2008 21:53