opengles之如何传输一个超大数组给着色器程序(代码片段)

╰つ栺尖篴夢ゞ ╰つ栺尖篴夢ゞ     2022-11-29     437

关键词:

一、前言

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

二、将数组加载到纹理

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

OpenGL:如何将多个纹理传递给具有一个变量的着色器?

】OpenGL:如何将多个纹理传递给具有一个变量的着色器?【英文标题】:OpenGL:HowcanIpassmultipletexturetoashaderwithonevariable?【发布时间】:2020-09-2502:41:50【问题描述】:我根据这段代码(https://github.com/Bly7/OBJ-Loader)从Obj文件中加载了材... 查看详情

我的opengl学习进阶之旅着色器和程序(下)------程序对象(代码片段)

在博客【我的OpenGL学习进阶之旅】着色器和程序(上)------着色器中我们已经展示了如何创建着色器对象,下一步是创建一个程序对象。如前所述,程序对象是一个容器对象,可以将着色器与之连接,并链... 查看详情

我的opengl学习进阶之旅着色器和程序(下)------程序对象(代码片段)

在博客【我的OpenGL学习进阶之旅】着色器和程序(上)------着色器中我们已经展示了如何创建着色器对象,下一步是创建一个程序对象。如前所述,程序对象是一个容器对象,可以将着色器与之连接,并链... 查看详情

opengles:如何加载着色器代码

加载着色器程序:参考链接:https://juejin.cn/post/7134356782452834334对应于代码实现:ps:一个是着色器对象,表示一段具体的着色器代码的抽象,另一个是着色器程序,表示整个图形渲染管线的着色器程序集合initShader(vertexSimpleShape,GL... 查看详情

python之opengl笔记(5):opengl着色器语言(glsl)应用画三角形

...器中声明一个类似的输入。当类型和名字都一样的时候,OpenGL就会把两个变量链接到一起,它们之间就能发送数据了(这是在链接程序对象时完成的)。  Uniform是一种从CPU中 查看详情

opengl着色器程序中的重复顶点

】opengl着色器程序中的重复顶点【英文标题】:Duplicatedverticesinopenglshaderprograms【发布时间】:2014-02-1123:07:30【问题描述】:我正在使用两个渲染程序将两个不同的对象渲染到屏幕上。每个程序都有自己的顶点和与之关联的片段... 查看详情

我的opengl学习进阶之旅opengles着色语言(上)(代码片段)

【我的OpenGL学习进阶之旅】OpenGLES着色语言(上)前言一、OpenGLES着色语言基础知识二、着色器版本规范三、变量和变量类型3.1标量类型3.2向量类型3.3矩阵类型3.4采样器四、变量构造器4.1如何使用构造器初始化和转换标量... 查看详情

我的opengl学习进阶之旅opengles着色语言(上)(代码片段)

【我的OpenGL学习进阶之旅】OpenGLES着色语言(上)前言一、OpenGLES着色语言基础知识二、着色器版本规范三、变量和变量类型3.1标量类型3.2向量类型3.3矩阵类型3.4采样器四、变量构造器4.1如何使用构造器初始化和转换标量... 查看详情

OpenGL实例化数组绘图

】OpenGL实例化数组绘图【英文标题】:OpenGLinstancedarraydrawing【发布时间】:2011-10-2203:56:03【问题描述】:我有一个简单的OpenGL程序并试图绘制一个存储在顶点着色器中的实例化数组。我正在使用两个跟随着色器进行渲染:顶点着... 查看详情

opengl之api学习(一九八)默认着色器

在执行glDraw绘制语句时,如果没有显示的设置各阶段着色器时,opengl会自动生成默认着色器程序。如果将纹理绑定到了纹理名称0,则在绘制时会自动从这个纹理采样数据。 查看详情

将属性传递给 OpenGL 顶点着色器的行为很奇怪

】将属性传递给OpenGL顶点着色器的行为很奇怪【英文标题】:PassingattributestoOpenGLvertexshaderactsstrangely【发布时间】:2014-01-1221:00:54【问题描述】:问题:结果1:我将顶点属性传递给着色器,程序运行5秒,然后显卡驱动停止响应... 查看详情

OpenGL 计算着色器 SSBO

】OpenGL计算着色器SSBO【英文标题】:OpenGLComputeShaderSSBO【发布时间】:2015-08-1911:45:46【问题描述】:我想要一个在输出缓冲区中写入1的计算着色器。我编译着色器并将其附加到程序没有问题,然后我调用glDispatchCompute()函数并等... 查看详情

OpenGL - 需要一个简单的概念澄清

】OpenGL-需要一个简单的概念澄清【英文标题】:OpenGL-needasimpleconceptclarification【发布时间】:2017-01-0819:18:46【问题描述】:我了解如何创建顶点和片段着色器以及如何创建顶点数组并将它们放在缓冲区中,但是如何将两者联系起... 查看详情

OpenGL/C++:将多个纹理传递给一个着色器的问题

】OpenGL/C++:将多个纹理传递给一个着色器的问题【英文标题】:OpenGL/C++:Problempassingmultipletexturestooneshader【发布时间】:2019-05-0220:29:31【问题描述】:我按照https://learnopengl.com/Lighting/Lighting-maps上的教程进行操作,在使用多个纹理... 查看详情

opengl一些概念02

着色器程序着色器程序对象(ShaderProgramObject)是多个着色器合并之后并最终链接完成的版本。如果要使用刚才编译的着色器我们必须把他们链接为一个着色器程序对象,然后在渲染对象的时候激活这个着色器程序。已激活着色器程... 查看详情

具有多个着色器程序的 OpenGL 多纹理

】具有多个着色器程序的OpenGL多纹理【英文标题】:OpenGLmultipletexturewithmultipleshaderprograms【发布时间】:2015-08-0904:00:39【问题描述】:我正在尝试在OpenGL中制作一个场景来模拟来自太空的地球。我现在有两个球体,一个用于地球... 查看详情

opengl入门之着色器shader(代码片段)

GLSLGLSL(OpenGLShderLanguage):OpenGL着色器语言,用于写Shader的语言。GLSL是为图形计算量身定制的,它包含一些针对向量和矩阵操作的有用特性。一个典型的着色器:#versionversion_number//#version330coreintypein_variable_name;//invec3... 查看详情

Opengl顶点着色器为每个顶点设置布尔值(glVertexAttribPointer)

】Opengl顶点着色器为每个顶点设置布尔值(glVertexAttribPointer)【英文标题】:OpenglVertexShadersetbooleanpervertex(glVertexAttribPointer)【发布时间】:2016-04-1911:21:54【问题描述】:问题:我有一个VBO,其中包含一个结构数组(MyStruct),其中... 查看详情