您现在的位置是:首页 > 正文

OpenGL | 设置视口glViewport &裁剪glScissor & 屏幕截图 glReadPixel

2024-01-30 21:41:18阅读 0

一、设置视口

1.视口

        视口(Viewport):指的是OpenGL用于渲染的输出区域,它是窗口中的一个矩形区域。在渲染过程中,OpenGL会将图形投影到视口中,以生成最终的图像。视口通常可以通过glViewport函数进行设置,它的坐标系统是以视口左下角为原点,横向向右为正方向,纵向向上为正方向的笛卡尔坐标系。

2.glViewport

void WINAPI glViewport(
   GLint   x,
   GLint   y,
   GLsizei width,
   GLsizei height
);
  • x,y 以像素为单位,指定了视口的左下角位置。
  • width,height 表示这个视口矩形的宽度和高度,根据窗口的实时变化重绘窗口。

        在默认情况下,视口被设置为占据打开窗口的整个像素矩形,窗口大小和设置视口大小相同,所以为了选择一个更小的绘图区域,就可以用glViewport函数来实现这一变换,在窗口中定义一个像素矩形,最终将图像映射到这个矩形中。例如可以对窗口区域进行划分,在同一个窗口中显示分割屏幕的效果,以显示多个视图。

二、裁剪

       glViewport用于设置视口的大小和位置,即指定可见区域在窗口中的位置和大小。它接受四个参数:x、y、width、height,分别表示视口在窗口中的左下角位置和宽度、高度。

      glScissor也可以用于设置可见区域,但它不是用来设置视口的大小和位置,而是用来限制OpenGL的绘制区域,只有位于指定矩形内的像素才会被保留,而位于矩形外的像素则会被丢弃。它接受四个参数:x、y、width、height,分别表示要裁剪的矩形区域在窗口中的左下角位置和宽度、高度。在默认情况下,裁剪测试是关闭的,需要通过调用glEnable(GL_SCISSOR_TEST)来启用它。

void Draw()
{
    glEnable(GL_SCISSOR_TEST); 
    glScissor( 0,0,400,300);  //裁剪
    //glDisable(GL_SCISSOR_TEST); // 禁用裁剪

    glClearColor(1, 1,0, 1.0f);  //黄色背景
    glClear(GL_COLOR_BUFFER_BIT);

    test.Draw();
}

三、屏幕截图 

        GPU渲染完数据在显存中,可以用glReadPixels函数读取数据到内存。

1.glReadPixels

void WINAPI glReadPixels(
   GLint   x,
   GLint   y,
   GLsizei width,
   GLsizei height,
   GLenum  format,
   GLenum  type,
   GLvoid  *pixels
);
  • x,y:指定从帧缓冲区读取的第一个像素的窗口坐标。 此位置是矩形像素块的左下角。
  • width,height:指定像素矩形的尺寸。 一个宽度和高度对应于单个像素。
  • format:指定像素数据的格式。 接受以下符号值:GL_ALPHA,GL_RGB和GL_RGBA。
  • type:指定像素数据的数据类型。 必须是GL_UNSIGNED_BYTE,GL_UNSIGNED_SHORT_5_6_5,GL_UNSIGNED_SHORT_4_4_4_4或GL_UNSIGNED_SHORT_5_5_5_1之一。
  • data:返回像素数据。

2.举个例子

	int width=300,height=300;
	unsigned char *screenData = new  unsigned char[width * height * 3];
    glReadPixels(0, 0, width, height, GL_RGB, GL_UNSIGNED_BYTE, screenData);

网站文章

  • 服务器厂家文档,服务器厂家

    服务器厂家文档,服务器厂家

    服务器厂家 内容精选换一换已在物联网平台注册的设备,若设备的唯一标识码发生变更(如更换设备等场景),第三方应用需要调用此接口在物联网平台更新设备的唯一标识,并重新绑定设备。仅当设备处于离线状态时,才能...

    2024-01-30 21:41:12
  • js中数组初始化为空

    js中数组初始化为空 工作中遇到个bug原因是因为数组清空的时机不对,我一开始以为那就是定义那个变量是数组类型,然后把将js的全局变量 var 变量; 改成了 var 变量 = []; 将下面的代码行 变量 = []; 给注释掉了 事实上,变量=[ ],这行代码的作用是将数组清空,明白了之后,问题就解决了 ...

    2024-01-30 21:40:42
  • 正则的贪婪和非贪婪模式

    贪婪匹配是指尽可能多地匹配字符,以满足整个正则表达式的匹配条件。它会尽量匹配更长的字符串,而不是满足最小的匹配要求。非贪婪匹配是指尽可能少地匹配字符,以满足整个正则表达式的匹配条件。它会尽量匹配更短的字符串,而不是尽可能多的匹配。在正则表达式中,贪婪(greedy)和非贪婪(non-greedy)指的是匹配操作的行为方式。

    2024-01-30 21:40:34
  • 附录7-用户列表案例,element-ui

    附录7-用户列表案例,element-ui

    pymysql一直开着会有一些问题,只能在每一次查询进行一次启停,每一个视图中写一遍就很麻烦,所以用到了请求钩子。main.js主要解决了三个问题。如果点击取消就会显示添加失败。点击取消会显示删除失败。点击确定会显示删除成功。

    2024-01-30 21:40:27
  • (Medium) Teemo Attacking - LeetCode

    Description:In LOL world, there is a hero called Teemo and his attacking can make his enemy Ashe be in poisoned condition. Now, given the Teemo's attacking ascending time series towards Ashe ...

    2024-01-30 21:39:59
  • SpringMVC中@ModelAttribute和@SessionAttributes注解的使用

    SpringMVC中@ModelAttribute和@SessionAttributes注解的使用

    1.@ModelAttribute注解的使用@ModelAttribute注解在两种地方可以使用从这里我们可以看到该注解可以用在参数上也可以用在方法体上。现在我们就来讲解这两种方式。方式一,该注解用在方法体上:在方法定义上使用 @ModelAttribute 注解:Spring MVC在调用目标处理方法前,会先逐个调用在方法级上标注了@ModelAttribute 的方...

    2024-01-30 21:39:52
  • linux基础命令-rm 最新发布

    在 Linux 操作系统中,rm 是一个强大的命令,用于删除文件和目录。它允许用户在文件系统中进行清理和维护操作,但同时也需要谨慎使用,因为删除的文件和目录不可恢复。在使用 rm 命令时,请注意核实您...

    2024-01-30 21:39:44
  • c++语言将字符串逆序输出,C++实现string类字符串单词的逆序输出

    c++语言将字符串逆序输出,C++实现string类字符串单词的逆序输出

    利用c++实现string类字符串单词的逆序输出,并改变源字符串的大小写。#include#include#includeusing namespace std;string StringReverseWord(string &s){int len = s.length();if (len == 0)//空字符串return s;int n = 0;while (s[n++] == ' '...

    2024-01-30 21:39:14
  • jep290涉及jdk版本_JDK 12 – JEP 325开关表达式

    jep290涉及jdk版本 JDK 12已于2019年3月19 日上线GA,继续致力于缩短发布周期和频繁发布。 该版本的功能部分可以在这里找到。 对于开发人员来说,有趣的功能之一是“ JEP 325开关表达式 ”,它可以作为预览功能使用。 此处定义的预览功能是: 预览语言或VM功能是Java SE平台的一项新功能,该功能已完全指定,完全实现但不是永久性的。 JDK功能发布中提供了该功能...

    2024-01-30 21:39:07
  • React 知识点整理

    React 知识点整理

    React 知识点整理

    2024-01-30 21:39:00