OpenGL ES之如何传输一个超大数组给着色器程序

Posted ╰つ栺尖篴夢ゞ

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenGL ES之如何传输一个超大数组给着色器程序相关的知识,希望对你有一定的参考价值。

一、前言

  • 在 OpenGL ES 图形图像处理中,会经常遇到一种情况:如何将一个超大的数组传给着色器程序?目前常用的有三种方式:
    • 使用将数组加载到 2D 纹理的方式,然后使用 texelFetch 取数据;
    • 使用 uniform 缓冲区对象,即 UBO;
    • 使用纹理缓冲区对象,即 TBO。

二、将数组加载到纹理

  • 使用将数组加载到纹理的方式来传输大数组,是最容易想到的一种方式。要想精确地换取每个像素的值,这个时候就不能使用采样函数 texture,因为采样函数会涉及归一化、过滤以及插值等复杂操作,基本无法得到某一确切像素的值。
  • 这个时候就需要使用纹素获取函数 texlFetch ,texlFetch 是 OpenGL ES 3.0 引入的 API ,它将纹理视为图像,可以精确访问像素的内容,可以类比通过索引来获取数组某个元素的值:
vec4 texelFetch(sampler2D sampler, ivec2 P, int lod)

以上是关于OpenGL ES之如何传输一个超大数组给着色器程序的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL ES着色语言-光照效果之散射光

OpenGL ES着色语言-光照效果之散射光

OpenGL ES着色语言-光照效果之散射光

为啥 glColorPointer 不给三角形着色 - 以及 opengl es 的其他奇怪的东西

我的OpenGL学习进阶之旅OpenGL ES 着色语言 (上)

我的OpenGL学习进阶之旅OpenGL ES 着色语言 (上)