问题标签 [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.
glsl - WebGL 是否支持一维纹理?
我一直在努力寻找一个明确的答案,但似乎没有人明确提出这个问题。
我可以在 WebGL Chrome、Firefox、Safari、IE 等中使用 1D 采样器和 1D 纹理吗?
编辑
可以理解,1 确实是 2 的幂 (2^0=1),这意味着您可以有效地使用 2D 采样器和使用高度为 1 和宽度为 256 或 512 等的纹理来复制一维纹理。
1D 纹理没有实际意义,它们之所以存在,是因为它们不仅有目的,而且旨在转化为 GPU 本身的优化(与 2D 纹理相反)。请记住,每个参数都需要时间加载到调用堆栈上,几乎所有 GPU 编程都是优化每一个可能的操作的艺术。
计算着色器经常需要一个没有额外维度的浮点列表,使用 1D 纹理和采样器提供与强类型相同的清晰度。即以一维结构表示一维数据,并以二维结构表示二维数据。它还删除了索引到行/列转换所需的额外操作。
问题不是他们是否有充分的理由,而是他们是否得到支持。
截至2014 年 5 月 9 日,在基于OpenGL ES 2.0的WebGL 1.0中
- 当前没有 1D 纹理或采样器支持。
java - 可编译和可运行的 JOGL 应用程序不绘制三角形
我正在尝试在基于 Java AWT 的应用程序中使用 JOGL。
我是 OpenGL 的新手,所以我从一个经典的绘制三角形示例开始。
我正在使用 OpenGL ES 2.0。
在网上看了几个教程并花了很多时间在我的代码上倾泻而下,我不知道为什么我的其他可编译和可运行的程序(即没有直接抛出异常)除了清晰的颜色之外没有绘制任何东西。
顶点数据、着色器代码和 gl 设置过程均取自教程。
顶点着色器代码:
片段着色器代码:
顶点数据:
我这样设置'vPosition':
初始化时:
展示中:
但是,除了我之前在“显示”中指定和调用的青蓝色清晰颜色之外,我在屏幕上什么也看不到。
我尝试了各种不同的配置,尝试指定模型视图和投影矩阵,并将 vPosition 乘以这些。但是我正在看的教程对任何矩阵都没有做任何事情并且仍然绘制一个三角形。我只是没有得到我所缺少的东西,希望一双有更多经验的新眼睛可以提供帮助。
谢谢。
opengl-es - 在 WebGL 项目中使用 GLSL 设置 3D 对象的位置
我正在尝试使用 GLSL 语言完成位置设置。
首先,当我看到这样的台词时:
我想,我可以aVertexPosition
从函数输入中设置。另外,我正在使用 GLSL 1.2(OpenGL ES 和 WebGL 也使用它),并且该项目是使用 JavaScript/WebGL 的 web one。
我可能已经为您未来的问题说了这些信息,但我认为,对于这种情况,主要的应用程序逻辑语言(C++ 或 JS)是什么并不重要,因为问题恰好发生在阴影部分,不符合应用的逻辑之一。
所以......回到代码行......当我看到上面的行时,我想,我可以把它改成这样:
但是,当我尝试执行这样的逻辑时,控制台中出现错误:
为什么我认为它可以工作?因为当我尝试类似的事情时fragment-shader
,当我为网格设置颜色时,它工作得很好:
所以设置颜色fragment-shader
确实有效,但设置位置vertex-shader
- 不,为什么?
另外,我认为,通过 GLSL 进行位置设置的逻辑不能看起来像那样,但这只是我的建议。
还有一种方法不是从 GLSL 而是从 JS 部分设置位置:
但如果可能的话,我想知道通过 GLSL 语言设置它。因为我正在为我的程序准备 OO 解决方案,并且希望使用我的库的用户能够从构造函数中设置对象的位置,例如:
ios - GLSL 程序在某些 iOS 硬件上间歇性失败
我遇到了一个问题,对片段着色器的更改会暂时中断渲染。着色器编译;编译步骤、链接步骤或 glValidateProgram() 没有错误条件或日志输出。但随后对 glDrawArrays() 的调用返回 GL_INVALID_OPERATION,没有绘制任何内容,并且应用程序变得非常缓慢或无响应。
但是,当我从我的主要开发设备(iPad 2)切换到其他硬件(iPhone 5s 和 iPad Mini)时,相同的代码可以完美运行。奇怪的是,如果我随后重新连接到 iPad 2,问题就消失了,我可以继续在该设备上开发着色器。同样的循环现在已经重复了好几次:我修改并向着色器添加了一些新代码,问题又出现了。我切换到较新的设备,代码运行良好,切换回 iPad 2,问题神秘地消失了(有时),我可以继续工作。一旦它再次开始工作,它似乎会继续工作。但是,使用下面的代码,我现在似乎陷入了解决方法无济于事的地步。
我的预感(或希望)是我的代码中的某些内容正在通过编译器,但在某种程度上有些冒险,某些硬件接受它(A7 和 SGX 543)但有些不接受(SGX 535)。也许解决方法的间歇性只是一个红鲱鱼。如果没有这样的问题,我欢迎任何其他故障排除建议。
代码很长,所以我摘录了与这个问题的最新迭代相关的部分。以前的迭代只涉及添加几行看似无害的代码。
libgdx - Adreno GPU 上的着色器代码错误
我正在编写页面卷曲效果(使用 libGdx)。我的代码在 Mali GPU (Samsung S3) 上运行良好,但在 Adreno GPU (Samsung Ace) 上却出错了:
编译时返回的错误代码是:
我花了2天,但仍然无法解决这个问题。帮我!
opengl-es - 使用哪种 GLSL 多色线性/径向渐变策略?
我正在使用 OpenGL ES 2 和 GLSL 进行开发,但我一直坚持如何处理多色/分段渐变(线性和径向)。
我不知道哪种方法是最佳实践:
- 获取渐变颜色的纹理并在片段着色器中对其进行采样(基本上使用常规纹理)。
- 计算机首先生成渐变纹理并在上面的片段着色器中对其进行采样(不需要渐变的 PNG 等) - 缓存此纹理以保存再生。
- 在片段着色器中使用插值来按片段位置计算片段值 - 这看起来我必须使用多个 ifs、一个循环、你不希望每个片段执行的东西。
- 其他我没有想到的策略。
我知道这个问题有点主观,但是在网上四处寻找信息后,我没有找到任何关于如何进行的具体信息......
gpu - Mali-400MP GPU 的输出不对称且不准确
我有以下简单的片段着色器:
我正在使用帧缓冲区对象渲染到纹理。从帧缓冲区读回值时,我得到以下信息:
38, 38, 38, 38, 39, 39, 39, 39,38, 38, 38, 38, 39 等
0.15*255 = 38.25 所以我希望所有像素都能得到 38,我确实在我的桌面 GPU(英特尔 4000)和 Tegra 3 上得到了。如果有人能对这个问题有所了解,我会很高兴。由于三星 Galaxi s2、s3 和 s3 mini 中使用了 Mali-400MP,因此对于为移动设备开发 GPGPU 的任何人来说,这都是至关重要的。
opengl - GLSL 可以生成 z 值的 *sum* 吗?
我正在尝试将透明对象渲染到缓冲区中。我想粗略估计从近剪切平面到网格中每个片段的距离总和(不仅仅是最近的片段)。我知道读取(当前总数)和写入(新总数)到 SIMD 架构中的缓冲区的并发问题,但我正在尝试找到一种方法来做到这一点。
为了清楚起见,我将包含一些 ASCI-art 来说明我的问题:
所以,这条线代表一个屏幕像素,&在那个像素内,我想记录一个值是所有距离的总和:A、B、C和D。(而不仅仅是D,就像在正常的z -缓冲。)
关于如何使用着色器完成此任务的任何想法?WebGL 会更好,但直接的 OpenGL 也是一种选择。
texture2d - GL_TEXTURE_EXTERNAL_OES texture2D 坐标是否标准化?
我知道除了 GL_TEXTURE_RECTANGLE 之外,大多数纹理都是标准化的。
但是,我找不到关于 GL_TEXTURE_EXTERNAL_OES 的信息。坐标是标准化的还是在 [0, imageWidth], [0, imageHeight] 的范围内?
如果您提及您从哪里获得信息,我也将不胜感激。我在khronos 网站上找不到它。
c++ - OpenGL 4 和 ES 3.0 与 packHalf2x16 / unpackHalf2x16 的差异
我很想问一个简洁的问题,可以得到一个明确的答案,但我担心关于 FBO 初始化有太多我不完全理解的小事情需要澄清。我正在编写一个针对 OpenGL 4.3 和 OpenGL ES 3.0 的延迟着色器,前者的行为完全符合我的预期,但后者给了我无法识别来源的问题。
首先,我将描述我对为 GL 4.2 和 ES 3.0 设置 MRT FBO 的理解/困惑,并希望有人能够纠正任何误解。
OpenGL ES 3.0 规范说它支持“四个或更多渲染目标”,但没有提及(我能找到)这些渲染目标的规范。对这些渲染目标的大小有什么安全的假设?我可以简单地假设它可以具有
RGBA32F
(四个 32 位浮点通道)的内部格式吗?在我看来,这是着色器写入 RT 的关键假设/知识。是否通用程序:尝试创建具有特定规范的 FBO,然后测试 FBO 的完整性?如果失败:减少要求并使用替代着色器来补偿减少的位深度?精度限定符据说“有助于 OpenGL ES 的代码可移植性,并且对常规 OpenGL 没有影响”,但我发现很难理解这些
highp
,mediump
,lowp
, 到底是做什么用的,以及它们如何与渲染目标。首先,我假设渲染目标的位深度是在 FBO 中确定和配置的,并且精度限定符会自动匹配这个,这让我认为high
,medium
并且与深度位有low
某种关系。我已经看过了,这并不是很清楚。32
16
8
OpenGL ES 3.0 specs
FBO 的纹理附件是使用
glTexStorage2D
(withtarget=GL_TEXTURE_2D
,levels=1
) 配置的,我认为在这里使用它比 更正确glTexImage2D
,因为只有internalformat
应该重要。COLOR_ATTACHMENT
然后使用(3.) 将配置的纹理附加到 FBOglFramebufferTexture2D
。
它变得奇怪的地方(packHalf2x16
/ unpackHalf2x16
):
假设我为 FBO 设置了两个颜色附件,第一个 ( RT1
) 带有 internalformat GL_RGBA32UI
,第二个 ( RT2
) 带有GL_RGBA32F
. 对象分两次渲染。第一个是 FBO 的 RT,然后是两个由默认帧缓冲区处理的全屏四边形。
为简化起见,我将只关注在两个阶段之间传递 RGB 颜色数据。我试图以三种不同的方式这样做:
[适用于 GL 和 ES]使用
RT2
, 将颜色数据定期存储为浮点数,将其读取为浮点纹理并将其输出到默认帧缓冲区。[适用于 GL 和 ES]使用
RT1
,存储转换为uint
(在[0,..,255]
每个通道中)的颜色数据,将其作为uint
纹理读取,将其转换为浮点数[0,1]
并将其输出到默认帧缓冲区。[仅适用于 GL]使用
RT1
,将颜色数据打包到一个半通道中,使用packHalf2x16
. 将其作为uint
纹理读取,然后使用unpackHalf2x16
.
不确定代码细节的相关性/重要性(我会迅速跟进任何请求)。我highp
同时使用float
和int
。第一遍的渲染目标定义为:
在第二遍中,作为纹理访问:
方法1.
:
方法2.
:
方法3.
:
在方法1
、2
和3
中,桌面 GL 输出如下所示:
在 Nexus 5 上,方法1
和2
OpenGL ES 3.0 输出如下所示:
然而,nexus 5 上的方法3
如下所示:
我无法弄清楚为什么第三种方法在 OpenGL ES 3.0 上失败。任何帮助或建议将不胜感激。我并不反对阅读文档,所以如果您只想为我指明正确的方向,那也会有所帮助。