opengl将画面渲染到屏幕的指定区域和多屏渲染

本文介绍了如何使用OpenGL将画面渲染到屏幕的特定区域,包括左上、右上、左下、右下四个部分,并展示了多屏渲染的效果。通过创建FBO,绘制带光照效果的立方体并设置不同光源,然后切换shader在屏幕四个角落绘制四边形,将FBO内容作为纹理映射上去,实现了这一技术。
摘要由CSDN通过智能技术生成

分别将画面渲染到屏幕的左上,坐下,右上,右下区域   效果图:




多屏渲染效果图:


原理见代码注释


#include "FullScreenQuad.h"


void FullScreenQuad::Init()
{
	glGenBuffers(1, &mVBO);
	glBindBuffer(GL_ARRAY_BUFFER, mVBO);
	glBufferData(GL_ARRAY_BUFFER, sizeof(float) * 20, nullptr, GL_STATIC_DRAW);
	glBindBuffer(GL_ARRAY_BUFFER, 0);
}

//绘制一个铺满屏幕的四边形
void FullScreenQuad::Draw(GLint posLoc, GLint texcoordLoc)
{
	//draw fullscreen
	float vertices[] = {
		-0.5f,-0.5f,-1.0f,0.0f,0.0f,
		0.5f,-0.5f,-1.0f,1.0f,0.0f,
		0.5f,0.5f,-1.0f,1.0f,1.0f,
		-0.5f,0.5f,-1.0f,0.0f,1.0f
	};
	glBindBuffer(GL_ARRAY_BUFFER, mVBO);//绑定到vbo
	glBufferData(GL_ARRAY_BUFFER, sizeof(float) * 20, vertices, GL_STATIC_DRAW);//顶点数据上传至显卡
	glBindBuffer(GL_ARRAY_BUFFER, 0);

	glBindBuffer(GL_ARRAY_BUFFER, mVBO);
	glEnableVertexAttribArray(posLoc);//启用顶点坐标属性
	//指定顶点数据在VBO中的入口地址
	glVertexAttribPointer(posLoc, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 5, 0);
	glEnableVertexAttribArray(texcoordLoc);//启用顶点纹理坐标属性
	//指定顶点纹理坐标在VBO中的入口地址
	glVertexAttribPointer(texcoordLoc, 2, GL_FLOAT, GL_FALSE, sizeof(float) * 5, (void*)(sizeof(float)*3));
	glDrawArrays(GL_QUADS, 0, 4);
	glBindBuffer(GL_ARRAY_BUFFER, 0);
}


//绘制左上角四分之一的矩形 
void FullScreenQuad::DrawToLeftTop(GLint posLoc, GLint texcoordLoc)
{
	 
	float vertices[] = {
		-0.5f,0.0f,-1.0f,0.0f,0.0f,
		0.0f,0.0f,-1.0f,1.0f,0.0f,
		0.0f,0.5f,-1.0f,1.0f,1.0f,
		-0.5f,0.5f,-1.0f,0.0f,1.0f
	};
	glBindBuffer(GL_ARRAY_BUFFER, mVBO);
	glBufferData(GL_ARRAY_BUFFER, sizeof(float) * 20, vertices, GL_STATIC_DRAW);
	glBindBuffer(GL_ARRAY_BUFFER, 0);

	glBindBuffer(GL_ARRAY_BUFFER, mVBO);
	glEnableVertexAttribArray(posLoc);
	glVertexAttribPointer(posLoc, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 5, 0);

	glEnableVertexAttribArray(texcoordLoc);
	glVertexAttribPointer(texcoordLoc, 2, GL_FLOAT, GL_FALSE, sizeof(float) * 5, (void*)(sizeof(float) * 3));
	glDrawArrays(GL_QUADS, 0, 4);
	glBindBuffer(GL_ARRAY_BUFFER, 0);
}


//绘制左下角四分之的矩形
void FullScreenQuad::DrawToLeftBottom(GLint posLoc, GLint texcoordLoc)
{
	
	float vertices[] = 
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值