B
BattleMage
доброго времени суток, посетители форума!)
если я не в том месте расположил данную тему, то просьба перенести в нужное место и уведовить меня по е-мейл, где я смогу смотреть ответы на мой пост) хотя вроде OpenGL как раз для раздела "Другие"
имеется шарик. большую часть кода взял из папки sample билдера. нажимаю на кнопки происходит попиксельное освещение объекта, удаляется, приближается источник света. цвет фиолетовый. хочу чтобы вместо этого фиолетового цвета на нём была, скажем, моя фотография формата bmp. это возможно? если да, то что лучше для этого сделать?
просьба писать код
листинг ниже:
[codebox]#include <vcl.h>
#pragma hdrstop
#include "draw.h"
//---------------------------------------------------------------------------
#pragma resource "*.dfm"
TOpenGL_Form *OpenGL_Form;
float x=3, y=3, z=3, zoom=1;
//---------------------------------------------------------------------------
__fastcall TOpenGL_Form::TOpenGL_Form(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TOpenGL_Form::Timer1Timer(TObject *Sender)
{
Timer1->Enabled = false;
DrawScene();
Yield();
Timer1->Enabled = true;
}
BOOL bSetupPixelFormat(HDC hdc)
{
PIXELFORMATDESCRIPTOR pfd, *ppfd;
int pixelformat;
ppfd = &pfd;
ppfd->nSize = sizeof(PIXELFORMATDESCRIPTOR);
ppfd->nVersion = 1;
ppfd->dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL |
PFD_DOUBLEBUFFER;
ppfd->dwLayerMask = PFD_MAIN_PLANE;
ppfd->iPixelType = PFD_TYPE_COLORINDEX;
ppfd->cColorBits = 8;
ppfd->cDepthBits = 16;
ppfd->cAccumBits = 0;
ppfd->cStencilBits = 0;
if ( (pixelformat = ChoosePixelFormat(hdc, ppfd)) == 0 )
{
MessageBox(NULL, "ChoosePixelFormat failed", "Error", MB_OK);
return FALSE;
}
if (SetPixelFormat(hdc, pixelformat, ppfd) == FALSE)
{
MessageBox(NULL, "SetPixelFormat failed", "Error", MB_OK);
return FALSE;
}
return TRUE;
}
void TOpenGL_Form:rawScene()
{
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glPushMatrix();
glTranslated(0.0, 0.0, -radius);
float mas[]={x,y,z,zoom};
GLUquadricObj* quadObj;
quadObj=gluNewQuadric();
glColor3d(1.0,0.0,1.0);
gluSphere(quadObj,1.0, 32, 32);
glEnable(GL_LIGHTING);//Включаем
glEnable(GL_LIGHT0);//свет
glLightfv(GL_LIGHT0, GL_POSITION, mas);
glEnable(GL_DEPTH_TEST);//Включаем буфер глубины
glEnable(GL_COLOR_MATERIAL);//Включаем учет цвета объекта
glPopMatrix();
SwapBuffers(ghDC);
}
GLvoid TOpenGL_Form::initializeGL(GLsizei width, GLsizei height)
{
GLfloat maxObjectSize, aspect;
GLdouble near_plane;
glClearIndex( (GLfloat)BLACK_INDEX);
glClearDepth( 1.0 );
glEnable(GL_DEPTH_TEST);
glMatrixMode( GL_PROJECTION );
aspect = (GLfloat) width / height;
gluPerspective( 45.0, aspect, 3.0, 7.0 );
glMatrixMode( GL_MODELVIEW );
near_plane = 3.0;
maxObjectSize = 3.0F;
radius = near_plane + maxObjectSize/2.0;
latitude = 0.0F;
longitude = 0.0F;
latinc = 6.0F;
longinc = 2.5F;
}
void __fastcall TOpenGL_Form::FormCreate(TObject *Sender)
{
ghDC = GetDC(Handle);
if (!bSetupPixelFormat(ghDC))
Close();
ghRC = wglCreateContext(ghDC);
wglMakeCurrent(ghDC, ghRC);
initializeGL(ClientRect.Right, ClientRect.Bottom);
}
void __fastcall TOpenGL_Form::FormClose(TObject *Sender, TCloseAction &Action)
{
Timer1->Enabled = false;
if (ghRC)
wglDeleteContext(ghRC);
if (ghDC)
ReleaseDC(Handle, ghDC);
}
void __fastcall TOpenGL_Form::FormKeyDown(TObject *Sender, WORD &Key,
TShiftState Shift)
{
if(Key==188) z--;
if(Key==190) z++;
if(Key==37) x--;
if(Key==39) x++;
if(Key==38) y++;
if(Key==40) y--;
DrawScene();
}[/codebox]
если я не в том месте расположил данную тему, то просьба перенести в нужное место и уведовить меня по е-мейл, где я смогу смотреть ответы на мой пост) хотя вроде OpenGL как раз для раздела "Другие"
имеется шарик. большую часть кода взял из папки sample билдера. нажимаю на кнопки происходит попиксельное освещение объекта, удаляется, приближается источник света. цвет фиолетовый. хочу чтобы вместо этого фиолетового цвета на нём была, скажем, моя фотография формата bmp. это возможно? если да, то что лучше для этого сделать?
просьба писать код
листинг ниже:
[codebox]#include <vcl.h>
#pragma hdrstop
#include "draw.h"
//---------------------------------------------------------------------------
#pragma resource "*.dfm"
TOpenGL_Form *OpenGL_Form;
float x=3, y=3, z=3, zoom=1;
//---------------------------------------------------------------------------
__fastcall TOpenGL_Form::TOpenGL_Form(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TOpenGL_Form::Timer1Timer(TObject *Sender)
{
Timer1->Enabled = false;
DrawScene();
Yield();
Timer1->Enabled = true;
}
BOOL bSetupPixelFormat(HDC hdc)
{
PIXELFORMATDESCRIPTOR pfd, *ppfd;
int pixelformat;
ppfd = &pfd;
ppfd->nSize = sizeof(PIXELFORMATDESCRIPTOR);
ppfd->nVersion = 1;
ppfd->dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL |
PFD_DOUBLEBUFFER;
ppfd->dwLayerMask = PFD_MAIN_PLANE;
ppfd->iPixelType = PFD_TYPE_COLORINDEX;
ppfd->cColorBits = 8;
ppfd->cDepthBits = 16;
ppfd->cAccumBits = 0;
ppfd->cStencilBits = 0;
if ( (pixelformat = ChoosePixelFormat(hdc, ppfd)) == 0 )
{
MessageBox(NULL, "ChoosePixelFormat failed", "Error", MB_OK);
return FALSE;
}
if (SetPixelFormat(hdc, pixelformat, ppfd) == FALSE)
{
MessageBox(NULL, "SetPixelFormat failed", "Error", MB_OK);
return FALSE;
}
return TRUE;
}
void TOpenGL_Form:rawScene()
{
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glPushMatrix();
glTranslated(0.0, 0.0, -radius);
float mas[]={x,y,z,zoom};
GLUquadricObj* quadObj;
quadObj=gluNewQuadric();
glColor3d(1.0,0.0,1.0);
gluSphere(quadObj,1.0, 32, 32);
glEnable(GL_LIGHTING);//Включаем
glEnable(GL_LIGHT0);//свет
glLightfv(GL_LIGHT0, GL_POSITION, mas);
glEnable(GL_DEPTH_TEST);//Включаем буфер глубины
glEnable(GL_COLOR_MATERIAL);//Включаем учет цвета объекта
glPopMatrix();
SwapBuffers(ghDC);
}
GLvoid TOpenGL_Form::initializeGL(GLsizei width, GLsizei height)
{
GLfloat maxObjectSize, aspect;
GLdouble near_plane;
glClearIndex( (GLfloat)BLACK_INDEX);
glClearDepth( 1.0 );
glEnable(GL_DEPTH_TEST);
glMatrixMode( GL_PROJECTION );
aspect = (GLfloat) width / height;
gluPerspective( 45.0, aspect, 3.0, 7.0 );
glMatrixMode( GL_MODELVIEW );
near_plane = 3.0;
maxObjectSize = 3.0F;
radius = near_plane + maxObjectSize/2.0;
latitude = 0.0F;
longitude = 0.0F;
latinc = 6.0F;
longinc = 2.5F;
}
void __fastcall TOpenGL_Form::FormCreate(TObject *Sender)
{
ghDC = GetDC(Handle);
if (!bSetupPixelFormat(ghDC))
Close();
ghRC = wglCreateContext(ghDC);
wglMakeCurrent(ghDC, ghRC);
initializeGL(ClientRect.Right, ClientRect.Bottom);
}
void __fastcall TOpenGL_Form::FormClose(TObject *Sender, TCloseAction &Action)
{
Timer1->Enabled = false;
if (ghRC)
wglDeleteContext(ghRC);
if (ghDC)
ReleaseDC(Handle, ghDC);
}
void __fastcall TOpenGL_Form::FormKeyDown(TObject *Sender, WORD &Key,
TShiftState Shift)
{
if(Key==188) z--;
if(Key==190) z++;
if(Key==37) x--;
if(Key==39) x++;
if(Key==38) y++;
if(Key==40) y--;
DrawScene();
}[/codebox]