问题标签 [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.
arrays - 索引表达式必须是常量 - WebGL/GLSL 错误
我在使用非常量 int 作为索引的片段着色器中访问数组时遇到问题。我已经删除了公式,因为无论如何它在这里没有多大意义,但我的代码旨在根据当前像素计算 tileID 并使用它来确定颜色。
这是我的代码:
显然 GLSL 不喜欢这样,我得到了错误:
'[]' : 索引表达式必须是常量
有谁知道我将如何解决这个问题?谢谢。
opengl-es - 基于纹理像素为平面着色
使用着色器我正在尝试为平面着色,以便复制纹理上的像素。纹理为 32x32 像素,平面在空间坐标中的大小也是 32x32。
有谁知道我将如何检查纹理上的第一个像素,然后用它为平面上的第一个正方形 (1x1) 着色?
生成的纹理示例:(第一个像素故意为红色)
此代码使用坐标为 (0,0) 的 vec2 无法按我的预期工作。我假设 (0,0) 处的颜色是红色,但不是,它是绿色:
我想我缺少一些东西,或者不了解 texture2D,因为 (0,0) 似乎也不是结束像素。
如果有人可以帮助我,将不胜感激。谢谢。
编辑:
感谢您的评论和回答!使用此代码,它现在可以工作:
也就是说,我遇到了每个“块”边缘的锯齿线问题。在我看来,我的数学已经关闭,并且对边应该是什么颜色感到困惑,因为我只使用顶点颜色时没有这个问题。任何人都可以看到我哪里出错或如何做得更好?
再次感谢!
opengl - 如何创建多个不同状态的PointSprite?
我正在尝试使用 Processing 2.0 的着色器。作为更好地理解点着色器的简单练习,我在 Sprite 类中实现了一个系统:
- 我在片段着色器中将 spritesheet 设置为统一的 sampler2D。2048x 2048(12 x 12 帧 128 像素正方形)
- 我创建一个点。
- 我在顶点着色器中为该点设置了 uv 坐标。
- 我将顶点着色器中的 UV 坐标偏移了一个作为统一变量传入的整数,以在 spritesheet 中选择“帧”
- 我在应用程序中每 5 帧更新一次整数(使用模数循环和)增加 UV 偏移量。
这意味着我可以在顶点着色器中做基本的动画序列。我不知道这是否是可取的,但我怀疑它会比每次我想更改帧时在片段着色器中设置一个新的统一 sampler2D 更好。
我的问题是 - 我如何在多个实例中使用这个着色器?如果我想同时在屏幕上显示两个精灵,每个精灵都有不同的值(即播放动画的不同帧),如果每个精灵都没有自己的 pointShader 并因此在内存中拥有自己的统一 Sampler2D 副本,如何实现这一点?
希望你能帮忙。
ios - 在 iOS 的片段着色器中循环与展开
我的片段着色器之一模拟了一些基本的 OpenGL ES 1.1 多纹理特性。
作为其中的一部分,我声明了以下 GLSL 函数:
k_GL_XXX
常量位于着色器的#defined
顶部。
为了执行多重纹理,这个函数被多次调用。对于 iOS 下的 SGX GPU,这是使用 for 循环成功完成的:
哪里u_cc3TextureCount
是 int 制服并且MAX_TEXTURES
是。#defined
2
奇怪的是,尝试手动展开此循环不起作用,并且不会绘制任何内容:
更奇怪的是,更基本的也没有:
至少可以说,这是完全出乎意料的行为!
我已经确认 is 的值u_cc3TextureCount
,2
因此所有这三种方法都应该产生相同的结果。
我试图展开循环的原因是几个 GPU,包括一些 Android GPU,以及 iPad Air 中的新 Apple A7 GPU 不能与循环正常工作。我正在尝试找到一种applyTexture()
多次调用该函数的方法,该方法适用于所有 GPU。
有人能向我解释为什么这种基本的循环展开不起作用吗?
android - OpenGL ES 3.0 矩阵数组仅使用第一个矩阵
我正在我的顶点着色器中进行 GPU 蒙皮,它在 PC 上运行良好,并且我正在移植到 Android。我的顶点着色器在下面,问题是matTransform矩阵的创建似乎只使用了boneMatrices中的第一个矩阵:
我已经证实:
1) 正确的矩阵被推入 boneMatrices
2) 正确的骨骼索引存在于 boneIndices
3) 正确的 boneWeights 存在于 boneWeights
4) 使用点符号(.x、.y、.z 和 .w)访问 boneIndices 的组件不会t 做出不同
5) 根本没有 OpenGL 错误,因为我在每次调用后检查错误,并且统一大小不是问题(如果我将 boneMatrices 增加 5 个额外的矩阵,每次我都会得到无效的操作错误将矩阵推送到着色器,但在这个大小和更低的情况下很好)
我通过执行以下操作检查了第 1、2 和 3 点(boneMatrices、boneIndices 和 boneWeights 是正确的):
1) 使用仅修改少数骨骼的特定动画(例如boneMatrix[6]),然后对boneMatrix[6] 进行硬编码并验证所有顶点都被这个单一矩阵正确修改,在PC 和Android 上具有相同的结果
2) 通过在顶点着色器中执行以下操作来绘制 boneIndices:
以及片段着色器中的以下内容:
在 PC 和 Android 上具有相同的颜色
3) 执行与上述相同的操作,但将 _colour 设置为:
我不知道还有什么可以尝试的,而且肯定似乎只使用了第一个矩阵,并且由于某种原因,int(boneIndices[x]) 对任何 x 都会导致 0。这是在带有 OpenGL ES 3.0 的 Nexus 5 上。帮助!
编辑:不幸的是,采用 Andon 的建议使用 ivec4 而不是 vec4 的 boneIndices 会导致相同的结果,但至少这清楚地表明这不是浮动的铸造问题。现在我觉得自己像个没有任何线索的警察:/
opengl-es - GLSL (ES 3.0):使用另一个制服的位置和偏移量来引用一个制服
在 GLSL for OpenGL ES 3.0 中,如果我有以下代码:
是否可以仅使用 matrix1 的位置加上偏移量来引用 matrix2 或 matrix3?这必须是动态的,即索引将是一个属性。
编辑:我的意思是在着色器本身中使用 matrix2 和 matrix3,只有 matrix1 的位置和一个偏移量,而不是在 CPU 上获取它们的位置。
编辑2:如果有帮助,我会添加更多上下文。我正在尝试解决这个GPU 蒙皮问题,我注意到 Adreno 不支持在其顶点着色器中使用除常量整数以外的任何内容来索引统一数组(与 OpenGL ES 3.0 GLSL 规范的要求相反)。我现在正在考虑一个接一个地单独存储矩阵数组,但是仍然需要能够使用作为属性提供的索引来访问它们。
opengl - 使用 GLSL 和 OpenGL 阴影映射无法正常工作
我有一个由 2 个网格(平面、立方体)、一个灯光和一个相机组成的场景。我想使用带有 GLSL 着色器和 OpenGL 的阴影映射技术在我的场景上显示阴影。
这是我得到的结果(为了简单起见,我的立方体和我的飞机都是蓝色和颜色):
这是 FBO 和深度纹理初始化:
这是我的顶点着色器的内容:
我的片段着色器之一:
如您所见,模型上有一些工件,我不知道如何撤回它们。但是阴影似乎是正确的,所以我的着色器中输入的变量也应该是正确的(我认为是这样)。
我在片段着色器中尝试了另一种技术,如下所示:
您会注意到我没有使用 sampler2DShadow,但现在使用的是 sampler2D。但正如您所见,没有显示任何阴影:
有人可以帮助我吗?
android - GLSL ES 3.0 - 顶点和片段着色器中的统一,以及最大顶点/片段统一向量
在 OpenGL ES 3.0 中,我们在顶点着色器和片段着色器中都有最少数量的统一向量可用:
如果我们有一个在顶点着色器和片段着色器中定义相同的统一体,它在编译程序中是否只存在一次,如果存在,它的存储空间从哪些限制中取反?
glsl - 从 glsl.heroku.com 学习 GLSL
我一直在研究 glsl.heroku.com 一段时间,但仍然无法弄清楚。希望你们中的一些人能在我不太明白的部分帮助我。谢谢!
我正在查看这个链接,我想知道它是varying vec2 surfacePosition;
从哪里来的,因为周围没有任何顶点着色器。还是我一直都没有意识到?
我看到一些帖子也有 3D 模型,显然是从某个地方链接的,但我不知道在哪里以及如何,因为该站点只显示片段着色器的代码。
我真的很感激任何帮助。谢谢!