8个纹理单元的opengl es多纹理着色器的思考

     2023-02-22     297

关键词:

【中文标题】8个纹理单元的opengl es多纹理着色器的思考【英文标题】:Thoughts on opengl es multitexture shader with 8 texture units 【发布时间】:2013-02-12 16:36:31 【问题描述】:

下面是一个表现不佳的片段着色器。删除条件分支似乎并没有提高性能。只有 150 个多边形,我在 Kindle Fire 上获得 10fps,在 Galaxy S3 上获得 20fps。如果有的话,对优化这个的最佳方法有什么想法吗? iPad 2 上的类似着色器运行 30+fps。

在下面的代码中,texture1 到 texture8 被绑定到八个纹理。 VertexTexturesOut1 和 VertexTexturesOut2 是从顶点着色器传递过来的,它们的值是 0.0 到 1.0,表示要混合的着色量。这个想法是混合景观纹理,让草均匀地融入泥土、岩石、沙子等。

uniform sampler2D texture1;
uniform sampler2D texture2;
uniform sampler2D texture3;
uniform sampler2D texture4;
uniform sampler2D texture5;
uniform sampler2D texture6;
uniform sampler2D texture7;
uniform sampler2D texture8;

varying mediump vec2 TextureCoordOut;
varying lowp vec4 VertexTexturesOut1;
varying lowp vec4 VertexTexturesOut2;

...

    lowp vec4 Color = vec4( 0.0, 0.0, 0.0, 0.0);

    if (VertexTexturesOut1.x != 0.0) Color = Color + texture2D ( texture1, TextureCoordOut ) * VertexTexturesOut1.x;
    if (VertexTexturesOut1.y != 0.0) Color = Color + texture2D ( texture2, TextureCoordOut ) * VertexTexturesOut1.y;
    if (VertexTexturesOut1.z != 0.0) Color = Color + texture2D ( texture3, TextureCoordOut ) * VertexTexturesOut1.z;
    if (VertexTexturesOut1.w != 0.0) Color = Color + texture2D ( texture4, TextureCoordOut ) * VertexTexturesOut1.w;

    if (VertexTexturesOut2.x != 0.0) Color = Color + texture2D ( texture5, TextureCoordOut ) * VertexTexturesOut2.x;
    if (VertexTexturesOut2.y != 0.0) Color = Color + texture2D ( texture6, TextureCoordOut ) * VertexTexturesOut2.y;
    if (VertexTexturesOut2.z != 0.0) Color = Color + texture2D ( texture7, TextureCoordOut ) * VertexTexturesOut2.z;
    if (VertexTexturesOut2.w != 0.0) Color = Color + texture2D ( texture8, TextureCoordOut ) * VertexTexturesOut2.w;

    gl_FragColor = Color;    

【问题讨论】:

1.拥有这些 if 语句有什么意义?这真的比只做乘法更快吗? 2. 刺破黑暗:也许对同一个变量的多次赋值不是最优的?拥有Color1Color2 并添加它们怎么样? 【参考方案1】:

在设计片段着色器时,您的着色器有许多 DONT。您有许多条件语句,因此所有线程都需要始终等待经纱(或批处理)中的所有其他线程。您还访问了 8 个纹理,这意味着您需要等待所有这些纹理查找(这也会消耗内存带宽)。使用任何优化工具,例如 Adreno SDK、Mali SDK 或您选择的任何供应商,并在他们的优化工具中运行着色器以发现 GPU 在哪里花费更多时间。

您是否使用完整的 RGB888 纹理?一个

也许如果您告诉我们您要归档什么,我们可以考虑另一种解决方案,而无需使用 8 个纹理查找。

【讨论】:

opengl2d纹理单元&纹理翻转解决策略

参考技术A首先,思考我们是如何将纹理对象传递给片元着色器?GLSL中提供一个共纹理对象使用的内建数据类型,叫做采样器(sampler).例如,sampler1D,sampler2D,sampler3D表示不同维度的纹理类型.那么我们在片元着色器是如何获取一个纹理的?... 查看详情

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

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

没有纹理图像单元的 Opengl 纹理

】没有纹理图像单元的Opengl纹理【英文标题】:OpenglTextureswithoutTextureimageUnits【发布时间】:2014-06-0216:10:57【问题描述】:最近我发现一个Opengl示例应用asingle纹理而不指定纹理图像单元并且没有将相应的单元整数统一发送到着色... 查看详情

OpenGL:关于使用多个纹理或纹理单元的一些说明

】OpenGL:关于使用多个纹理或纹理单元的一些说明【英文标题】:OpenGL:Someclarificationonusingmultipletexturesortextureunits【发布时间】:2019-08-2307:46:17【问题描述】:我需要在我的着色器中使用两个纹理,一个在顶点着色器中,另一个... 查看详情

传递给片段着色器的纹理坐标全部为 0

】传递给片段着色器的纹理坐标全部为0【英文标题】:Texturecoordinatespassedtofragmentshaderareall0【发布时间】:2013-08-0614:13:17【问题描述】:我已经为我正在开发的一个小型openGL2.0应用程序编写了自己的顶点和片段着色器。一切似乎... 查看详情

GLSL Motion Blur Post Processing,进入着色器的 2 个纹理是相同的

】GLSLMotionBlurPostProcessing,进入着色器的2个纹理是相同的【英文标题】:GLSLMotionBlurPostProcessing,2texturesgoingtotheshaderarethesame【发布时间】:2016-06-2000:37:23【问题描述】:我正在使用OpenGL创建一个场景,对其进行渲染并对其应用运动... 查看详情

opengles多目标渲染(mrt)

...多个颜色,可以用于保存RGBA颜色、法线、深度信息或者纹理坐标,每个颜色连接一个颜色缓冲区。就目前接触的MRT技术,在图形图像算法中比较常用,主要用于获取算法中间结果、底图或者Mask,也用于多种高级渲染算法中,例... 查看详情

OpenGL 多纹理混合

】OpenGL多纹理混合【英文标题】:OpenGLmultitextureblending【发布时间】:2012-09-0605:45:06【问题描述】:我正在尝试实现像Photoshop这样的图层功能。这是我想画的..但它是像下面这样绘制的它使用了两层。用2个纹理帧缓冲区制作一个... 查看详情

顶点纹理获取(在顶点着色器中读取纹理)

】顶点纹理获取(在顶点着色器中读取纹理)【英文标题】:VertextextureFetch(Texturereadinvertexshader)【发布时间】:2016-05-2611:13:10【问题描述】:Opengl和GLSL的新手。我正在使用OpenGLes3.0和我的GLSL版本#version300es。我想在我的顶点着色... 查看详情

在 OpenGL ES 2 中切换纹理

】在OpenGLES2中切换纹理【英文标题】:SwitchingbetweentexturesinOpenGLES2【发布时间】:2012-10-1320:30:06【问题描述】:我试图弄清楚如何将不同的纹理放入不同的纹理单元并选择要绘制的纹理。我的onDrawFrame()方法中有以下代码int[]texture... 查看详情

OpenGL 不绘制我的纹理

】OpenGL不绘制我的纹理【英文标题】:OpenGLdoesn\'tdrawmytexture【发布时间】:2015-08-0516:16:15【问题描述】:我的问题是OpenGL3.3没有绘制我的纹理。我检查了它是否是我的着色器的问题(它无法很好地加载),但着色器没问题。然后... 查看详情

OpenGL片段着色器纹理速度

】OpenGL片段着色器纹理速度【英文标题】:OpenGlFragmentShaderTextureSpeed【发布时间】:2011-06-2121:39:18【问题描述】:我有以下片段着色器。varyinghighpvec2tCoord;voidmain()vec4hc=texture2D(hair,tCoord);gl_FragColor=hc;在我的程序中,我在屏幕上绘制... 查看详情

纹理中的 OpenGL 片段着色器

】纹理中的OpenGL片段着色器【英文标题】:OpenGLfragmentshaderinatexture【发布时间】:2016-04-1516:13:41【问题描述】:我有一个简单的RGBA纹理,我将在OpenGL中将其投影到一个矩形/四边形上。但是,我想对该纹理的rgb像素进行一些操作... 查看详情

OpenGL,禁用纹理单元、glActiveTexture 和 glBindTexture

】OpenGL,禁用纹理单元、glActiveTexture和glBindTexture【英文标题】:OpenGL,disablingatextureunit,glActiveTextureandglBindTexture【发布时间】:2011-09-2519:33:13【问题描述】:如何关闭纹理单元,或者至少在绑定纹理时防止其状态发生变化?我正... 查看详情

使用 VBO/IBO 的 OpenGL 纹理三角形

】使用VBO/IBO的OpenGL纹理三角形【英文标题】:TexturedtriangleswithOpenGLusingVBO/IBO【发布时间】:2016-02-0719:51:26【问题描述】:我正在尝试使用包含屏幕坐标和纹理坐标的VBO以及带有索引的IBO绘制两个带纹理的三角形来制作正方形。... 查看详情

OpenGL着色器没有传递正确的纹理坐标

】OpenGL着色器没有传递正确的纹理坐标【英文标题】:OpenGLshadernotpassingcorrecttexturecoordinates【发布时间】:2014-10-2600:47:42【问题描述】:在我的OpenGL应用程序中测试了一些东西后,我知道我的纹理没有正确加载,因为纹理坐标无... 查看详情

第十二节—关于纹理单元

参考技术A关于对纹理单元的理解,首先就要知道什么是sampler纹理采样器。在GLSL中,我们经常会在.fsh也即是片元着色器源码文件中使用sampler这个修饰符,它会和一个texture一一对应,从而获取到我们需要的纹理。他的功能就是辅... 查看详情

将灰度 OpenCV 图像传递给 OpenGL 纹理

】将灰度OpenCV图像传递给OpenGL纹理【英文标题】:PassinggrayscaleOpenCVimagetoanOpenGLtexture【发布时间】:2015-06-0809:13:24【问题描述】:我想在GLSL着色器中使用OpenCV生成的灰度图像。基于OpenCVimageloadingforOpenGLTexture上的问题,我设法想... 查看详情