首页 > 系统相关 >漫谈C++内存和OpenGL各种缓冲对象(下)

漫谈C++内存和OpenGL各种缓冲对象(下)

时间:2023-01-02 15:56:24浏览次数:51  
标签:GLenum GLsizei OpenGL GLint 漫谈 C++ 纹理 缓冲 GL

OpenGL的纹理缓冲对象创建、释放、使用
        纹理用于给模型贴上颜色,类似于顶点缓冲也是GPU中的一块显存,用图片格式保存了CPU段传入的数据。纹理属性包括纹理大小、颜色通道个数(RGBA\RGB)。纹理宽度尽量遵守2的幂次方规律,这样从CPU中读取数据性能更好。纹理的使用流程:先创建纹理对象名称,绑定纹理后写入图片数据,然后激活纹理单元并绑定纹理,再定义纹理采样器对应的纹理单元。
  (1)void glGenTextures(GLsizei n, GLuint * textures);
         类似顶点缓冲,纹理对象也有创建、绑定、写入、部分写入、删除等API。此API命令GPU创建了一组纹理对象名称,n为纹理对象个数。
  (2)void glBindTexture(GLenum target, GLuint texture);
        命令GPU根据纹理对象名称申请一块缓冲或者绑定到已有的纹理缓冲对象,并将此纹理对象放入当前被使用的纹理单元中。输入参数target为纹理类型,GL_TEXTURE_2D和GL_TEXTURE_CUBE_MAP两种。texture为纹理对象名称。一个纹理对象可以放入多个纹理单元中,修改一个纹理对象会导致所有相关的纹理单元中纹理被修改。纹理单元可以让我们在shader中使用超过一个的纹理。
  (3)void glActiveTexture(GLenum texture);
        激活指定的纹理单元。输入参数texture为纹理单元,GL_TEXTUREi。
  (4)void glTexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid * data);
        写入CPU中图片数据到GPU纹理缓冲中。第一个参数指定了纹理目标(Target)。设置为GL_TEXTURE_2D意味着会生成与当前绑定的纹理对象在同一个目标上的纹理(任何绑定到GL_TEXTURE_1D和GL_TEXTURE_3D的纹理不会受到影响)。第二个参数为纹理指定多级渐远纹理的级别,如果你希望单独手动设置每个多级渐远纹理的级别的话。这里我们填0,也就是基本级别。第三个参数告诉OpenGL我们希望把纹理储存为何种格式。即在GPU中图片存储形式,主要指定几个通道。第四个和第五个参数设置最终的纹理的宽度和高度。下个参数应该总是被设为0(历史遗留的问题)。第七个参数定义了源图的格式,即源图几个通道,有GL_ALPHA(只有alpha通道), GL_LUMINANCE(只有luminance值), GL_LUMINANCE_ALPHA(只有luminance值和alpha值), GL_RGB, GL_RGBA。第八个参数定义了源图每个通道的数据类型BYTE,GL_UNSIGNED_BYTE, GL_UNSIGNED_SHORT_5_6_5, GL_UNSIGNED_SHORT_4_4_4_4, and GL_UNSIGNED_SHORT_5_5_5_1。最后一个参数是真正的图像数据,从CPU内存读数据时遵守glPixelStorei设置的对齐规则,第一个数据对应的是纹理中左下角那个顶点,一直到最后一个数据对应纹理右上角那个顶点。
           void glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid * data);
          写入CPU数据到GPU部分纹理缓冲中。输入参数中比较特殊的xoffset、yoffset为离起始点位置的偏移量。
  (5)void glCopyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
         复制GPU纹理缓冲数据到另外的缓冲中。输入参数中x、y表示从源目标左下角偏移x、y位置的地方开始拷贝高度height,宽度width的数据。
          void glCopyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
        复制部分GPU纹理缓冲到另外的缓冲中。输入参数中xoffset、yoffset表示从源缓冲左下角偏移x、y位置的地方开始拷贝高度height,宽度width的数据到离起始点xoffset、yoffset偏移量的目标缓冲中。
  (6)void glTexParameter*(GLenum target, GLenum pname, GLint param);
        定义纹理属性。输入参数中target指定纹理类型GL_TEXTURE_2D,pname指定修改参数GL_TEXTURE_MIN_FILTER(纹理缩小), GL_TEXTURE_MAG_FILTER(纹理放大), GL_TEXTURE_WRAP_S(纹理环绕方式), or GL_TEXTURE_WRAP_T。
纹理缩小和放大时,需要指定纹理映射算法。GL_NEAREST为直接去原始纹理限定区域中最接近的一个像素的信息作为映射点,效果比较失真但性能好。GL_LINEAR为根据原始纹理最接近的四个像素信息计算出来的加权平均值,作为映射点,效果有过渡性能差些。纹理环绕方式指实际纹理采样坐标超过了[0,1]范围,需要规定纹理外面怎么采样,通常有GL_CLAMP_TO_EDGE(以纹理的边界颜色填充), GL_REPEAT(重复纹理), 和 GL_MIRRORED_REPEAT(镜像重复)。
  (7)void glDeleteTextures(GLsizei n, const GLuint * textures);
        删除纹理。输入参数中n为要删除的纹理对象个数,textures为要删除的纹理对象名称。

标签:GLenum,GLsizei,OpenGL,GLint,漫谈,C++,纹理,缓冲,GL
From: https://www.cnblogs.com/wangxydela/p/17019999.html

相关文章

  • 一个 c++ 模板
    #include<cstring>#include<cmath>#include<algorithm>#include<iostream>usingnamespacestd;namespacemyio{ intread(){ intx=0;charch; while(!isdigit(......
  • C++ Style Guide
    CommonRulesThefollowingstyleguidelineswillbefollowedforbothSliceandC++code:C1.Bracesforcompoundstatementswillbeontheirownlines,atthesa......
  • C++笔记整理
    把自己印象笔记中所记录的一些C++知识点整合了一下,可用于面试前对C++知识的快速回顾。不过并不全,只是自己笔记中的摘要,重要的还是系统和踏实地学习。每个知识点不分顺序。1.......
  • C++ priority_queue使用方法
    以leetcode1081题为例,https://leetcode.cn/problems/number-of-orders-in-the-backlog/classSolution{public:intgetNumberOfBacklogOrders(vector<vector<int......
  • C/C++高级语言程序设计课程设计任务书[2022-01-02]
    C/C++高级语言程序设计课程设计任务书[2022-01-02]高级语言程序设计课程设计任务书课程设计名称 中文:高级语言程序设计课程设计英文:ComputerProgrammingBasicCompreh......
  • C/C++课程设计题目[2023-01-02]
    C/C++课程设计题目[2023-01-02]选题1:考勤信息管理系统某公司对员工的出勤采用计算机管理,为该公司设计一个员工考勤信息管理程序。系统包括三类用户:管理员,考勤员,普通职员......
  • C/C++通讯录管理程序[2023-01-02]
    C/C++通讯录管理程序[2023-01-02]问题描述:编写一个简单的通讯录管理程序。通讯录记录有姓名,地址(省、市(县)、街道),电话号码,邮政编码等四项。基本要求:程序应提供的......
  • C++小型公司工资管理系统[2023-01-02]
    C++小型公司工资管理系统[2023-01-02]题目14“小型公司工资管理系统设计”1、问题描述某公司需要存储雇员的编号、姓名、性别、所在部门,级别,并进行工资的计算。其中,雇......
  • C/C++停车场管理系统[2023-01-02]
    C/C++停车场管理系统[2023-01-02]项目七:停车场管理系统1、教学内容提供停车场地的管理,分为月租车和临时停车两大类。场地分为月租车停放区域和临时车辆停放区域两大块......
  • C++ string 基本用法
    一、C++string的创建方式1、string的头文件#include<iostream>//等价于C语言中的#include<stdio.h>#include<cstring>#include<string.h>//以上两种都是C语言的string头......