Programación metafísica
1. Inicializar el entorno de dibujo OpenGL
1.1 define el formato de color y el modo de búfer.
OpenGL proporciona dos modos de color: modo RGB (RGBA) y modo de índice de color (paleta). En el modo RGBA, todas las definiciones de color están representadas por tres valores de RGB, a veces con la adición de un valor Alfa (que indica transparencia). Los valores de los tres componentes RGB están entre 0 y 1, y sus proporciones en el color final son proporcionales a sus valores. Por ejemplo, (1,1,0) representa el amarillo y (0,0,1) representa el azul. En el modo de índice de color, el color de cada píxel está representado por el valor del índice de color en la tabla de índice de color (similar a seleccionar un color de una paleta). Dado que el procesamiento de gráficos tridimensionales requiere flexibilidad de color y RGBA es superior al modo de índice de color en términos de sombras, iluminación, empañamiento, fusión, etc., el modo RGBA se usa a menudo en la programación.
OpenGL proporciona doble almacenamiento en búfer para dibujar imágenes. Es decir, mientras la imagen se muestra en la caché frontal, se dibuja una segunda imagen en la caché posterior. Cuando se completa el dibujo de fondo, se muestra la imagen en el búfer de fondo y el búfer de primer plano original comienza a dibujar la tercera imagen, y así sucesivamente, para mejorar la velocidad de salida de la imagen.
Establecer la función del modo de visualización de la ventana:
void auxInitDisplayMode(
AUX_DOUBLE | //Modo de doble búfer
AUX_RGBA // Modo de color RGBA
);
1.2 Configuración de la fuente de luz
Hay tres fuentes de luz en OpenGL: luz ambiental, que es la luz del entorno que no tiene puntos fijos. dirección. La luz difusa proviene de la misma dirección y cuando incide en la superficie de un objeto, irradia uniformemente en todas las direcciones del objeto. La luz reflejada especularmente proviene de la misma dirección y también se refleja en la misma dirección. La luz ambiental global es un tipo especial de luz ambiental que no proviene de una fuente de luz fija y generalmente se utiliza como fuente de luz natural de la escena.
Especifique la función de luz:
void glLightfv(
Luz Glenum, //Número de fuente de luz
Pname Glenum, //Indica el número de fuente de luz Tipo:
//GL_La luz difusa es luz difusa
//GL_La luz ambiental es luz ambiental
// GL_SPECULAR es la luz. fuente de luz
Puntero al vector de color
);
Establece la función de luz ambiental global:
void glLightModelfv(
GL_Light_Model_Environment,
Const Glfloat* param // param: puntero al vector de color
);
Activar función de fuente de luz:
void glen able(GL _ LIGHTING);
void glen able(GL _ enum cap); // cap: representa el número de fuente de luz.
1.3 Configuración de materiales
En OpenGL, el color de un material se define por la reflectividad del material a los tres colores primarios de la luz (rojo, verde y azul). De acuerdo con la fuente de luz, el color del material también se divide en color ambiental, color de reflexión difusa y color de reflexión especular, lo que determina la diferente reflectividad del material para diferentes luces.
Porque el color de un objeto que ve una persona es el color de la luz emitida por la fuente de luz que ingresa al ojo después de ser reflejada por el objeto. Por tanto, el color de un objeto es una combinación de la luz ambiental, los reflejos difusos y especulares de la fuente de luz, y el color ambiental, los reflejos difusos y especulares del material. Por ejemplo, cuando el color de la fuente de luz OpenGL es (LR, LG, LB) y el color del material es (MR, MG, MB), ignorando otros efectos de reflexión, el color final que ingresa al ojo es (LR*MR, LG* MG , libras*MB).
Función de definición de material:
void glMaterialfv(
GLenum face, //Indica en qué superficie se establece el color del material.
//Puede ser GL_FRONT, GL_BACK, GL_FRONT_AND_BACK.
GLenum pname, //Similar al parámetro pname de la fuente de luz
Const float* params //Vector de color que apunta al. material. p>
);
1.4 define el modo de proyección.
Es decir, elegir el ángulo y alcance del objeto de observación. Debido a que estamos dibujando en un espacio tridimensional, diferentes puntos de vista y rangos de observación producirán diferentes efectos de observación. Dado que las computadoras solo pueden mostrar gráficos bidimensionales, cuando se representan gráficos tridimensionales en el mundo real, la escena tridimensional debe convertirse en una escena bidimensional. Ésta es la clave para crear un efecto tridimensional. OpenGL proporciona dos métodos para convertir gráficos 3D en gráficos 2D. Proyección ortográfica y en perspectiva. Entre ellos, la proyección ortográfica significa que el tamaño del objeto proyectado no tiene nada que ver con la distancia desde el punto de vista y generalmente se usa en diseño CAD, mientras que la proyección en perspectiva está en línea con los hábitos psicológicos de las personas; Los objetos cercanos al punto de vista son grandes y los objetos alejados del punto de vista son pequeños. Además, el rango de proyección debe definirse en OpenGL. Solo los objetos dentro de este rango se proyectarán en la pantalla de la computadora y los objetos fuera del rango de proyección se cortarán.
Defina el rango de proyección (diferentes métodos de proyección corresponden a diferentes funciones):
GlOrtho no válido(
Doble izquierda, doble derecha,
//(Izquierda, Abajo, Cerca) y (Derecha, Arriba, Lejos) dan respectivamente las coordenadas de la proyección ortográfica
GLdoble fondo, GLdoble arriba, //la esquina inferior izquierda y la esquina superior derecha del rango de proyección de sombras.
GLdoble cerca, GL doble lejos
2.
2.1 Definir la posición de la ventana de dibujo
// (x, y) da las coordenadas de la esquina superior izquierda de la ventana.
// ancho y alto dan el ancho y alto de la ventana.
void auxInitPosition (flash x, flicker y, GLsizei width, GLsizei height
2.2 Definir el título de la ventana de dibujo
// STR representa el); cadena de caracteres del título de la ventana.
void auxInitWindow(GL byte * STR);
2.3 Definir la función de actualización de la ventana cuando cambia la ventana de dibujo.
//Llame a la función de devolución de llamada especificada cuando la ventana cambie de forma.
// NOMBRE representa el nombre de la función de devolución de llamada.
void auxReshapeFunc(name);
2.4 Definir la función de estado inactivo del estado inactivo para implementar la animación.
//Llame a la función de devolución de llamada especificada cuando el sistema esté inactivo.
// NOMBRE representa el nombre de la función de devolución de llamada.
void auxIdleFunc(name);
2.5 Definir la función de dibujo de escena (llamada cuando la ventana se actualiza o la escena cambia)
//Cuando la ventana necesita actualizarse o la escena cambia. Se llama cuando se produce un cambio.
// NOMBRE representa el nombre de la función de devolución de llamada.
void auxMainLoop(name);
Después de escribir el siguiente código en el editor VC, guárdelo como un archivo C con el sufijo. cpp. Inicie la compilación en "El comando de compilación requiere un entorno de trabajo de proyecto activo". "¿Quiere crear un entorno de trabajo de proyecto predeterminado"? Cuando se le solicite, seleccione Sí (Y). Ingrese al menú "Proyecto", seleccione el elemento "Configuración" y aparecerá el cuadro de diálogo "Configuración del proyecto". Seleccione el elemento "Enlace" y agregue la biblioteca de funciones proporcionada por OpenGL en la columna "Libaray": "opengl32.lib glu32.lib glaux.lib". (Nota: al ejecutar el programa, las bibliotecas de enlaces dinámicos opengl32.dll y glu32.dll deben incluirse en el directorio del sistema de Windows).
Código fuente adjunto:
#Include "windows.h"
#Include " gl/gl.h "
#Include " gl/glaux.h "
#Contiene "gl/glu.h"
#Contiene "math.h"
void myinit()
{
glClearColor(1,1,0,0);
GLfloat ambient[]={.5,.5,.5,0};
glLightModelfv (GL _ LIGERO _ MODELO _ AMBIENTE, AMBIENTE);
GLfloat mat_ambient[]={.8, .8, .8, 1.0};
GLfloat mat_diffuse[]={ .8, . 0, . 8, 1.0 };
Alfombrilla flotante GL _ especular[]= { 1.0, .0, 1.0 };
Alfombrilla flotante GL _ brillo []= {50.0};
GLfloat light_diffuse[]={0, 0, 5, 1};
GLfloat light_position[]={0, 0, 1.0, 0 };
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, mat_AMBIENT);
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mat_DIFFUSE);
glMaterialfv); (GL_FRONT_AND_BACK, GL_shinning ity, mat_shininess
glLightfv(GL_LIGHT0, GL_DIFFUSE, light_DIFFUSE);
glLightfv(GL_LIGHT0, GL_POSITION, light _ POSITION);
glen able (GL _ ILUMINACIÓN);
glen able(GL _ luz 0);
glDepthFunc (GL _ MENOS
glen able(GL _ PROFUNDIDAD _); PRUEBA);
}
visualización de devolución de llamada nula()
{
GL clear(GL _ COLOR _ BUFFER _ BIT | GL _ DEPTH _ BUFFER _ BIT);
aux solid essence(1.0); //Dibuja una esfera sólida con radio 1.0.
GL flush(); //Forzar salida de imagen
auxSwapBuffers(); //Intercambiar el buffer de dibujo
_ sleep(100);
}
devolución de llamada nula Idledisplay()
{
// x, y satisface x2 y2=0.01. Esto permite que el objeto se mueva a lo largo de una trayectoria circular.
Flotador estático x=-.1, y=0.0
Indicador booleano estático = TRUE
Paso flotante estático=.01;
x = tamaño del paso;
if(x lt; = . 1 amp; ampx gt=-.1)
{
if (paso gt0)
y = sqrt(. 01-x * x);
Otros
y =-sqrt(. 01-x * x);
glTranslatef(x, y, 0);
}
Otros
{
paso = 0- paso;
}
Display();
}
devolución de llamada nula myReshape(GLsizei w, GLsizei h)
{
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glload identidad();
glMatrixMode(GL_PROJECTION);
glload identidad();
p>
Si (w lt=h)
glOrtho(-3.5, 3.5 , -3.5*(GLfloat)w/(GLfloat)h, 3.5*(GLfloat)w/(GLfloat)h , -10, 10);
Otros
glOrtho(- 3.5*(GLfloat)w/(GLfloat)h, 3.5 *(GL float)w/(GL float)h , -3.5, 3.5, -10, 10);
glMatrixMode(GL_model view);
glload identidad();
}
void main()
{
auxInitDisplayMode(AUX _ DOBLE | AUX _ RGBA);
auxInitPosition(0, 0, 400, 400 );
auxInitWindow(" círculo ");
myinit();
auxReshapeFunc(myReshape);
auxiidlefunc(pantalla inactiva);
auxMainLoop(pantalla);
}
Proporcionarle un sitio web sobre VC y OPENGL, lo cual es bueno.
402/2084902.shtml