GLuint texture;
glGenTextures(1, &texture); // 生成纹理对象
glBindTexture(GL_TEXTURE_2D, texture); // 绑定为2D纹理
// 设置纹理参数
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
// 加载纹理数据(假设 imageData 已加载图片)
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0,
GL_RGB, GL_UNSIGNED_BYTE, imageData);
glGenerateMipmap(GL_TEXTURE_2D); // 自动生成 mipmap
// 使用纹理坐标(在绘制图元时)
glEnable(GL_TEXTURE_2D);
glBegin(GL_QUADS);
glTexCoord2f(0.0, 0.0); glVertex3f(...);
glTexCoord2f(1.0, 0.0); glVertex3f(...);
glTexCoord2f(1.0, 1.0); glVertex3f(...);
glTexCoord2f(0.0, 1.0); glVertex3f(...);
glEnd();
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(left, right, bottom, top, nearVal, farVal);
示例:
glOrtho(-1, 1, -1, 1, 1, 10); // 正交视见体,深度区间 [1, 10]
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(fovy, aspect, zNear, zFar);
示例:
gluPerspective(60.0, 1.0, 1.0, 100.0); // fovy=60°, 近1远100
glViewport(x, y, width, height);
例如:
glViewport(0, 0, 800, 600); // 将 NDC 区域 [-1,1] 映射到窗口像素
OpenGL 中常用 gluLookAt
定义相机,或使用 glTranslatef/glRotatef/glScalef
。
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(eyeX, eyeY, eyeZ,
centerX, centerY, centerZ,
upX, upY, upZ);
例如:
gluLookAt(0.0, 0.0, 5.0,
0.0, 0.0, 0.0,
0.0, 1.0, 0.0); // 相机看向原点,Y 轴为上
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(tx, ty, tz); // 平移
glRotatef(angle, x, y, z); // 旋转(角度制)
glScalef(sx, sy, sz); // 缩放
glEnable(GL_DEPTH_TEST); // 开启深度测试
glDepthFunc(GL_LESS); // 默认:较小的深度值覆盖
// 初始化窗口时设置深度缓冲
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
你还需要在窗口初始化时要求深度缓冲:
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
void display() {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// 绘制命令
...
glutSwapBuffers(); // 显示结果
}
glEnable(GL_CULL_FACE)
glCullFace(GL_BACK)
NURBS(Non-Uniform Rational B-Splines)非均匀有理B样条
一种非常强大的数学曲线/曲面表示方法,可以同时表示:
NURBS曲线由以下几个要素定义:
控制点(Control Points):一系列的点,用来影响曲线的形状,但通常不位于曲线上。
节点向量(Knot Vector):一个非减序列,定义了曲线段之间的连接方式。
权重(Weights):与每个控制点关联的实数,影响曲线与控制点的接近程度。
度数(Degree):一个整数,表示曲线的平滑度。
NURBS曲线的数学表达式为:
C ( u ) = ∑ i = 0 n w i P i N i , k ( u ) ∑ i = 0 n w i N i , k ( u ) C(u)=\frac{\sum_{i=0}^n w_i P_i N_{i, k}(u)}{\sum_{i=0}^n w_i N_{i, k}(u)} C(u)=∑i=0nwiNi,k(u)∑i=0nwiPiNi,k(u)
其中:
Parametric(参数化)建模
表示形状为参数 u , v u, ~ v u, v 的函数形式:
2D图像和3D模型(3D模型由顶点、边和面(通常是三角形)组成)
**物理成像系统:**相机,显微镜,望远镜,人类视觉系统等
**图像形成的元素:**物体,观察者,光源,材质属性
**光线追踪:**通过追踪从光源发出的光线,计算哪些光线进入相机镜头来形成图像。光线可能与物体多次交互(如反射、折射),最终被吸收或射向无穷远。
RGB理论,加色法和减色法
合成相机模型(Synthetic Camera Model)
基本输入设备:
物理设备(Physical Devices):实际的硬件设备。鼠标,键盘,轨迹球
逻辑设备(Logical Devices):通过API定义的设备。
输入模式(Input Modes):输入的获取方式和时机。
图形系统交互
事件驱动输入
光线追踪和辐射度方法等物理方法虽然在生成高质量图像方面表现出色,但由于计算复杂度高,不适合实时应用。实用方法通过顺序处理和图形管道架构,利用局部光照模型和硬件加速,实现了高效的实时渲染。
光线追踪(Ray Tracing)
辐射度(Radiosity)
顺序处理(Process objects one at a time)
图形管道(Pipeline architecture)
图形流水线中的关键概念
顶点处理(Vertex Processing)
顶点处理是图形流水线的第一步,主要任务是将顶点从一个坐标系统转换到另一个坐标系统。这涉及到以下步骤:
投影(Projection)
投影是将3D场景转换为2D图像的过程,主要分为两种类型:
图元组装(Primitive Assembly)
图元组装是将顶点组合成几何对象的过程,为后续的裁剪和光栅化做准备。常见的几何对象包括:
裁剪(Clipping)
裁剪是移除不在视锥体内的物体的过程,类似于真实相机的视野限制。视锥体外的物体被裁剪掉,不在渲染范围内。
光栅化(Rasterization)
光栅化是将三角形转换为片段(Fragments)的过程,每个片段对应一个像素。主要步骤包括:
片段处理(Fragment Processing)
片段处理是确定片段颜色的过程,主要任务包括:
API(应用程序编程接口)
API是程序员与图形系统交互的接口,提供了以下功能:
对象规范(Object Specification)
API支持多种几何图元,包括:
相机规范(Camera Specification)
相机规范包括以下参数:
光源和材质(Lights and Materials)
ep:
glBegin(GL_POLYGON)
glVertex3f(0.0, 0.0, 0.0);
glVertex3f(0.0, 1.0, 0.0);
glVertex3f(0.0, 0.0, 1.0);
glEnd( );
图元是图形渲染的基本单元,OpenGL 支持以下类型:
相机(或观察者)决定了场景如何被渲染到屏幕上,其属性包括:
OpenGL 的函数类型:
函数分为两类:
OpenGL 的图形渲染管线:
GLFW 的事件驱动模型: