问题标签 [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.
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 中纹理的精确副本。
为什么会发生这种情况?我错过了什么吗?
javascript - WebGL 渲染到纹理 - 如何将数据写入 Alpha 通道?
作为序言,我试图复制本文http://http.developer.nvidia.com/GPUGems2/gpugems2_chapter19.html中描述的水渲染算法。该算法的一部分需要将 alpha 蒙版渲染到帧缓冲区中,以便稍后用于原始渲染场景的纹理采样。简而言之,算法如下所示:
- 将场景几何体渲染到纹理S中,跳过折射网格并将其替换为 alpha 蒙版
- 如果纹理 S 在 alpha 蒙版内,则通过扰动采样纹理S来渲染折射网格,否则直接采样纹理S
不幸的是,我仍在学习 WebGL,而且还没有真正了解如何解决这个问题。此外,那篇文章使用了 HLSL,而且转换对我来说很重要。显然,尝试在片段着色器中执行此操作是行不通的:
因为它只会与之前渲染的几何体混合,并且 alpha 值仍然是 1.0。
以下是我所拥有的简要介绍:
opengl-es - 片段着色器 - 再现蓝色通道电平输出滑块
我正在尝试创建一个片段着色器,它将与 Photoshop 级别输出滑块完成相同的工作。我想在特定频道上执行此操作(在本例中为蓝色)。
我有如下代码:
这对生成的图像没有影响,所以我认为我可能需要对这条线做更多的事情:
谁能帮我指出正确的方向?
谢谢
ios - iOS - 将 UIImage 作为纹理传递给着色器
我正在尝试将UIImage传递给 GLSL 着色器。片段着色器是:
我想要做的是从相机发送图像并与纹理进行多重混合。当我只是从相机发送数据时,一切都很好。所以问题应该是向着色器发送另一个纹理。我这样做是这样的:
纹理的统一很好,glGetUniformLocation函数不返回 -1。纹理是分辨率为 2000x2000 像素的 PNG 文件。
问题:当纹理传递给着色器时,我得到了“黑屏”。也许问题是CGContext的参数或函数glTexImage2D的参数
更新:我刚刚发现我需要将纹理单元编号传递给每个绘制周期,并且一切正常。真的有必要这样做吗?
谢谢
opengl - 实现使用统一 Sampler2D (lwjgl) 的片段着色器
我无法成功运行着色器,而且我似乎遗漏了一些步骤来使其全部正常工作。我最终得到以下错误:
我的初始化开始于:
createShader 方法如下所示:
然后我将着色器附加到特定的 Sprite:
这很简单:
int着色器之前已在 Sprites 构造函数中初始化为:
这是以前的问题,但不再明显。现在我在 Sprites(在本例中为两个)draw 方法中找到实际错误发生的位置,如下所示:
错误发生在这一行:
并作为参考我的着色器:
我已经阅读了教程,阅读了有关错误的信息,但我无法弄清楚我错过了哪一步。
opengl-es - 使用片段着色器在 Photoshop 中重新创建曲线工具
我在使用片段着色器在 Photoshop 中重新创建曲线工具(又名 newb)时遇到了真正的麻烦:
我将如何在蓝色通道上创建一条像上面的 S 曲线?
opengl-es - 更大的 GLSL 片段输出,没有多个缓冲区附件
有什么办法可以排放更多,例如。来自 GLSL 片段着色器的 4 个字节,如果实现不支持多个 FBO 缓冲区附件或“深”缓冲区格式?
例如,在使用 WebGL 或 OpenGL ES 时,如果必须在多个通道中重复部分计算以获得更多输出通道,则每个片段被限制为 RGBA 输出会使复杂的计算效率极低。
opengl - 使用 GLSL 从 sampler2D 中查找特定坐标中的像素颜色
我的场景中有一个 3D 对象,该对象的片段着色器接收到与屏幕大小相同的纹理。我想从当前片段中获取坐标,并在同一位置找到图像上的颜色信息。这可能吗?有人可以指出我正确的方向吗?
opengl-es - GLSL Shader - 2D 对象的 Coverflow 反射
我想编写一个着色器来创建类似于用于coverflows的图像反射。
但是这个着色器正在创建以下内容: 当前结果 而且我不知道如何水平“翻转”图像,我在旋转矩阵中尝试了很多不同的参数(我什至尝试使用所谓的“镜像矩阵”)但我不知道如何在原始图像的底部反映图像。
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 编译器,这种分支是否可能会导致停顿?