问题标签 [fragment-shader]

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 投票
1 回答
394 浏览

c++ - 为什么我必须切换纹理单元才能让我的片段着色器识别要使用的纹理?

我有这个程序用于简单的测试目的。该程序创建两个 1-D 纹理并将它们传递给着色器。片段着色器非常简单。它只是在第一个纹理的索引 4 处提取纹素,并使该纹素成为颜色片段:

我正在绘制一个正方形,第一个纹理中索引为 4 的纹素包含 <1.0, 0.0, 0.0, 1.0>,它是红色的。因此,上面着色器的结果是一个红色方块。当我创建第二个一维纹理并将其传递给着色器时,问题就出现了。由于某种未知的原因,着色器不喜欢它,它不再起作用,并且绘制了一个黑色方块而不是红色方块。这是 C++ 代码:(函数“makeGLTexture”内的代码如下)。

完成纹理绑定的是函数“makeGLTexture”。这是里面的代码。

奇怪的是,如果我在创建第二个纹理后立即将活动纹理单元切换到第一个纹理的纹理单元,那么程序会再次运行,并绘制一个红色方块。

然后,该程序将再次运行。

我的问题是为什么会这样?着色器不是独立于纹理单元吗?难道我们只需要将纹理单元传递给采样器变量,就是这样吗?在这种情况下,为什么我必须将纹理单元更改回纹理单元零才能让着色器再次运行?到底是怎么回事?

0 投票
1 回答
2316 浏览

android - 如何设置可以在 Android OpenGL-ES 2.0 片段着色器中使用的纹理?

我尝试在 1 个片段着色器中访问 2 个纹理。

为此,我使用以下代码设置了 2 个纹理:

我尝试将它们与以下片段着色器结合起来:

不知何故,这不起作用,它只显示第二个纹理。

PS:我正在 Windows7 上开发着色器,但想在 Android 设备上使用 C++ 代码和带有 Android NDK 的着色器。

编辑:我让它工作,我在这里发布代码,以便其他人可以从中受益:

顶点着色器

片段着色器

使成为

0 投票
1 回答
2087 浏览

opengl - 片段着色器输出值

我将我的 alpha 通道用作与混合无关的 8 位整数索引,因此我想仔细控制位值。特别是,我需要一个 FBO 渲染纹理中具有特定 alpha 值的所有像素,以匹配着色器中具有相同 alpha 值的所有像素。经验告诉我在比较浮点值是否相等时要小心...

虽然使用浮点 vec4 设置颜色值可能不会给我带来问题,但我的理解是,即使是半精度 16 位浮点数也能够区分所有 8 位整数 (0-255) 值。但我更愿意在片段着色器中执行整数运算,所以我可以确定这些值。

在片段着色器中执行整数操作是否可能会导致性能下降?

输出如何缩放?我在某处读到,将整数向量作为片段的颜色输出发送是有效的。但它是如何缩放的?如果我发送一个整数 0-255 的 uvec4,它会适当地缩放吗?我希望它直接将整数值写入像素格式,对于整数格式,我不希望它进行任何缩放。也许对于 RGBA8 发送大于 255 的 int 值会将其钳制为 255,并将负整数钳制为零,依此类推。

这个问题很困难,因为除非我抓取渲染的图像并仔细检查它们,否则我无法通过打印出颜色值来进行调试。如果有些东西不匹配,也许我可以画出鲜艳的颜色。

是我在此主题上找到的相关主题。它比以前更让我困惑。

0 投票
1 回答
2886 浏览

shader - Three.js 中非常简单的自定义着色器 - 如何使其工作?

我正在尝试为 Three.js 制作最简单的自定义着色器,但我还没有弄清楚如何让它工作。我使用着色器的对象根本没有出现。

在我的页面html中,我有:

然后在javascript中:

对象应该在哪里,什么都没有。如果我用MeshLambertMaterial. 我错过了什么,我需要让它工作?

0 投票
1 回答
388 浏览

opengl-es - OpenGLSL 奇怪的效果 - 不确定原因

我有一个边缘检测着色器,它在渲染猴子和我的 HTC Desire HD 上都能正常工作。但是,它不适用于我的 LG 3D P920。这是着色器:

简而言之,我取中心像素并减去它周围的 8 个值。纹理为 512x512。

现在在 PC 和 Desire HD 上,这显示为主要是黑色的图像,彩色边缘突出显示。然而,在 LG 设备上,它显示为过度曝光的图像,但有相当多的噪点。

这感觉像是一个精度问题,正如你所看到的,我已经尝试提高精度,但我不知道还能尝试什么,或者我是否做得对。

这与此着色器无关,我有一个照明着色器,在此设备上似乎有噪点,但在其他设备上没有。

我也尝试过钳制最终值。

0 投票
1 回答
3636 浏览

shader - 是否可以在顶点着色器中访问多边形中的所有顶点?

我正在尝试在 Unity 中创建线框顶点/片段着色器。根据这篇论文似乎是可能的。一般的想法似乎是您将在顶点着色器中计算的距离向量传递给片段着色器中的每个片段,它可以使用它来确定根据线框线在多边形内的位置绘制线框线的亮度。

但是,从我读过的所有其他内容来看,您似乎只能访问顶点着色器中的单个顶点。对于 ecah 顶点,我需要访问多边形中的所有相邻顶点。该论文似乎暗示不需要几何着色器,这很好,因为 Unity 还不支持它们。

我错过了什么?是否永远不可能访问顶点着色器中的相邻顶点?如果没有几何着色器,我想做的事情是不可能的吗?

0 投票
1 回答
5369 浏览

glsl - 平滑低倍频程柏林噪声

我正在尝试使用此处找到的噪声函数在片段着色器中创建超级简单的 Perlin 噪声云。

在低八度音阶时,我的输出是,因为缺少更好的词,“blobby”。我只是想平滑这些斑点区域并具有平滑的噪音,但它比一个八度音程更详细一点。

片段着色器:

现场示例: http:
//glsl.heroku.com/e#1413.0

左边是我现在所拥有的。我怎样才能实现更符合正确图像的内容?

0 投票
2 回答
11170 浏览

opengl-es-2.0 - 2 个纹理,1 个着色器 - OpenGL ES 2.0

ES 2.0 新手在这里。我目前正在尝试使用 ES 2.0 和 PowerVR SDK 从立体图像制作一些 3D 隔行扫描图像。我可以很好地输出一个图像纹理,但是当我尝试输出第二个时,我似乎覆盖了第一个。所以,我的问题是,给定下面的片段着色器,我可以用它来绘制两个纹理,还是 sampler2d 制服只能绑定到一个纹理单元?这是片段着色器(取自 PowerVR“培训课程”示例程序):

以下是我将图像纹理加载到着色器中的方式:

那么,这段代码是否只是覆盖了 sampler2d 制服?第二张图像是否需要另一个制服或着色器?

0 投票
1 回答
122 浏览

opengl - 为使用数组着色的着色器设置动画

所以我有一种锯齿形图案,如下所示。之字形图案,由以下片段着色器创建:

我想通过让之字形向上移动来制作动画。

我的问题是,考虑到我正在使用数组来创建中位数的偏移量,我该怎么做?我不确定如何调整数组,以便在下一个动画步骤中,数组看起来像 (.1,.2,.1,0,-.1,-.2,-.1,0, .1)?

0 投票
1 回答
1857 浏览

shader - 从 WebGL 片段着色器中的浮点纹理访问非钳位值

当亮度值介于 0 到 4000 之间时,我正在尝试将画布上的亮度值矩阵渲染为图像。我正在使用 2D 浮点纹理来执行此操作,因为我听说它们提供的范围介于[-inf,inf]。

但是,当我在片段着色器中检索纹理值时,它们总是被限制在 [0, 1.0] 之间。具体来说,

texcolor.rgb 将始终介于 0 和 1.0 之间。如何访问我的片段着色器中的非钳位值,以便我可以自己进行规范化?

谢谢