问题标签 [glsl]
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 - How to calculate gl_FragCoord in glsl
Ok, in my GLSL fragment shader I want to be able to calculate the distance of the fragment from a particular line in space.
The result of this is that I am first trying to use a varying vec2 set in my vertex shader to mirror what ends up in gl_FragCoord
:
Now in the fragment shader I expect:
But it does not. What operation does the pipeline do on gl_Position
to turn it into gl_FragCoord
that I am neglecting to do on fake_frag_coord
?
c++ - 计算 3D 切线空间
为了在 GLSL 着色器中使用法线贴图,您需要知道每个顶点的法线、切线和双切线向量。RenderMonkey 通过为此提供它自己的预定义变量 (rm_tangent
和rm_binormal
) 使这变得容易。我正在尝试将此功能添加到我自己的 3d 引擎中。显然,可以使用每个顶点的 xyz 坐标、uv 纹理坐标和法线向量来计算三角形中每个顶点的切线和双切线。经过一番搜索,我设计了这个函数来计算三角形结构中每个顶点的切线和双切线。
当我使用这个函数并将计算的值发送到我的着色器时,模型看起来几乎就像它们在 RenderMonkey 中所做的一样,但它们以一种非常奇怪的方式闪烁。我将问题追溯到我发送 OpenGL 的切线和双切线。这让我怀疑我的代码做错了什么。任何人都可以看到任何问题或对其他尝试方法有任何建议吗?
我还应该指出,上面的代码非常hacky,我对发生的事情背后的数学知之甚少。
opengl - opengl如何决定使用哪个mip级别?
这个问题是相当不言自明的。我问的是使用可能来自任何地方的纹理坐标(一个统一的,一个变化的,另一个纹理提取)。
例如,我在 mipmaped(或各向异性过滤)纹理上进行纹理提取,并使用在顶点着色器中设置的变量的平方。我假设 glsl 无法确定像这样的任意复杂函数的导数,那么它如何知道要使用哪个 mip 级别?
谢谢。
opengl - 如何处理 OpenGL 索引缓冲区数组中的多个纹理以与数据着色器一起使用?
我正在尝试实施这篇论文。我已经完成了大部分工作,但是关于将任意非几何数据发送到着色器以用于确定和显示几何边缘的部分给我带来了问题。我已经成功地使用我对 VBO 的了解成功地发送了我的大部分数据。但是,我需要发送大量数据,这就需要使用多个纹理坐标。
我已经实现了几种我认为设置多组纹理坐标的正确方法的变体,并遵循了许多论坛海报的说明。到目前为止,没有任何解决方案有效。
对于上下文,该程序为模型中的每个唯一边发送 4 个几乎相同的副本,其中包含一组 4 个顶点、2 个法向量、一个浮点数和一个整数(存储为浮点数)。我已经这样排列了数据:
4 个副本之间的唯一区别是 i 值,它有助于确定在找到可绘制边时如何组织顶点。
如您所见,我至少需要 3 个纹理坐标。我能够让第一个工作正常(gl_MultiTexCoord0),但是任何后续纹理坐标,虽然在显卡上,似乎有无法控制的行为,有时工作,但通常不是。
我的渲染函数曾经看起来像这样:
这是我原来的。它绝对适用于 v0、v1 和 v2。它似乎适用于“r 和 i”,但这可能是一种错觉。我还没有能力测试 n0 或 n1。v3 绝对行不通。如您所见,我将它们绘制为点,这告诉我它们是否存在(通过着色器)。v0、v1 和 v2 都在那里。尝试对 v3 执行相同操作会在原点处产生一个点,或者根本没有。
在网上查看建议后,这是我的新设置:
请注意我是如何围绕每个纹理坐标列表的实际“加载”完成glEnableClientState
/调用的。glDisableClientState
我也使用glActiveTextureARB
和glEnable(GL_TEXTURE_2D)
。虽然我想我可能明白为什么glActiveTextureARB
需要这里,但另一个让我感到困惑。根据GLSL 常见错误页面glEnable(GL_TEXTURE_2D)
,当您制作自己的着色器时不应该使用,因为无论如何使用着色器都会忽略此调用。
就是这样了。我已经走了这么远,但找不到任何专门解决如何在纹理坐标中发送非纹理坐标数据的教程。也许如果有人知道这方面的教程,我的问题就会得到缓解。谢谢你的时间!
javascript - HTML 5 过滤器语言或过滤器语言的一些类似物?
是否有 HTML 5 过滤语言或过滤语言的类似物?像 GLSL / HYDRA / HLSL 或者只是 JS 像素过滤器/着色器库?
glsl - 如何在 glsl 中执行位操作
如何在 glsl 中执行位操作?
使用常规 C 风格的位运算符|
, &
, ^
, or!
不起作用。
opengl - 片段着色器:输出变量
阅读 GLSL 1.40 规范:
片段输出只能是浮点、浮点向量、有符号或无符号整数或整数向量,或任何这些的数组。不能输出矩阵和结构。片段输出在以下示例中声明:
出 vec4 FragmentColor; 输出单位亮度;
片段颜色定义为 gl_FragColor... 对吗?有人可以清除我对这些输出的想法吗?我可以只写示例的“FragmentColor”来确定片段颜色吗?我可以复读它们吗(例如“光度”)?
opengl - 如何使用 GLSL 渲染多个纹理
我即将将我所有的渲染从“旧”opengl 移植到 glsl。
现在我有一个具有不同纹理的网格,所以在“旧”gl 中我只是使用 bindTexture 来更改纹理。我想,我仍然需要这样做,但是缺少一些东西,因为我的一切似乎都只用第一个纹理渲染。
“tex”是我这样放在 glsl 中的纹理名称:
注意:我不是在谈论多重纹理!:-)
c++ - 着色器限制
我一直在为我的笔记本电脑调整我的游戏渲染器,它有一个 Radeon HD 3850。这个芯片具有相当大的处理能力,但内存带宽相当有限,所以我一直在尝试将更多的着色器工作转移到更少的通道中。
以前,我使用的是简单的多通道模型:
-
绑定并清除 FP16 混合缓冲区(带深度缓冲区)
- 仅深度通行证
- 对于每个灯光,做一个附加的灯光通道
-
绑定后台缓冲区,使用混合缓冲区作为纹理
- 色调映射通道
为了提高这种方法的性能,我编写了一个新的渲染路径,它计算灯光的数量和类型,以动态构建自定义 GLSL 着色器。这些着色器接受所有光照参数作为制服,并在一次通过中完成所有光照。我预计会遇到某种限制,所以我先用一盏灯对其进行了测试。然后三个。然后是 21 个,没有错误或伪像,并且表现出色。这引出了我的实际问题:
制服的最大数量是可取的吗?
这种方法在旧硬件上是否可行,还是制服更受限制?
如果我把它推得太远,我会在什么时候收到错误?着色器编译?程序链接?使用程序?