问题标签 [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 投票
2 回答
1865 浏览

opengl - GLSL:无法从 FBO 读取纹理并使用片段着色器渲染到另一个 FBO

我正在尝试“读取”附加到第一个 FBO(fboA)的纹理,修改它(使用片段着色器)并渲染到第二个 FBO(fboB)。

我无法弄清楚,我得到的只是黑色或白色纹理。

这是代码:

这是片段着色器代码:

我希望在 fboB 中呈现更暗的纹理,但我只得到全黑纹理。如果我写,也会发生这种情况gl_FragColor = texture2D(texture, gl_TexCoord[0].st);

相反,如果我gl_FragColor = vec2(1.0, 0.0, 0.0, 1.0);正确地写了一个全红色的纹理作为输出。

如果我注释掉该glUseProgram()语句,则代码可以正常工作,并且 fboB 中的纹理是 fboA 中纹理的精确副本。

为什么会发生这种情况?我错过了什么吗?

0 投票
1 回答
1205 浏览

javascript - WebGL 渲染到纹理 - 如何将数据写入 Alpha 通道?

作为序言,我试图复制本文http://http.developer.nvidia.com/GPUGems2/gpugems2_chapter19.html中描述的水渲染算法。该算法的一部分需要将 alpha 蒙版渲染到帧缓冲区中,以便稍后用于原始渲染场景的纹理采样。简而言之,算法如下所示:

  1. 将场景几何体渲染到纹理S中,跳过折射网格并将其替换为 alpha 蒙版
  2. 如果纹理 S 在 alpha 蒙版内,则通过扰动采样纹理S来渲染折射网格,否则直接采样纹理S

不幸的是,我仍在学习 WebGL,而且还没有真正了解如何解决这个问题。此外,那篇文章使用了 HLSL,而且转换对我来说很重要。显然,尝试在片段着色器中执行此操作是行不通的:

因为它只会与之前渲染的几何体混合,并且 alpha 值仍然是 1.0。

以下是我所拥有的简要介绍:

整个代码可以在http://scottrabin.github.com/Terrain/找到

0 投票
1 回答
523 浏览

opengl-es - 片段着色器 - 再现蓝色通道电平输出滑块

我正在尝试创建一个片段着色器,它将与 Photoshop 级别输出滑块完成相同的工作。我想在特定频道上执行此操作(在本例中为蓝色)。

我有如下代码:

这对生成的图像没有影响,所以我认为我可能需要对这条线做更多的事情:

谁能帮我指出正确的方向?

谢谢

0 投票
0 回答
2028 浏览

ios - iOS - 将 UIImage 作为纹理传递给着色器

我正在尝试将UIImage传递给 GLSL 着色器。片段着色器是:

我想要做的是从相机发送图像并与纹理进行多重混合。当我只是从相机发送数据时,一切都很好。所以问题应该是向着色器发送另一个纹理。我这样做是这样的:

纹理的统一很好,glGetUniformLocation函数不返回 -1。纹理是分辨率为 2000x2000 像素的 PNG 文件。

问题:当纹理传递给着色器时,我得到了“黑屏”。也许问题是CGContext的参数或函数glTexImage2D的参数

更新:我刚刚发现我需要将纹理单元编号传递给每个绘制周期,并且一切正常。真的有必要这样做吗?

谢谢

0 投票
1 回答
7569 浏览

opengl - 实现使用统一 Sampler2D (lwjgl) 的片段着色器

我无法成功运行着色器,而且我似乎遗漏了一些步骤来使其全部正常工作。我最终得到以下错误:

我的初始化开始于:

createShader 方法如下所示:

然后我将着色器附加到特定的 Sprite:

这很简单:

int着色器之前已在 Sprites 构造函数中初始化为:

这是以前的问题,但不再明显。现在我在 Sprites(在本例中为两个)draw 方法中找到实际错误发生的位置,如下所示:

错误发生在这一行:

并作为参考我的着色器:

我已经阅读了教程,阅读了有关错误的信息,但我无法弄清楚我错过了哪一步。

0 投票
1 回答
1717 浏览

opengl-es - 使用片段着色器在 Photoshop 中重新创建曲线工具

我在使用片段着色器在 Photoshop 中重新创建曲线工具(又名 newb)时遇到了真正的麻烦:

Photoshop 曲线工具

我将如何在蓝色通道上创建一条像上面的 S 曲线?

0 投票
2 回答
314 浏览

opengl-es - 更大的 GLSL 片段输出,没有多个缓冲区附件

有什么办法可以排放更多,例如。来自 GLSL 片段着色器的 4 个字节,如果实现不支持多个 FBO 缓冲区附件或“深”缓冲区格式?

例如,在使用 WebGL 或 OpenGL ES 时,如果必须在多个通道中重复部分计算以获得更多输出通道,则每个片段被限制为 RGBA 输出会使复杂的计算效率极低。

0 投票
1 回答
18079 浏览

opengl - 使用 GLSL 从 sampler2D 中查找特定坐标中的像素颜色

我的场景中有一个 3D 对象,该对象的片段着色器接收到与屏幕大小相同的纹理。我想从当前片段中获取坐标,并在同一位置找到图像上的颜色信息。这可能吗?有人可以指出我正确的方向吗?

0 投票
1 回答
1829 浏览

opengl-es - GLSL Shader - 2D 对象的 Coverflow 反射

我想编写一个着色器来创建类似于用于coverflows的图像反射。

但是这个着色器正在创建以下内容: 当前结果 而且我不知道如何水平“翻转”图像,我在旋转矩阵中尝试了很多不同的参数(我什至尝试使用所谓的“镜像矩阵”)但我不知道如何在原始图像的底部反映图像。

0 投票
2 回答
2082 浏览

opengl - 片段着色器中的 GLSL 原子计数器(和分支)

片段着色器使用两个原子计数器。它可能会或可能不会增加第一个,可能会或可能不会增加第二个(但绝不会同时增加)。然而,在如此修改计数器之前,它们的当前值总是被读取,并且——如果后来修改了计数器——那些先前读取的用于某些自定义逻辑的值。所有这些都发生在一个(很可能是不可滚动的)循环中。

设想一个大致如下的流程:

  • 在一些小的不可滚动循环中,比如 FOR 0-20 (compile-time resolvable const) ...
  • 获取 AC1 和 AC2 的计数器值
  • 检查一些值:
  • 如果 x:在索引 AC1 处设置 uimage1D_A 中的纹素,增加 AC1
  • else: 设置 uimage1D_B 中的纹理像素 (imgwidth-AC2-1),增加 AC2

问题:着色器查询当前的计数器值——它总是得到“最新”的值吗?我是否在这里失去了片段着色器的大规模并行性(仅就当前和未来的 GPU 和驱动程序而言)?

至于分支(如果 x)——我将另一个 ( readonly restrict uniform)uimage1D中的纹素与 ( uniform)进行比较uint。所以一个操作数肯定是一个统一的标量,但另一个是一个imageLoad().x虽然图像是统一的——这种分支是否仍然“完全并行化”?您可以看到两个分支都恰好是两个几乎相同的指令。假设一个“完美优化”的 GLSL 编译器,这种分支是否可能会导致停顿?