问题标签 [glsles]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1772 浏览

opengl - 从 OpenGL 移植到 GLES 2.0

我在一些桌面应用程序中使用了https://github.com/akrinke/Font-Stash.git。现在我想在使用 gles2 的树莓派上使用它。我查看了代码,发现在 gles 上不起作用的唯一路径是 flush_draw 函数:

我正在尝试移植到这个:

带顶点 sl

和片段 sl

但我什么也得不到,屏幕上什么也没有。

谁能告诉我我的代码有什么问题?

0 投票
1 回答
85 浏览

opengl-es-2.0 - 片段着色器算法中的意外行为

我在不同设备上的片段着色器遇到了一些问题。在某些设备上,着色器工作正常,但在其他设备上,算法会产生奇怪的结果。我检查了 Java 中的算法,以确保算法本身不包含错误。

算法失败的部分如下。当我这样编写计算时,它适用于所有设备:

但如果我使用

我相信这是相同的计算,因此应该产生相同的结果,但该算法在某些设备上失败。可能发生故障的其他部分更复杂,但也许如果我能理解为什么会失败,我也可以解决其他部分。

任何帮助将不胜感激。

顺便说一句,我正在使用具有精度 mediump float 的 OpenGL ES 2.0 并且 dot(MD,MD) 始终大于零

0 投票
0 回答
2533 浏览

android - GLSL ES 片段着色器在不同设备上产生非常不同的结果

我正在使用 OpenGL ES 2.0 为 Android 开发游戏,但在后台绘制星星的片段着色器存在问题。我有以下代码:

我的目标是“量化”片段坐标,因此“星星”的大小不是 1px,然后随机点亮足够远的量化像素。但是,此代码会根据执行位置产生不同的结果。我使用了 GLSL Sandbox ( http://glsl.heroku.com )、Nexus 7 和 HTC Desire S 来进行比较:

着色器结果比较

如您所见,GLSL Sandbox 会生成密集的网格,其中有许多可见的星星。在 Nexus 7 上,星星要少得多并且沿线分布(在这个小图像上可能不明显) - 该rand功能无法按预期工作。Desire S 根本不画星星。

为什么该rand功能在 Nexus 7 上如此奇怪(如果我修改用于点积的矢量,星星会沿着不同角度的线分布)?什么可能导致 Desire S 不渲染星星?

我也很感激这个着色器的任何优化技巧,因为我对 GLSL 非常缺乏经验。或者也许有更好的方法通过片段着色器绘制“星星”?

更新

我将代码更改为此(我使用http://glsl.heroku.com/e#9364.0作为参考):

Desire S 现在给了我非常漂亮、均匀分布的星星。但是 Nexus 7 的问题仍然存在。prob = 0.97 时,不显示星号,而 prob = 0.01 非常低时,它们看起来非常稀疏地沿水平线放置。为什么 Tegra 3 的行为如此奇怪?

0 投票
1 回答
2654 浏览

ios - GLSL ES 精度错误和溢出

我有以下片段着色器:

我知道这个着色器没有多大意义,但它仍然应该运行正确,我尝试重现它的问题。当我用 Xcode OpenGL-ES 分析器分析这个着色器时,它显示一个错误:

隐式转换溢出,lowp float 的最小范围为 (-2,2)

它不仅显示此错误,而且渲染输出也因溢出而损坏。所以它不仅仅是分析仪的误报,它实际上溢出了。

谁能向我解释为什么 dis 会产生溢出,尽管我到处都选择了 highp ?

0 投票
1 回答
757 浏览

ipad - iOS上片段着色器中奇怪的GLSL浮点颜色值

我正在尝试在 iPad2 上编写一个简单的 GLSL 片段着色器,我遇到了一个奇怪的问题,即一旦像素值作为纹理的一部分转换为浮点数,OpenGL 似乎表示 8 位“红色”值的方式上传。我想要做的是传入包含大量 8 位表索引和实际像素值的 32bpp 表的纹理。

我的纹理数据看起来像这样:

然后绑定每个纹理并像这样上传纹理数据:

我确信纹理设置和统一值按预期工作,因为片段着色器主要使用以下代码:

上面的代码采用 8 位索引并在 lut 中查找 32bpp BGRA 像素值。我不明白的部分是这个 42.5 值在 OpenGL 中定义的位置。我通过反复试验找到了这个比例值,并且我已经确认每个像素的输出颜色都是正确的(意味着每个 lut 表查找的索引是正确的),值为 42.5。但是,OpenGL 究竟是如何得出这个值的呢?

在查看此OpenGL 手册页时,我发现在将 8 位“索引”值转换为 OpenGL 内部使用的浮点值时似乎使用了两个颜色常量 GL_c_SCALE 和 GL_c_BIAS。这些常量在哪里定义,我如何在运行时或编译时查询值?“索引”表的实际浮点值是这里的真正问题吗?我不明白为什么 texture2D(indexes,...) 调用会返回这个时髦的值,是否有其他方法可以获取适用于 iOS 的索引的 int 或 float 值?我尝试查看 1D 纹理,但它们似乎不受支持。

0 投票
1 回答
1822 浏览

opengl-es-2.0 - 在opengl es 2.0中为颜色分配整数值

我需要按字节类型或整数设置颜色,而不是浮点值。我怎样才能将这种类型分配到gl_FragColor?将该值除以 256 不会给我想要的精度。我的主要目的是知道颜色缓冲区中每个位的具体值,如果我只用特定的颜色画线。例如,我希望在像素的红色值的颜色缓冲区中只有 2 lsbits 将打开,我应该转移到什么颜色值gl_FragColor?如果我可以选择写入字节类型值,我会将值 3 写入红色组件谢谢

0 投票
1 回答
2708 浏览

opengl-es - “#line 0”在 GLSL 中有效吗?

我的 GLSL(OpenGL ES 2.0,“#version 100”)着色器无法在 Vivante GC800 GPU 上编译。着色器在许多其他 GPU 上编译良好。

我得到的错误是:

我用

在包含一堆前导码后重置行号(如#version在“真实”着色器之前任何人都知道这是 Vivante 着色器编译器被破坏的情况,还是其他所有人的着色器编译器都过于宽松?

我的解决方法是仅在本地调试我的着色器时包含此指令。

0 投票
1 回答
247 浏览

ios - 编译 GLSL 着色器会破坏其他着色器

在我在 iPad 模拟器上运行的 iOS 项目中,我有 3 个着色器程序,每个程序都使用相似但不相同的属性和制服集。这些着色器中的前两个完美地编译和工作,在编译或绘图过程中的任何时候都没有 gl 错误。我现在需要添加第三个着色器,这导致了一个问题:现在,其他两个着色器都没有绘制任何东西,当我尝试使用 glUniform 传递制服时,glGetError 返回 1282 (GL_INVALID_OPERATION)。glGetError 在调用 glUniform 之前的行返回 0。

我相信我在尝试调用 glUniform 之前已将程序设置为正确的程序,因为当我在传递制服之前使用 GL_CURRENT_PROGRAM 调用 glGetIntegerv 时,它与我尝试使用的程序的 gl 名称匹配(我调用 glUseProgram 与我想在问题 glUniform 调用的方法的开头使用的程序)。glGetError 在编译问题着色器之前和之后返回 0。编译代码是从 Apple 的一个示例项目中稍微修改的,我看不出它会影响其他着色器的状态。

0 投票
1 回答
946 浏览

android - 如何从 opegles 着色器中读取变量?

我正在为 Android 编写一个粒子过滤器应用程序。我希望 GPU 并行处理所有粒子。

我在顶点着色器中有代码可以根据当前位置更新每个粒子或顶点的位置,但我不知道如何将更新后的位置写回openGLES,甚至不知道如何将其提供给着色器处理下一次运行相同的顶点。

属性变量具有适当的范围,但只能在顶点着色器中读取。

统一变量有适当的范围,但你不能做数组(所以很难为大量顶点实现统一)。同样,它们只能在顶点着色器中读取。

可变变量具有允许修改的范围,但它们仅对程序中的片段着色器可见。如果片段着色器可以将信息写入openGLES,这可能会起作用。片段着色器可以修改属性变量(用于下一次运行)吗?

片段着色器有没有办法更新任何变量?{属性,统一,变化,默认,其他}或者可能写出一个缓冲区而不是显示器而不是内存?

0 投票
3 回答
13451 浏览

javascript - 如何在 glsl / webgl 中将一个 32 位整数打包成 4、8 位整数?

我正在寻找并行化一些复杂的数学,而 webgl 看起来是实现它的完美方式。问题是,您只能从纹理中读取 8 位整数。理想情况下,我希望从纹理中获得 32 位数字。我的想法是使用 4 个颜色通道来获得每像素 32 位,而不是 4 乘以 8 位。

我的问题是,glsl 没有“%”运算符或任何位运算符!

TLDR:如何使用 glsl 中的运算符将 32 位数字转换为 4 个 8 位数字。

有关该技术的一些额外信息(使用按位运算符):

如何将一个 64 位整数存储在两个 32 位整数中并再次转换回来