解码视频流在opengl中的贴图投影计算

解码视频流在opengl中的贴图投影计算

我们把视频当成纹理,首先要确定贴入的坐标,原始坐标如下所示


static float vertices[] = {
	//     ---- 位置 ----       ---- 颜色 ----     - 纹理坐标 -
		 1.0f,  1.0f, 0.0f,   1.0f, 0.0f, 0.0f,   1.0f, 1.0f,   // 右上
		 1.0f, -1.0f, 0.0f,   0.0f, 1.0f, 0.0f,   1.0f, 0.0f,   // 右下
		-1.0f, -1.0f, 0.0f,   0.0f, 0.0f, 1.0f,   0.0f, 0.0f,   // 左下
		-1.0f,  1.0f, 0.0f,   1.0f, 1.0f, 0.0f,   0.0f, 1.0f   // 左上
};

实际上我们要确定的是opengl的投影视窗,视窗大小就是位置,相当于把解码图像放到窗口中的什么位置,这里并不是纹理位置,纹理位置是具体取到那一块的纹理,涉及到放大缩小,我们写一个顶点着色器,如下所示

#version 330 core
layout(location = 0) in vec3 aPos;				   
layout(location = 1) in vec3 aColor;
layout(location = 2) in vec2 aTexCoord;

out vec4 vertexColor;
out vec2 TexCoord;
void main(){
    vec3 pos;
	gl_Position = vec4(aPos, 1.0);
	vertexColor = vec4(aColor, 1.0);
	TexCoord = aTexCoord;
	//TexCoord1 = aTexCoord1;
}

没有任何约束,放出来的贴图会随着窗口的变化而变化,问题是不成比例,视频展现失比例拉伸,对展现并不友好。我们要使用向量的运算来修改投影视窗
在这里插入图片描述

修改顶点着色器

当然就是使用uniform来做这个事情,窗口事件宽高改变

#version 330 core
layout(location = 0) in vec3 aPos;				   
layout(location = 1) in vec3 aColor;
layout(location = 2) in vec2 aTexCoord;

out vec4 vertexColor;
out vec2 TexCoord;

//out vec2 TexCoord1;
uniform float v_scalex;
uniform float v_scaley;

void main(){
    vec3 pos;
	pos = aPos * vec3(v_scalex,v_scaley,1);
    //pos.x = aPos.x * v_scalex;
	//pos.y = aPos.y * v_scaley;
	//pos.z = aPos.z;
	gl_Position = vec4(pos, 1.0);
	vertexColor = vec4(aColor, 1.0);
	TexCoord = aTexCoord;
	//TexCoord1 = aTexCoord1;
}

其中,直接运算

pos.x = aPos.x * v_scalex;
pos.y = aPos.y * v_scaley;
pos.z = aPos.z;

也是可以的,不过更为直接的计算是向量积,和矩阵运算不同,向量积是对应的x,y,z 直接运算,不要把它当成直接的矩阵运算。

cpp 文件

窗口事件:

void windowResize_callback(GLFWwindow* window, int width, int height)
{
	//printf("windowResize_callback\n");
	c_data::Instance().func_calc_scale_vertex(width, height);
}

再使用glUniform1f 改变x 和 y的投影比例

glUniform1f(glGetUniformLocation(myShader.ID, "v_scalex"), c_data::Instance().vetex_scale_x); 
glUniform1f(glGetUniformLocation(myShader.ID, "v_scaley"), c_data::Instance().vetex_scale_y);  

我们会看到正确的投影视口,与图像成正比,如下所示
在这里插入图片描述

放大缩小

放大和缩小又是改变纹理坐标,和视口投影不是一回事,并且涉及到更多的计算,下次再聊。

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qianbo_insist

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值