GLSL性能函数的返回值/类型
我正在使用双色过滤来平滑我的高度图,我在GLSL中实现了它: 双孔插值:(请参阅interpolate()函数bellow) float interpolateBicubic(sampler2D tex, vec2 t) { vec2 offBot = vec2(0,-1); vec2 offTop = vec2(0,1); vec2 offRight = vec2(1,0); vec2 offLeft = vec2(-1,0); vec2 f = fract(t.xy * 1025); vec2 bot0 = (floor(t.xy * 1025)+offBot+offLeft)/1025; vec2 bot1 = (floor(t.xy * 1025)+offBot)/1025; vec2 bot2 = (floor(t.xy * 1025)+offBot+offRight)/1025; vec2 bot3 = (floor(t.xy * 1025)+o
2 2023-05-24
编程技术问答社区
GLSL : 在for-loop中访问一个数组会影响性能
好吧,所以我正在为正在制作的游戏(使用libgdx)开发一个Android应用程序.而且我有一个碎片着色器,我注意到我有〜41 fps.我正在玩代码以查看问题的位置,我看到了如何将阵列从ArrayName [i]访问到ArrayName [0]的方式将性能恢复到60 fps,即使循环仅一次迭代一次.这个特定的实例. 这是代码: #version 300 es precision highp float; uniform sampler2D u_texture; in vec2 vTexCoord0; struct BlackHole { vec2 position; float radius; float deformRadius; }; uniform vec2 screenSize; uniform vec3 cameraPos; uniform float cameraZoom; uniform BlackHole blackHole[4
0 2023-05-24
编程技术问答社区
用GLSL创建深度缓冲区直方图纹理
我正在使用当前上下文的深度缓冲区来影响我正在显示的纹理.质地为1维,在灰度中.从左至右表示从远到远.像素越多的深度越深,质地在那时质地越亮,黑色没有像素在那个深度,白色是所有像素的深度. 现在,我有了一个解决方案,可以在深度缓冲器上进行glReadPixels(),在CPU上进行分析,然后将其写回纹理.自然,这是应用程序中的真正瓶颈. 我正在寻找一个全GPU解决方案,其中深度缓冲区在着色器或各个部分中分析,并以这种方式更新纹理.我考虑过创建一个片段着色器,该片段着色器读取深度值并增加到纹理中的相应像素,但这需要片段着色器可以写入其他纹理.我学会了成为禁忌的东西,尤其是当他们必须写入同一像素时. 是否有我缺少的技巧或技巧,或者我被迫参与CPU? 解决方案 幸运的是有一个技巧:顶点着色器也可以采样纹理.因此,您可以发出许多GL_Points,每个GL_Point都与深度纹理中的单个片段相对应,然后在顶点着色器中您可以从深度纹理中读取以确定点的转换位置.在您的片段着色
0 2023-05-23
编程技术问答社区
GPU上的整数和位操作的性能
尽管应该与浮点数据类型一起使用GPU,但我对GPU处理位操作的速度感兴趣.这些是CPU上最快的,但是GPU是否效仿了位操作,还是在硬件上完全计算出来?我打算在用GLSL编写的着色器程序中使用它们.我还认为,如果位操作具有完全的预性性,整数数据类型也应该有,但是我需要对此进行确认. 更准确地说,有针对性的版本是OpenGL 3.2和GLSL 1.5.应该运行的硬件是任何Radeon HD图形卡和GeForce Series 8及更新的硬件.指出它们. 解决方案 这个问题部分回答了 gpu上的整数计算 在简短的现代GPU中具有32位数据的等效INT和FP性能.因此,您的逻辑操作将以相同的速度运行. 从编程角度来看,如果您要处理标量整数数据,您将失去性能. GPU喜欢使用并行和包装的操作. for(int i=0; i
0 2023-05-23
编程技术问答社区
着色器位置vec4或vec3
我已经阅读了一些有关GLSL的教程. 在某些位置,属性是某些VEC3中的VEC4. 我知道矩阵操作需要VEC4,但是要发送附加元素值得吗? 发送VEC3和后来在着色器VEC4(位置为1.0)中发送的vec3和铸件不是更好吗? 记忆中的数据较少 - 它会更快吗?否则我们应该打包一个额外的元素以避免铸造? 有什么技巧应该更好? layout(location = 0) in vec4 position; MVP*position; 或 layout(location = 0) in vec3 position; MVP*vec4(position,1.0); 解决方案 对于顶点属性,这无关紧要.缺乏时,第四个组件会自动扩展到1.0. 也就是说,如果您将3维顶点属性指针传递给4维矢量,则GL将使用W W为您填充.我总是走这条路线,它避免了在位置上执行矩阵乘法时必须明确编写vec4 (...),并且还避免了浪费存储存储第四个组件的内存. 顺便说一句,这也适
2 2023-05-23
编程技术问答社区
在WebGL的GLSL中,我可以使用什么作为数组索引?
是否只允许常数或我可以用于循环索引或任何其他动态值? 解决方案 在 Webgl / GLES2 中:是的,只允许常数.但是,如果您的代码可以独立(由编译器或编译器)展开,则它将其算作常数,并且您有解决方法.例如, 问题: uniform int i; ... int a[4]; a[2] = 42; // ✓ a constant index, no worries a[i] = 42; // ✗ dynamic indexing is not allowed 解决方法: if (i == 0) a[0] = 42; if (i == 1) a[1] = 42; if (i == 2) a[2] = 42; if (i == 3) a[3] = 42; 好吧,这很痛苦.让我们让编译器这样做: for (int k = 0; k
6 2023-05-22
编程技术问答社区
GLSL中的二阶函数?
我正在寻找一种将函数用作GLSL中另一个函数的参数的方法.在常规C中,可以通过将函数指针作为函数参数进行模拟.似乎其他语言(例如HLSL)现在提供了处理高级构造(例如高阶功能)的方法,或者可以用巧妙地使用HLSL结构.不幸的是,我现在一直坚持使用GLSL,我找不到任何模拟高阶功能的方法.当前(4.2)GLSL真的不可能吗?还是我错过了一些聪明的技巧? 我要实现的常见示例: int f(someType f2, int i) { return f2(i); } 解决方案 我正在寻找一种将函数用作GLSL中另一个函数的参数的方法. 简短答案:您不能. 最接近这种功能,您将在GLSL中获得的功能是 shinder子例程.这仅允许外部OpenGL API选择要使用的子例程,而不是着色器本身. 所以只做switch/case语句,然后用. 其他解决方案 GLSL中没有高阶功能,但可以模拟它们: #define second_order
0 2023-05-20
编程技术问答社区
你可以把一个固定大小的数组作为GLSL函数的参数来传递吗?
在GLSL着色器中,我想创建一个看起来像这样的函数: void MyFunction(out float results[9]) { float value0 = 3.1546; float value1 = 42; // whatever value /* ... long, complicated code ... */ results[0] = value0; results[1] = value1; results[2] = value2; ... } 可以在GLSL中使用和编译此类函数签名吗? 如果没有,有其他选择吗? 解决方案 是的,这是法律GLSL代码. 这并不意味着它肯定会编译,而是法律规范.话虽如此,最好只返回数组(您也可以这样做),而不是将其作为输出参数传递.
4 2023-05-19
编程技术问答社区
Vulkan中的并行计算着色器执行?
我有几个计算着色器(我们将它们称为compute1,compute2>上),它们具有多个输入绑定(在着色器代码中定义为layout (...) readonly buffer>)和几个输出绑定(定义为layout (...) writeonly buffer).我将数据绑定到其描述符集,然后尝试在并行中执行这些着色器. 我尝试的是: vkQueueSubmit() VkSubmitInfo.pCommandBuffers握住几个主命令缓冲区(每个计算着色器); vkQueueSubmit()使用VkSubmitInfo.pCommandBuffers持有使用vkCmdExecuteCommands()记录的一个主命令缓冲区,pCommandBuffers持有几个辅助命令缓冲区(一个每个计算着色器); 单独的vkQueueSubmit()+vkQueueWaitIdle()与不同的std::thread对象(每个计算着色器) - 每个命令缓冲区都分配给单独的VkComman
0 2023-05-19
编程技术问答社区
C++ GLSL数据对齐/填充
我有一个C ++类Matrix4x4,该数组有16个浮点,没有虚拟方法: class Matrix4x4 { public: float values[16]; Matrix4x4(); Matrix4x4(float v0, float v1, float v2, float v3, float v4, float v5, float v6, float v7, float v8, float v9, float v10, float v11, float v12, float v13, float v14, float v15); Matrix4x4(const Quaternion &quat, const Vector3 &pos); void convertToQuatPos(Quaternion &quat, Vector3 &pos); void loadIdentity(); void setValues(f
2 2023-05-16
编程技术问答社区
Mac OS 10.8支持GLSL 3.30?
我正在使用10.8 Mountain Lion在OpenGL 3.3上的ArcSynsis教程,并在构建项目时使用GLSL版本3.30编译和运行着着色器,但是即使在Mac OS 10.8上的Core Profile中,我也不应该有GLSL 3.30支持 - 仅1.50(如图中突出显示) 有人能够解释我如何设法实现这种黑魔法吗? 解决方案 OS X 10.8仍然仅支持OpenGL 3.2,但具有一些3.3功能,例如指定属性位置(#extension GL_ARB_explicit_attrib_location : enable).着色器编译器接受最多4.10的版本.他们可能将其留在那里以兼容或(猜测)他们最初打算支持4.1. 这至少是我几周后的结论. 编辑:看起来4.10的猜测已被发现. 10.9-10.12支持到4.10版.我想他们想在金属API上花费资源,而不是向前迈进并获得计算着色器.
0 2023-05-15
编程技术问答社区
OS X上的GLUT与OpenGL 3.2核心配置文件
是否可以使用核心配置文件在OS X狮子或OS X Mountain Lion上使用Glut(我可以使用GLSL 1.50)? 我可以使用内置的插内,还是需要使用第三部分库,例如freeglut? ,是否有任何简单的" Hello World"应用程序可用于XCode项目或Make-File的OS X? 解决方案 您至少需要Mac OS X Lion(OS X 10.7或更高)才能获得OpenGL 3.2的基本支持.要使用OpenGL 3.2核心配置文件,只需添加 glutInitDisplayMode(GLUT_3_2_CORE_PROFILE | ... | ...); 在您的main中 - 功能.您可以通过 检查 std::printf("%s\n%s\n", glGetString(GL_RENDERER), // e.g. Intel HD Graphics 3000 OpenGL Engine glGetSt
2 2023-05-14
编程技术问答社区
Mavericks下的OpenGL 4.1(?
我刚刚将MacBook Pro升级到Mavericks(MacOS 10.9),包括Xcode. 根据苹果的" OpenGL功能表",此版本具有支持 对于OpenGL 4.1,但要呼叫GlgetString(GL_Version)返回" 1.2"和我的GLSL 3.30着色器,以" #version 330"开头,拒绝加载,说 版本不支持. 我需要对小牛做点事以启用4.1支持吗? 解决方案 当您使用OS X上的低级API请求像素格式时,您需要将以下内容添加到属性列表中以使用核心配置文件: CGL: kCGLPFAOpenGLProfile, kCGLOGLPVersion_3_2_Core nsopengl: NSOpenGLPFAOpenGLProfile, NSOpenGLProfileVersion3_2Core 现在,虽然特定常数被命名为 ... 3_2Core,实际上含义是请求上下文,以删除所有不弃用的功能和支持至少ope
0 2023-05-14
编程技术问答社区
在像素着色器中实现卷积滤波器的最有效方法是什么?
在像素着色器中实现卷积的质地数量很高. 实现卷积滤波器的直接方法是使用两个片段使用两个循环来使每个片段的查找.一个简单的计算表明,与4x4高斯内核模糊的1024x1024图像需要1024 x 1024 x 4 x 4 = 16M查找. 一个人可以做什么? 可以使用一些需要更少查找的优化?我对诸如高斯(或它们是特定于内核?) 之类的内核特异性优化不感兴趣. 至少可以通过以某种方式利用可以使用的像素的局部性来更快地使这些查找? 谢谢! 解决方案 高斯内核是可分离的,这意味着您可以先进行水平通行证,然后再进行垂直通行证(或相反的方式).这将O(n^2)变成O(2n).它适用于所有可分离的过滤器,不仅适用于模糊(不是所有所有过滤器都是可分离的,但许多过滤器是可以分开的,有些是"一样的"). 或,在特定的模糊过滤器(是否没有高斯)的情况下,这些都是"加权总和",您可以利用纹理插值的优势,对于小内核尺寸而言,这可能更快(但绝对不适合较大的内核尺寸).
0 2023-05-12
编程技术问答社区
GLSL着色器中cos()和sin()函数的速度?
我对sin()和cos()的速度的信息感兴趣 glsl specification /p> 内置功能基本上分为三类: ... ... 它们代表一个操作图形硬件可能会在某个时候加速.三角学的功能属于 类别. 编辑: 正如所指出的那样,计算sin()和cos()的单个操作的时钟周期并不能真正讲述整个表演故事. 因此,要澄清我的问题,我真正感兴趣的是是否值得优化sin()和cos()呼吁普通案例. 例如,在我的应用程序中,该参数为0非常普遍.这样的东西也很有意义: float sina, cosa; if ( rotation == 0 ) { sina = 0; cosa = 1; } else { sina = sin( rotation ); cosa = cos( rotation ); } 或GLSL编译器或sin()和cos()实现对我的优化? 解决方案 例如,在我的应用程序中,论点是0.
32 2023-05-12
编程技术问答社区
在WebGL着色器中用mix()在两个以上的目标之间进行变形
我正在尝试使用三个.JS构建一个图像滑块,并且很难将我的头绕过适当的状态传递给GLSL着色器,以便我可以在幻灯片之间过渡.我可以轻松地在两个目标之间做到这一点(无论是纹理还是attribute float mix; vec4 color = mix(tex1, tex2, mix); ,但我不明白如何以2个目标进行处理.我应该通过一个数字并做一堆if语句吗? 我设置了我的缓冲平面几何形状和着色器材料,其中包含我的3种纹理,例如: const uniforms = { time: { value: 0 }, tex1: { type: 't', value: null }, tex2: { type: 't', value: null }, tex3: { type: 't', value: null }, activeTexture: { type: 'i', value: 0 }, mixFactor: { value: 0 } } cons
2 2023-05-11
编程技术问答社区
OpenGL ES着色器不工作,每帧都调用glLinkProgram?
我正在尝试在OpenGL ES 2.0中制作透明对象.这是一张现场墙纸,我将GlwallPaperService用作这一点.我正在以这种方式设置OpenGL: GLES20.glEnable(GLES20.GL_DEPTH_TEST); GLES20.glDepthFunc(GLES20.GL_GEQUAL); GLES20.glClearDepthf(0.0f); GLES20.glClearColor(0.0f, 0.0f, 1.0f, 1.0f); 我使用的着色器取自PowerVR样品Ogles2Alphatest用于Alpha测试,该测试在我的HTC Desire设备上正常工作. 这是着色器的代码: private final String mVertexShader = "uniform highp mat4 uMVPMatrix;\n" + "attribute highp vec4 aPosition;\n" + "attri
6 2023-05-11
编程技术问答社区
碎片着色器。着色器中没有带有名称的制服
我在libgdx中的片段着色器有问题.下面是我的碎片着色器. #ifdef GL_ES precision mediump float; #endif uniform float u_aspectRatio; varying vec2 v_texCoords; uniform sampler2D u_texture; void main() { gl_FragColor = texture2D(u_texture, v_texCoords); } 在程序中我做 shader.setUniformi("u_texture", 0); // work fine shader.setUniformf("u_aspectRatio", 0.0f); //no uniform with name 'u_aspectRatio' in shader shader.iscompiled()
2 2023-05-11
编程技术问答社区
用于纹理'烟雾&39;效果的GLSL着色器
我环顾四周,没有发现任何相关的东西.我很想创建一个着色器,以提供像这里一样的质地烟雾效应动画: 不是要求一个完整/完整的解决方案(尽管那将是很棒的),而是要对我开始实现这种效果的任何指针.我需要有图纸的顶点,或者如果我只有纹理? ,这是可能的吗? 解决方案 在示例中,它看起来好像它们具有顶点.可能记录了花形状的"绘画",然后连续播放.然后,效果根据绘制的时间偏移来击中顶点.效果似乎大部分是运动模糊. 因此,要复制此效果,您需要顶点.看看花的顶部是如何在底部之前消失的吗?如果仔细观察,您会发现实际上模糊的效果时序沿着逆时针绕花的路径.即使在GIF的第一帧中,您也可以看到花形状的末端比开始的黄色更亮. 运动模糊的角度似乎也随着时间的流逝而变化,从左向而变化为更加面向. 和段的亮度也随着时间的流逝而变化,从淡黄色开始,结束黑色或透明. 我无法从中判断的是效果是否是加性的,这意味着它们将效果应用于整个帧,然后将效果的结果应用于每个帧的结果,或者是否正在重新创建
0 2023-05-11
编程技术问答社区
不影响SCNFloor的SCNProgram
在我使用着色器修饰符的实验中,我看到数组数据无法传输到着色器. scenekit在OpenGL着色器中将数组数据传递给统一数组时给出缓冲区尺寸错误 因此,我决定尝试SCNPROGRAM.但是现在我意识到我使用SCNProgram添加的着色器不起作用. 这个问题有特殊原因吗? 我用于测试的超级简单着色器; 顶点着色器 precision highp float; attribute vec3 vertex; uniform mat4 ModelViewProjectionMatrix; void main() { gl_Position = ModelViewProjectionMatrix * vec4(vertex, 1.0); } 碎片着色器 precision mediump float; void main( void ) { gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0);
0 2023-05-11
编程技术问答社区