//---------------------------------------------------------------------------
#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);
}
//---------------------------------------------------------------------------
OpenGL, метод Фонга.
Помогите пожалуйста.
У меня есть проект, который рисует трехмерный вращающийся шар в окне.
Мой вопрос: пожалуйста посмотрите проект и скажите освещается ли мой шар методом Фонга. Перелазел кучу книг и страниц в сети, так и не найдя ответ на свой вопрос: "Как реализовать метод Фонга в OpenGL или использовать его, уже реализованный самим OpenGL"
Текст файла main.cpp:
Код:
Текст файла 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
#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.
Заранее спасибо.
Цитата: RomB
Мой вопрос: пожалуйста посмотрите проект и скажите освещается ли мой шар методом Фонга.
Нет.
Цитата: RomB
...
Перелазел кучу книг и страниц в сети, так и не найдя ответ на свой вопрос: "Как реализовать метод Фонга в OpenGL или использовать его, уже реализованный самим OpenGL"...
Перелазел кучу книг и страниц в сети, так и не найдя ответ на свой вопрос: "Как реализовать метод Фонга в OpenGL или использовать его, уже реализованный самим OpenGL"...
Например, вот так.
Цитата: RomB
Компилятор: Borland C++ Builder 6.0.
Крайне неудачный выбор для такой темы.
Спасибо. Помогло. Единственное, с сайта ни чего не качается. Все время банят. Если можно, примерчик какой-нибудь.