栏目:网上股票配资开户  作者:767股票学习网  更新:2026-06-03  阅读:13

<怎么买股票>三角形纹理插值:用OpenGL加速虚拟视点合成

转载请说明:

需求

在2转8路或者4转64路虚拟视点合成的项目中,需要根据真实相机的真实视点合成虚拟位置(虚拟相机)的虚拟视点。最后一步的绘制过程大致如下:

其实就是将图像以三角形为单位,从原始图像(左侧)向目标图像(右侧)映射,也即warp。本质是仿射变换的过程。

怎么用实现上述过程?

的贴图渲染会基于GPU使用进行三角形纹理插值:用OpenGL加速虚拟视点合成,效率较高,对于加速来说比较合适,贴图渲染也是较为核心的功能。下面进行大致的介绍:

常见的渲染一般会分为两种:(1)渲染至窗口(2)离屏渲染

#include        // 必须在glut.h之前include
//
#include 
#include 
#include 
#include 

void initOpenGL(int argc, char* argv[])
{
	// GLUT 初始化
	glutInit(&argc, argv);
	
	glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);        // 双缓冲
	glutInitWindowPosition(0, 0); 
	glutInitWindowSize(640, 480);
	glutCreateWindow("X-project");
	glEnable(GL_TEXTURE_2D);
	int texture_ID;
	glGenTextures(1, &texture_ID);  // 分配一个新的纹理编号
	if (texture_ID == 0) {
		return;
	}
	glBindTexture(GL_TEXTURE_2D, texture_ID);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);		    // 双线性插值
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);		// 对应原图像中超出边缘的像素按照边界扩展(黑边)
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
	glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
	float border_color[4] = { 1.0f, 1.0f, 1.0f, 1.0f };
	glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, border_color);
	
	return ;
}

三角形纹理插值_OpenGL三角形映射_OpenGL虚拟视点合成

需要说明的是三角形纹理插值:用OpenGL加速虚拟视点合成,如果我们没有指定渲染的缓冲区三角形纹理插值三角形纹理插值,默认的渲染缓冲区是窗口绑定的Frame 。整个流程简单来说如下图所示:

OpenGL虚拟视点合成_三角形纹理插值_OpenGL三角形映射

// 开始绑定
glBegin(GL_TRIANGLES);          // 指定映射方法:三角形或者矩形
... // 设置原图像和贴图之后的目标图像对应的顶点
glEnd();

设置原图像和贴图之后的目标图像对应的顶点 这句话的意思是什么呢?需要知道 -> 之间的映射关系,才能进行“贴图”操作,有下面几种常见映射方法:

矩形映射

首先将映射方式设置为:,之后可以直接设置当前图像和目标图像的四个图像顶点三角形纹理插值三角形纹理插值:用OpenGL加速虚拟视点合成,即依次矩形映射即可完成贴图过程,我们也可以设置多组小矩形之间的映射类似于下图。

三角形映射

如果将映射方式设置为:,之后可以直接设置当前图像和目标图像按照三角形换分之后的顶点,如下图所示:

三角形纹理插值_OpenGL三角形映射_OpenGL虚拟视点合成

给一个例子:

// 开始绑定
glBegin(GL_TRIANGLES);
// 上三角
glTexCoord2d(u1_up, v1_up);		// src
glVertex3d(x1_up, y1_up, 1);	// dst
glTexCoord2d(u2_up, v2_up);
glVertex3d(x2_up, y2_up, 1);
glTexCoord2d(u3_up, v3_up);
glVertex3d(x3_up, y3_up, 1);
glEnd();

三角形纹理插值_OpenGL三角形映射_OpenGL虚拟视点合成

函数(纹理坐标,即原图像坐标)用于设置图像的三角形顶点,三组(x, y);

函数(顶点坐标,目标图像坐标)用于设置图像的三角形顶点,三组(x, y, 1),第三个参数表示法向量,2D设置为1即可。

性能优化(异步操作)

针对上述离屏渲染过程进行性能分析,发现数据量大的时候,渲染过程和GPU->CPU的数据传输过程(函数)都会有较大的耗时,可以采取的解决方案是渲染过程和数据处理过程采用异步处理,查阅相关资料发现函数本身不支持异步操作,但是我们通过采用PBO可以实现类似的异步操作。下面简单介绍:

关于如何将渲染的图片保存到本地,见链接

Tags: