问题标签 [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 回答
718 浏览

.net - D3D 性能比较,着色器与内置着色器

我有一个内置在 D3D 中的正在运行的 3D 引擎(通过 SlimDX)。为了避免打断渲染管道,我将许多具有相同材质的对象组合成更大的网格(以减少状态切换)。这运作良好,并为我的需要提供了良好的性能水平。

我遇到的问题是,在运行期间,我需要更改那些较大批量网格的某些子集的材质属性。我为此使用了属性缓冲区,并且它运行得相当好。我之前一直在使用有限数量的活动属性(每个网格大约 5 个),但现在发现需要对材料有更多的变化(不同的不透明度/颜色混合),因此最终可能有数百个或更多的组合。而且由于这些更改发生在运行时,我无法在渲染开始之前将它们捆绑在一起。当然我可以重新构建网格,但我宁愿不这样做,因为它很慢,并且需要以交互速度在材质之间切换回来和第四次。

所以我的问题是,最好的路线是什么?

  • 我是否应该实现一个更强大的属性处理系统,根据需要使用可用的属性 ID 动态屏蔽面部,然后在完成后重置它们?我听说属性缓冲区中的碎片会产生额外的性能影响,我也不确定后续 DrawSubset() 调用之间的材料切换(即何时太多以及何时应该优化我的属性数组?)。有这方面经验的人吗?

  • 我的另一个想法是使用参数化像素着色器。我不需要任何花哨的效果,只需要最低限度(当前是内置的平面着色器,仅具有颜色和某些对象的透明度),因此着色器模型 1 足以满足我的需求。这里的想法是使用一个通用着色器,而不是在调用之间切换材质,只需更改一些着色器参数。但我不知道这是否比切换材质更快和/或可编程着色器是否比内置着色器慢(给出相同的结果)。

我也很好奇切换网格或在一个大网格中绘制不同子集之间的性能差异(两种情况下的材质切换数量相同)。

我知道这些问题在 GFX 卡及其各自的性能/年龄之间可能会有所不同,但我只是在这里寻找一般指导方针,了解最关注什么(即哪种类型的状态开关/CPU 干扰最大) GPU命中)。内存也是一个问题,因此任何复制整个(或大部分)网格的实现对我来说都是不可能的。

我的重点是较旧(5 年)/功能较差/集成 GFX 卡的性能,而不一定是顶级游戏玩家卡或工作站卡(如 Quadro)。我猜这可能会根据特定板上着色器性能的好坏来使用着色器来制造或破坏解决方案。

非常感谢任何和所有建议和反馈。

提前谢谢了!

0 投票
4 回答
5742 浏览

c++ - 着色器限制

我一直在为我的笔记本电脑调整我的游戏渲染器,它有一个 Radeon HD 3850。这个芯片具有相当大的处理能力,但内存带宽相当有限,所以我一直在尝试将更多的着色器工作转移到更少的通道中。

以前,我使用的是简单的多通道模型:

  • 绑定并清除 FP16 混合缓冲区(带深度缓冲区)
    • 仅深度通行证
    • 对于每个灯光,做一个附加的灯光通道
  • 绑定后台缓冲区,使用混合缓冲区作为纹理
    • 色调映射通道

为了提高这种方法的性能,我编写了一个新的渲染路径,它计算灯光的数量和类型,以动态构建自定义 GLSL 着色器。这些着色器接受所有光照参数作为制服,并在一次通过中完成所有光照。我预计会遇到某种限制,所以我先用一盏灯对其进行了测试。然后三个。然后是 21 个,没有错误或伪像,并且表现出色。这引出了我的实际问题:

制服的最大数量是可取的吗?

这种方法在旧硬件上是否可行,还是制服更受限制?

如果我把它推得太远,我会在什么时候收到错误?着色器编译?程序链接?使用程序?

0 投票
2 回答
4518 浏览

opengl - 如何在处理中更改 GLSL 着色器参数

我正在使用处理在openGL中玩着色器。我对此很菜鸟,有点迷茫。

我发现这个线程有一个关于如何在处理中使用 GLSL 着色器的示例。

我只是想在我正在使用的着色器中更改 LightPosition 参数。我不知道如何访问它。

到目前为止,这是我的代码:

GLSL 类如下所示:

我正在使用3Dlabs 的 Philip Rideout 编写的卡通着色器。

这是顶点着色器:

这是片段着色器:

任何提示都会有所帮助。

0 投票
2 回答
518 浏览

python - 使用 pygtkglext 的着色器

有人知道如何让 glsl 着色器在 gtk-opengl 窗口中工作吗?使用 glut all glCreateProgrametc. 函数可以工作,但是当我尝试将相同的 gl 代码放入 pygtkglext 窗口时,它抱怨 NullReference:

那么我from OpenGL.GL.ARB.shader_objects import *,但结果是相似的:

任何想法都会有用。

0 投票
2 回答
2540 浏览

c++ - 使用每像素光照/法线贴图进行 2D 渲染 - directX

我正在寻找最简单、最简单和最快的技术来渲染具有每像素法线的 2D 纹理四边形。我的意思是一个 3D 世界,其中相机是固定的,所有纹理四边形都面向相同的方向(相机),它们之间会有光点,我希望纹理具有每个像素的法线值所以它们会像 3D 模型一样亮起。

我在网上找到的大多数技术都过于复杂和繁重,因为它们指的是真实的 3D 模型,而我所需要的只是简单的 2d 四边形。

有谁知道适当的技术或可以发布有用的教程?哦,只有DX请。

谢谢。

0 投票
1 回答
366 浏览

c++ - 在游戏中制作类似 Photoshop 的阴影

我正在制作一个游戏大小不同的游戏,所以我想制作自己的阴影。我正在使用的 api 可以填充矩形、制作椭圆、水平线等。并且支持 rgba。鉴于此,我怎么能做一个投影?我尝试制作黑色到白色的渐变并将 alpha 设置为 20%,但看起来不太好……我不确定它们是如何完成的。谢谢

0 投票
1 回答
135 浏览

wpf - IronPython:构建 WPF ShaderEffect 的麻烦

我正在尝试构建一个可扩展的程序,用户可以在其中构建自己的着色器效果。

谷歌搜索让我走到了这一步;

但我仍然得到错误;

TypeError:如果没有 ShaderEffect 的 python 子类,则无法访问受保护的成员 RegisterPixelShaderSamplerProperty。

任何帮助将不胜感激。

我能找到的网上最好的资源链接在这里

0 投票
1 回答
1174 浏览

xna - 在 XNA 问题中使用 3D Studio Max DirectX 着色器

更新 2:现在看来,这更像是一个建模问题而不是编程问题。哎呀。

我是 XNA 开发的新手,尽管我有 C# 经验,但我已经被困在一个地方两天了。

情况:我在 3D Studio Max 2010 中创建了一个模型,它使用两种材质,都是 DirectX 着色器类型。模型无错误地导出到 FBX,Visual Studio 可以正确编译它。当我最初运行 Draw() 方法时,它在我的一个循环的“BasicEffect”部分引发了异常,表明(至少对我而言)它正在正确加载 .fx 文件,该文件必须嵌入到 FBX文件什么的。

问题:使用以下代码时

唯一发生的事情是出现一个覆盖屏幕下半部分的白框,无论相机位置或角度如何。我得到了在 Max 中指定的 default.fx 文件的效果参数的名称(它位于 [program files]\autodesk\3ds Max 2010\maps\fx)。

我觉得我错误地设置了其中一个或所有这些。我试图查找教程并遵循他们的代码,但似乎没有一个适用于我的模型。

有什么帮助或想法吗?

更新: 通过进行这些更改:

该模型能够绘制。然而,一切都是白色的:(

0 投票
1 回答
1719 浏览

opengl - Cocoa 和 OpenGL,如何使用数组设置 GLSL 顶点属性?

我对 OpenGL 相当陌生,我似乎遇到了一些困难。我在 GLSL 中编写了一个简单的着色器,它应该通过给定的关节矩阵来转换顶点,从而实现简单的骨骼动画。每个顶点最多有两个骨骼影响(存储为 Vec2 的 x 和 y 分量)、与变换矩阵数组相关联的索引和相应权重,并在我的着色器中指定为“属性变量”,然后设置使用“glVertexAttribPointer”函数。

这就是问题出现的地方......我已经设法正确设置矩阵的“统一变量”数组,当我在着色器中检查这些值时,它们都被正确导入并且它们包含正确的数据。但是,当我尝试设置联合索引变量时,顶点乘以任意变换矩阵!他们跳到空间中看似随机的位置(每次都不同),我假设索引设置不正确,并且我的着色器正在将我的联合矩阵数组的末尾读取到以下内存中。我不完全确定为什么,因为在阅读了我能找到的关于该主题的所有信息后,我很惊讶在他们的示例中看到相同(如果不是非常相似)的代码,而且它似乎对他们有用。

我已经尝试解决这个问题很长一段时间了,它真的开始让我感到不安......我知道矩阵是正确的,当我手动将着色器中的索引值更改为任意整数时,它读取正确的矩阵值并按应有的方式工作,通过该矩阵转换所有顶点,但是当我尝试使用我编写的代码来设置属性变量时,它似乎不起作用。

我用来设置变量的代码如下...

我的顶点着色器看起来像这样......

这真的开始让我感到沮丧,任何和所有的帮助都将不胜感激,

——安德鲁·戈托

0 投票
1 回答
2517 浏览

opengl - opengl着色器中的多边形细分

我希望在 opengl 中使用轮廓和填充来渲染 20k+ 2D 多边形。

一些多边形是凹的。

是否可以使用着色器来做到这一点?