Cita:
|
Empezado por Majo
Hola amigos,
quisiera saber si "CreateRenderingContext" es una funcion del API de windows o de OpenGL, y lo mas importante... para que sirve?. Esta funcion la encontré en un código fuente que me descargue... y el programa no corre ya que no conoce esa función..
Gracias...
|
Tengo exáctamente tu mismo problema, ¿lo solucionaste?. Voy a poner aquí el código que me falla (supuestamente no debería fallar).
Código:
unit Unit1;
interface
uses
Windows, Forms, OpenGL, Classes, ExtCtrls, Messages, Controls, StdCtrls,
Graphics, SysUtils, Dialogs;
type
TForm1 = class(TForm)
Timer1: TTimer;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormPaint(Sender: TObject);
procedure FormResize(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
procedure WMEraseBkgnd(var Message: TWMEraseBkgnd); message WM_ERASEBKGND;
public
{ Public declarations }
end;
var
Form1: TForm1;
RC: HGLRC;
Angulo: GLInt;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
begin
RC := CreateRenderingContext(canvas.Handle,[opDoubleBuffered],32,0); //Primero Creamos un contexto...
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
DestroyRenderingContext(RC); //Se libera el Contexto...
end;
procedure TForm1.FormPaint(Sender: TObject);
Var X,Y,Z:GLInt;
begin
ActivateRenderingContext(canvas.Handle,RC); // Se asocia el contexto con el manejador del Canvas...
glClearColor(0,0.2,0,0); // Ponemos un color Verde Oscuro de Fondo...
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); // Algo así como borrar la Pizarra...
glMatrixMode(GL_MODELVIEW);
glLoadIdentity;
gluLookAt(0,0,3,0,0,0,0,1,0); // Posición y punto de vista de la cámara...
glRotatef(30,1,0,0); //Primero hacemos una rotación de 30 grados respecto a X para obtener perspectiva...
glRotatef(Angulo,0,1,0); //Se Rota la figura en el eje Y a partir de la variable Angulo...
GLPointSize(2.0); //Asignamos un tamaño de 2 pixeles para cada punto...
//Ahora con tres ciclos anidados dibujamos un cubo con puntos de colores variados...
GLBegin(GL_POINTS);
For x := -5 to 5 do
for y := -5 to 5 do
for z := -5 to 5 do
begin
GLColor3f(X,Y,Z);
GLVertex3f(X/10,Y/10,Z/10);
end;
GLEnd;
SwapBuffers(canvas.Handle); //Copiar el Back Buffer en el canvas del formulario...
DeactivateRenderingContext; //Libera el contexto...
end;
procedure TForm1.FormResize(Sender: TObject);
begin // Cuando se cambia de tamaño hay que actualizar el puerto de visión...
wglMakeCurrent(canvas.handle,RC); // Otra manera de hacer el contexto dibujable cuando este ya está creado...
glViewport(0,0,Width,Height); // Especificar un puerto de visión....
glMatrixMode(GL_PROJECTION); // Activar matriz de proyección...
glLoadIdentity; // Poner estado inicial en esta matriz...
gluPerspective(35,Width/Height,1,100); // Especificar Perspectiva ...
wglMakeCurrent(0,0); // Otra manera de liberar el contexto...
Refresh; // Redibujar la escena ...
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Inc(Angulo,4); //Rotamos el angulo de observación de la escena...
Angulo := Angulo mod 360;
Refresh; //y la volvemos a dibujar ...
end;
procedure TForm1.WMEraseBkgnd(var Message: TWMEraseBkgnd);
begin //Para borrar el fondo, y evitar el parpadeo ...
Message.Result:=1;
end;
end.
Un saludo.
EDITADO: He estado trasteando un poco y el error es debido a que la unidad OpenGL.pas que usamos (la que viene con el propio Delphi) es antigua, hay que descargarse una versión que se adapte al programa.
Me he bajado esta versión
http://www.inf.tu-dresden.de/content...L/OpenGL12.zip
En esta versión si que se encuentra la función CreateRenderingContext pero recibe más parámetros que los que el programa hace uso, seguiré investigando y ya os contaré, si alguien sabe que versión de OpenGL.pas es la adecuada que por favor nos lo diga pues estamos aprendiendo y sería una pena pararse aquí, un saludo.