分别将画面渲染到屏幕的左上,坐下,右上,右下区域 效果图:
多屏渲染效果图:
原理见代码注释
#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[] =