Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

OpenGL, метод Фонга.

26K
20 января 2009 года
RomB
7 / / 17.06.2007
Здравствуйте.
Помогите пожалуйста.

У меня есть проект, который рисует трехмерный вращающийся шар в окне.
Мой вопрос: пожалуйста посмотрите проект и скажите освещается ли мой шар методом Фонга. Перелазел кучу книг и страниц в сети, так и не найдя ответ на свой вопрос: "Как реализовать метод Фонга в OpenGL или использовать его, уже реализованный самим OpenGL"

Текст файла main.cpp:
Код:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "main.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
BOOL bSetupPixelFormat(HDC hdc)
{
    PIXELFORMATDESCRIPTOR pfd, *ppfd;
    int pixelformat;
 
    ppfd = &pfd;
 
    ppfd->nSize = sizeof(PIXELFORMATDESCRIPTOR);  // размер структуры
    ppfd->nVersion = 1; // номер версии
            // поддержка вывода в окно,  поддержка OpenGL,   двойная буферизация
    ppfd->dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
    ppfd->dwLayerMask = PFD_MAIN_PLANE;   // основной слой
    ppfd->iPixelType = PFD_TYPE_RGBA;     //цвета в режиме RGBA
    ppfd->cColorBits = 16;                // 16-ти разрядный буфер цвета
    ppfd->cDepthBits = 16;                // 16-ти разрядный буфер глубины

    ppfd->cAccumBits = 0;                 // буфер аккумулятора не используется
    ppfd->cStencilBits = 0;               // буфер трафарета не используется

    // Поддерживает ли система необходимый формат пикселей?
    if ((pixelformat = ChoosePixelFormat(hdc, ppfd)) == 0) /*проверяем совместимость
                     формата пикселей и контекста воспроизведения устройства */
    {
        MessageBox(NULL, "С заданным форматом пикселей работать нельзя", "Error", MB_OK);
        return FALSE;
    }
    if (SetPixelFormat(hdc, pixelformat, ppfd) == FALSE)  /*устанавливаем формат
                     пикселей в контекст при условии совместимости  формата и устройства */
    {
        MessageBox(NULL, "С заданным форматом пикселей работать нельзя", "Error", MB_OK);
        return FALSE;
    }
    return TRUE;
}
//-----------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
   ghDC = GetDC(Handle); //находим дискриптор контекста воспроизведения устройства

   if (!bSetupPixelFormat(ghDC)) //устанавливаем формат пикселей в дискриптор
      Close();

   ghRC = wglCreateContext(ghDC); //создание нового контекста воспроизведения для устройства имеющего указанный дискриптор
   wglMakeCurrent(ghDC, ghRC); // установка единственного текущего контекста воспроизведения потока

   glClearColor(0.0, 0.0, 0.0, 0.0); //цвет фона здесь - черный

   FormResize(Sender);

   glEnable(GL_COLOR_MATERIAL);
   glEnable(GL_DEPTH_TEST);   //глубина

   glEnable(GL_LIGHTING);
   glEnable(GL_LIGHT0);
     float p[4]={3,3,3,1},
           d[3]={-1,-1,-3};
   glLightfv(GL_LIGHT0,GL_POSITION,p);
   glLightfv(GL_LIGHT0,GL_SPOT_DIRECTION,d);

   GLfloat white_light[]  = {  1.0,   1.0,   1.0,   1.0 };
   GLfloat lmodel_ambient[]  = { 0.1,  0.1,  0.1,   1.0 };
   glLightfv(GL_LIGHT0,   GL_DIFFUSE,   white_light);
   glLightfv(GL_LIGHT0,   GL_SPECULAR,   white_light);
   glLightModelfv(GL_LIGHT_MODEL_AMBIENT,   lmodel_ambient);

   GLfloat mat_specular[]  = {  1.0,   1.0,   1.0,   1.0 };
   GLfloat mat_shininess[]   =  {  50.0  };
   glMaterialfv(GL_FRONT,  GL_SPECULAR,  mat_specular);
   glMaterialfv(GL_FRONT,  GL_SHININESS,  mat_shininess);

   glShadeModel (GL_SMOOTH);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormResize(TObject *Sender)
{
   glEnable(GL_NORMALIZE);
   glViewport( 0, 0, Width, Height );
   glMatrixMode( GL_PROJECTION );
   glLoadIdentity();
   glOrtho(-5,5, -5,5, 2,12);
   gluLookAt(0,0,5, 0,0,0, 0,1,0);
   glMatrixMode( GL_MODELVIEW );
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
if(ghRC)
  {
    wglMakeCurrent(ghDC,0); // установить контекст
    wglDeleteContext(ghRC); //удаляем контекст воспроизведения, освобождая память;
  }
  if(ghDC)
    ReleaseDC(Handle, ghDC);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
Timer1->Enabled = true;
      Draw();
}
//---------------------------------------------------------------------------
void TForm1::Draw()
{
   glEnable(GL_NORMALIZE);

             //буфер глубины         буфер цвета
   glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
   //glTranslatef(0.1,0.0,0.0);

   GLUquadricObj *quadObj;
   quadObj=gluNewQuadric();

   gluQuadricDrawStyle(quadObj, GLU_FILL);
   glColor3f(0,1,0);
   gluSphere(quadObj, 2,30,30);
   glRotatef(3, 0,1,0);
   gluDeleteQuadric(quadObj);
   SwapBuffers(ghDC);
}
//---------------------------------------------------------------------------


Текст файла main.h:
Код:
//---------------------------------------------------------------------------

#ifndef mainH
#define mainH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ExtCtrls.hpp>
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glaux.h>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:    // IDE-managed Components
   TTimer *Timer1;
   void __fastcall FormCreate(TObject *Sender);
   void __fastcall FormResize(TObject *Sender);
   void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
   void __fastcall Timer1Timer(TObject *Sender);
private:    // User declarations
   HGLRC ghRC;
   HDC   ghDC;
   void Draw();
public:     // User declarations
   __fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif


Компилятор: Borland C++ Builder 6.0.
Заранее спасибо.
9
20 января 2009 года
Lerkin
3.0K / / 25.03.2003
Цитата: RomB

Мой вопрос: пожалуйста посмотрите проект и скажите освещается ли мой шар методом Фонга.


Нет.

Цитата: RomB
...
Перелазел кучу книг и страниц в сети, так и не найдя ответ на свой вопрос: "Как реализовать метод Фонга в OpenGL или использовать его, уже реализованный самим OpenGL"...


Например, вот так.

Цитата: RomB

Компилятор: Borland C++ Builder 6.0.


Крайне неудачный выбор для такой темы.

26K
21 января 2009 года
RomB
7 / / 17.06.2007
Спасибо. Помогло. Единственное, с сайта ни чего не качается. Все время банят. Если можно, примерчик какой-нибудь.

Знаете кого-то, кто может ответить? Поделитесь с ним ссылкой.

Ваш ответ

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог