PDA

Ver la Versión Completa : CreateRenderingContext


Majo
12-07-2003, 16:41:50
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...

delphi.com.ar
14-07-2003, 18:25:02
Efectivamente es una función de OpelGL, te recomiendo buscar en la Web que seguramente encontrarás documentación de la misma.

Saludos!

kakarotv5
20-02-2007, 01:26:31
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).

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/institutes/smt/cg/publications/books/OpenGL-Programme/OPENGL/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.

kakarotv5
20-02-2007, 03:05:42
Efectivamente es una función de OpelGL, te recomiendo buscar en la Web que seguramente encontrarás documentación de la misma.

Saludos!

¿Cuándo dices Web te refieres a http://www.clubdelphi.com o te refieres a que tiremos de Google. Gracias y un saludo.

EDITO: Ya he conseguido la unit OpenGL.pas que necesitaba, la he conseguido aquí (http://www.grupoalbor.com/descarga/articulos/opengl/opengl_p.zip), bajaros el archivo comprimido y luego la unit OpenGL.pas se encuentra en el archivo comprimido OpenGL1.zip (también se encuentra en algunos otros). De todos modos me ha dado un par de errores que he subsanado, os los pongo aquí a ver que os parecen:

La unidad OpenGL.pas tiene definidas dos constantes así:

const FirstContext : Boolean = True;
LastPixelFormat : Integer = 0;

El caso es que luego en el código de la unidad se hacen asignaciones a esas constantes por ejemplo:

...
FirstContext:=False;
...
FirstContext:=True;
...
LastPixelFormat:=PixelFormat;
...
LastPixelFormat:=0;
...

Y claro al intentar compilar me da el error de "Left side cannot be assigned to", esto está claro pues FirstContext y LastPixelFormat son constantes y no se puede hacer eso con ellas en tiempo de compilación, así que he comentado el código donde hay asignaciones, he compilado y los programas me funcionan. ¿A alguno más le ha pasado esto?. Gracias y un saludo.

EDITO: He arreglado la chapucilla esa de comentar lo que no funcionaba, lo he conseguido usado la directiva de compilación {$J+} para poder cambiar en tiempo de compilación el valor de las constantes tipadas, he de agradecer esto al forero seoane que me ha ayudado con esto. Saludos.

hernanpr
04-03-2010, 00:23:33
Yo me descargue el manual, intente probar el codigo, pero no funciono, debido a que la funcion no estaba declarada en OpenGL que viene con delphi.

Pues bien se me ocurrio buscar por aqui y por alla primero dentro del componente GLScene y luego la web, me di con este tema similar a lo mio. :rolleyes:

Finalmente se me ocurrio que debia ser la version del OpenGL (OpenGL12, OpenGLX) y Eureka !!!

El problema se arregla cambiando en units OpenGL por OpenGL2 y no hay que cambiar nada del codigo.:)