(针对这个问题,我正在尝试研究解决this other one的想法)

如果我在内存中有一个标准的2D数组,其尺寸为width和height,则可以将其转换为一个长度为width * height的一维数组,然后通过index = x y * width对其进行索引.在为阵列分配和释放内存时,此映射非常有用,因为内存管理器无需担心以2D打包结构,而只需担心以1D表示的每个已分配数组的总长度.

我正在尝试查看是否可以将这种方法用于OpenGL纹理的图像内存管理.这个想法(如上面的链接问题所述)是通过将bin-packing将一堆所需的纹理(即,将它们彼此相邻绘制)组合到一个较大的纹理中.这有助于最小化渲染过程中昂贵的纹理绑定操作.

假设我的大纹理是8×8像素(即总共64像素):

8x8 texture: 5x5 image: 4x5 image:

| 0 1 2 3 4 5 6 7 | 0 1 2 3 4 | 0 1 2 3

---+----------------- ---+----------- ---+---------

0 | . . . . . . . . 0 | A B C D E 0 | a b c d

1 | . . . . . . . . 1 | F G H I J 1 | e f g h

2 | . . . . . . . . 2 | K L M N O 2 | i j k l

3 | . . . . . . . . 3 | P Q R S T 3 | m n o p

4 | . . . . . . . . 4 | U V W X Y 4 | q r s t

5 | . . . . . . . .

6 | . . . . . . . .

7 | . . . . . . . .

我想在其中存储5×5图像和4×5图像(即25 20 = 45像素).从技术上讲,我有很多可用的像素,但是我无法将这些图像彼此并排放置到大纹理中,因为这将要求一个方向的最小尺寸为9,而另一个方向的最小尺寸为5.

如果我可以简单地将我的8×8纹理处理为64个连续的内存像素并将两个图像映射到其中的1D内存块中,则可以在纹理内部按如下方式排列图像:

????8×8纹理:

| 0 1 2 3 4 5 6 7

---+-----------------

0 | A B C D E F G H

1 | I J K L M N O P

2 | Q R S T U V W X

3 | Y a b c d e f g

4 | h i j k l m n o

5 | p q r s t . . .

6 | . . . . . . . .

7 | . . . . . . . .

如果我以1:1的比例绘制所有图像,即在任何地方都没有分数像素坐标,并且不需要任何线性滤波或其他像素混合,是否可以提出一个转换矩阵,以用于绘制4使用此纹理的×5图像?

使用顶点着色器和片段着色器,这看起来可能相当简单(除非我忘记了一些;我没有尝试过):

>顶点着色器映射图像的四个角以绘制为表示为64×1图像的纹理:

> a:(0,0)→(0 0 * 4 25,0)=(25,0)其中25是4×5图像的偏移量

> d:(3,0)→(3 0 * 4 25,0)=(28,0)

> q:(0,4)→(0 4 * 4 25,0)=(41,0)

> t:(3,4)→(3 4 * 4 25,0)=(44,0)

然后将纹理内其他坐标的插值(?)也映射到这条线的右侧偏移以获得整数坐标

>片段着色器通过简单地将商和除数除以8来将此64×1坐标转换为最终的8×8坐标,例如:

> a:(0,25)→(25%8,25/8)=(1,3)

> d:(0,28)→(28%8,28/8)=(4,3)

> k:(0,35)→(35%8,35/8)=(3,4)

> q:(0,41)→(41%8,41/8)=(1,5)

> t:(0,44)→(44%8,44/8)=(4,5)

不幸的是,自定义着色器需要OpenGL ES v2.0或更高版本,并非在所有设备上都可用.

是否可以仅通过OpenGL ES 1.1提供的矩阵转换来实现此映射?

android将矩阵转换成字节数组,android-使用OpenGL矩阵转换将纹理从“ 1D”映...相关推荐

  1. C# 将对象转换成字节数组(二进制数据)

    在将自定义对象或者数组等这样的数据存储到数据库时往往需要转换成二进制字节,尤其是在一些O/RM数据库框架中,下面是转换的函数,一个是将对象转换成二进制字节数组,另一个是将从数据库中读取的二进制流转换成 ...

  2. java字符串转换成字节数组_将Java字符串转换为字节数组

    我有一个要加密的字节数组,然后转换为字符串,以便可以传输. 当我收到字符串时,我必须将字符串转换回字节数组,以便可以对其进行解密. 我检查了接收到的字符串是否与发送的字符串(包括长度)匹配,但是当我使 ...

  3. InputStream输入流转换成字节数组 和 字节数组转换成字符串

    https://blog.csdn.net/night_iv/article/details/7525760?utm_source=blogxgwz5 https://www.cnblogs.com/ ...

  4. (6) 查看汉字转换成字节数组后的字节值

    package test;import java.io.UnsupportedEncodingException;/*** Unicode编码中,第一个汉字"一"的编码是4e00, ...

  5. php 转换成字节数组吗,在PHP中如何将字节数组转换成字符串?

    如果按字节数组表示: $bytes = array(255, 0, 55, 42, 17, ); array_map() 那么就像: $string = implode(array_map(" ...

  6. C#中字节数组与字符串的来回转换

    C#中字节数组与字符串的来回转换会遇到一个奇怪的问题.这个问题是在做网络传送文件时遇到的. 问题如下: 就是把件流形成的字节数组转成字符串发送,对端接收到过后把字符串还原成字节数组然后形成文件流. 这 ...

  7. 16进制字符串转成字节数组、字节数组转16进制字符串、16进制字符串转成2进制字符串、中英文 字符串转16进制、16进制转换成中英文 字符串

    因为需要与硬件相互通讯 用到了这些方法 亲测可用 /*** 16进制表示的字符串 转换为字节数组** @param hexString 16进制表示的字符串* @return byte[] 字节数组* ...

  8. android开发将h5转换成pdf_如何将PDF转换成图片?搞定PDF格式转换,就用这招就够了!...

    原标题:如何将PDF转换成图片?搞定PDF格式转换,就用这招就够了! 在我们日常学习和日常工作中,我们有时候会遇到要使用到PDF中某一部分的情况,这时候我们可以将PDF文件转成图片.有什么办法可以把P ...

  9. HDOJ---1431 素数回文[素数筛选+ltoa函数(将长整形转换成字符数组)+打表]

    素数回文 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

最新文章

  1. Citrix XenServer@cloudstack基本功能测试报告2
  2. 重磅!泰晤士发布重量级学科排名,90所中国大陆高校上榜
  3. Zabbix 监控获取apache_status
  4. 最真实的互联网用户画像...
  5. 第一次来请大家多多关照---毕业生找工作篇
  6. task_struct 结构如何查看及分析
  7. html如何设置鼠标选中状态,怎么用CSS 设置 当鼠标移动到菜单时,该按钮变色,鼠标点击后,页面停留在鼠标滑过时的状态!!很急!...
  8. Nvidia Jetson TX2入门指南(白话版)
  9. 抽象类java启动线程_java 线程复习笔记
  10. 检查和安装过程中的常见的问题
  11. UI-12组结对编程作业总结
  12. C++ Templates中文版 p61页的一个问题
  13. VUE-鼠标移入到目标区域变成小手模样
  14. ES5 to ESNext —  自 2015 以来 JavaScript 新增的所有新特性
  15. 三子棋超详细思路及步骤
  16. 《三井帝国在行动》pdf电子版下载
  17. 我们会是最后一批用五笔的中国人吗?
  18. 使用CIFAR10数据集完成知识蒸馏(参照了快乐就好_Peng博主的博客)致谢
  19. SERVER SQL CASE
  20. IEEE浮点数表示--规格化/非规格化/无穷大/NaN

热门文章

  1. c#学习之基础篇(filter 筛选器)
  2. 并发--基本的线程机制
  3. 大数据开发实战:Hive表DDL和DML
  4. 《大数据、小数据、无数据:网络世界的数据学术》一 3.3 社会与技术
  5. C++拓展笔记2-3:C++中this指针用法简介
  6. (总结)RHEL/CentOS 7.x的几点新改变
  7. Swift实战-豆瓣电台(六)视图跳转,传参及回跳
  8. java排序——插入排序
  9. Splunk安装和配置及源码编译安装SVN
  10. 在64-bit机器上运行32-big的应用程序,需要安装ia32-libs库