Questions tagged «fragment-shader»

在GPU上运行以确定像素输出颜色的程序。也称为片段着色器。

3
为什么在镜面反射明暗处理中使用H(阴影)代替R(phong)?
我在任何地方都找不到这样做的充分理由。phong中使用的反射向量在物理学上具有简单的基础。但是,在blinn中使用的半向量似乎没有合理的基础,并且不能构成适当的反映。但是,它已用于所有所谓的“基于物理的”阴影功能中。如果有良好的身体基础,我想知道。 我找到的原因有几个: 它的速度更快 -对此的信息参差不齐,但是即使如此,这也仍然是一个很好的理由……在1998年。 据我所知,它处理角度大于90度的效果更好 -唯一的原因是,不当使用phong术语。反射和视图的点积给出介于-1和+1之间的角度。通常将此角度钳制为0到1,这是90度问题的直接原因。重新对角度进行归一化,而不是对其进行夹紧,即可获得完整的180度覆盖范围。我拒绝相信简单的x * 0.5 + 0.5运算已经使图形世界望尘莫及了40年。 它可以更好地处理边缘 -边缘“问题”在blinn解决方案中也存在,只是程度较小。主要原因是在终结器处对区域光照的模拟不正确,这对于任何“基于物理的”着色器来说都是必不可少的。但是,即使在较简单的情况下,S型函数也可以正确地逼近软终止线。乘以兰伯特项是不正确的,因为它会不适当地衰减镜面项,这可能会抵消菲涅耳项并导致进一步的误差。 它在边缘有很长的反射 -在我看来,尽管各向异性反射可能是现实的,但blinn并不是实现它们的正确方法,因为它们仅出现在边缘。H项中的错误恰好看起来是现实的,这只是一个快乐的巧合。 这些原因都不能令人满意,我想理清这种疯狂。 我想澄清的是,我并不是在专门讨论blinn和phong ,而是在讨论向量分量H和R,它们被用作这些着色器以及其他着色器的基础。

2
即使不使用深度测试,我也会失去/获得丢弃像素的性能吗?
当我第一次搜索废弃指令时,我发现专家说使用废弃将导致性能下降。他们说,丢弃像素将破坏GPU正确使用zBuffer的能力,因为GPU必须首先为两个对象运行Fragment shader,以检查是否更靠近相机的对象被丢弃。对于我目前正在开发的2D游戏,我同时禁用了深度测试和深度写入功能。我正在绘制按深度排序的所有对象,仅此而已,无需GPU即可完成精美的工作。现在我想知道是否可以将片段着色器中的像素丢弃吗?

2
GLSL-一遍高斯模糊
可以实现片段着色器进行一次高斯模糊吗?我发现很多两遍模糊(高斯和盒子模糊)的实现: http://callumhay.blogspot.com/2010/09/gaussian-blur-shader-glsl.html http://www.gamerendering.com/2008/10/11/gaussian-blur-filter-shader/ http://www.geeks3d.com/20100909/shader-library-gaussian-blur-post-processing-filter-in-glsl/ 等等。 我一直在考虑将高斯模糊实现为卷积(实际上是卷积,上面的示例只是近似): http://en.wikipedia.org/wiki/Gaussian_blur


2
线宽可变的卡通/透明阴影?
我看到一些进行cel着色的广泛方法: 具有翻转法线的模型的复制和放大(对我而言不是一种选择) Sobel滤波器/片段着色器进行边缘检测的方法 模板缓冲区方法进行边缘检测 用于计算面法线和边缘法线的几何(或顶点)着色器方法 我是否假设以几何为中心的方法也可以最大程度地控制照明和线条粗细,这是正确的吗?对于可能会看到山的轮廓线逐渐合并成平原的地形? 如果我不需要地形表面的像素照明怎么办?(而且我可能不会,因为我计划使用基于单元的基于顶点或基于纹理贴图的照明/阴影。)那么我是否会更好地坚持使用几何类型方法,或者改为使用屏幕空间/片段方法?使事情更简单?如果是这样,我怎么会得到山上的“墨” 内网的剪影,而不是只有整个网格(的轮廓与轮廓内没有“墨水”的细节?(AKA 暗示的轮廓,折痕)。 最后,是否可以使用几何着色器廉价地模拟翻转法线方法?我对此的担心是,我当然可以复制每个单个顶点并相应地缩放它们,但是我将如何处理翻转法线和片段着色器中的不同着色? 我想要的-在轮廓内插入线来改变线的粗细... 我不要... 编辑:进一步的研究发现了以下... 由于我在地形上拥有大量顶点,因此即使考虑基于距离的LoD,由于所有对象的复制和缩放都涉及巨大的计算复杂性,因此无论是基于翻转法线还是基于几何着色器的方法(即使使用平截头体剔除)都不是明智的选择。上传的顶点。 考虑到我不需要在地形表面上以纯色阴影的形式进行逐像素照明,因此考虑基于面部法线的方法(否则需要正确的表面照明)也变得不太谨慎计算起来自然很昂贵。但是,他们确实提供了最好的控制权。例如,使用“艺术”笔触为边缘着色的能力:漂亮,但又不能在大规模复杂的游戏环境中真正实现。 我宁愿避免使用模板缓冲区,因为我希望在着色器中完成所有工作。(上面带有红色轮廓的示例是使用模板缓冲区-旧学校完成的。) 这样就留下了片段着色器的图像空间方法。计算复杂度降低为片段的数量,而不是顶点的数量(在我的情况下,这比几何着色器中的操作要少10-100倍)。为了生成一个g缓冲区(包括一个普通缓冲区和一个可选的深度缓冲区),需要多次渲染渲染,我们可以将不连续性滤镜(例如Sobel运算符)应用到该缓冲区。深度不连续性使轮廓和折痕产生暗示。我唯一的疑问是无法对墨迹边缘宽度进行更好的控制,尽管使用片段着色器中的正确算法,我相信这是可能的。 因此,现在的问题变得更加具体:我如何精确地在片段着色器中获得可变的边缘宽度,尤其是在外部轮廓上?

2
GLSL着色器-更改色相/饱和度/亮度
我正在尝试使用GLSL片段着色器更改图像的色调。我想实现类似于Photoshop的“色相/饱和度调整”层的功能。 在下图中,您可以看到到目前为止我得到了什么。我想更改绿色正方形的色相,使其看起来像右边的红色正方形,但是使用此着色器,我得到一个半红色的半粉红色正方形(中间的正方形)。 我在片段着色器中所做的就是将纹理的颜色转换为HSV,然后将从顶点着色器获得的HSV颜色添加到其中,然后将颜色转换回RGB。 我究竟做错了什么? 片段着色器: precision mediump float; varying vec2 vTextureCoord; varying vec3 vHSV; uniform sampler2D sTexture; vec3 convertRGBtoHSV(vec3 rgbColor) { float r = rgbColor[0]; float g = rgbColor[1]; float b = rgbColor[2]; float colorMax = max(max(r,g), b); float colorMin = min(min(r,g), b); float delta = colorMax - colorMin; float …

5
在纸牌游戏中,我将使用什么渲染技术为纸牌绘制阴影效果?
什么样的阴影算法可以用来创建像这样的阴影? 我正在制作的是类似的东西,但是都由OpenGL驱动的2D绘图API完成,因此没有Z坐标。 另外,对于手本身,我真的很想得到一种阴影效果,如下所示: 我只是不确定如何获得接近它的阴影外观。 卡的数量一定会发生变化,并且卡会扔到桌子上,所以我不能使用任何类型的光照图。 我应该研究哪种算法(除了模糊,我知道需要做些什么?) 谢谢 更新资料 我正在制作2D纸牌游戏。我想从卡上添加阴影阴影偏移,有点像: 我正在考虑的方式是: 保留与后缓冲大小相同的纹理。 绘制黑色矩形作为该纹理的临时卡片。 模糊该纹理。 用这种纹理画我的卡片。 对卡进行其他照明。 将此纹理绘制到后缓冲区。 我的问题是: 这是正确的方法吗? 有没有一种方法可以在不渲染纹理的情况下(保持位图 与后缓冲区一样大)? 是否可以安全地假定后 缓冲区大小不会超过最大纹理大小?(我的意思是,如果后缓冲区 为2000x3000,那么可以说我可以在 该大小的视频内存中创建纹理了吗? 谢谢

1
如何实现图层之间投射的2D阴影?
如何实现由不同层中的对象投射的2D阴影? 不喜欢Catalin Zima著名教程中的动态照明: 但是就像这段视频中管道的阴影一样: 就像这个视频中平台的影子和角色一样: 我想在具有多个图层和许多不同颜色的灯光的场景中使用相同类型的照明。 我可以想象通过在该图层后面的图层上绘制该图层的黑色副本,然后根据要在其上投射阴影的图层中的孔进行调整来进行此操作。但是我希望有一种更便宜的基于像素着色器的方法。

1
如何为保持像素保真度的转换2D精灵创建“复古”像素着色器?
下图显示了在背景上方通过点采样渲染的两个精灵: 左头骨没有应用旋转/缩放,因此每个像素都与背景完美匹配。 右头骨旋转/缩放,这将导致不再与轴对齐的较大像素。 我如何开发一个像素着色器,该着色器将在右侧以与场景其余部分相同大小的轴对齐像素来渲染转换后的精灵? 这可能与在“猴子岛”(Monkey Island)等旧游戏中如何实现精灵缩放有关,因为这是我试图实现的效果,但增加了旋转功能。 编辑 根据kaoD的建议,我试图通过后期处理解决该问题。最简单的方法是先渲染到一个单独的渲染目标(下采样以匹配所需的像素大小),然后在第二次渲染时将其放大。它确实满足了我上面的要求。 首先,我尝试这样做,Linear -> Point结果是这样的: 没有失真,但结果看起来很模糊,并且丢失了大多数高光颜色。在我看来,它打破了我需要的复古外观。 我第二次尝试Point -> Point,结果是这样的: 尽管存在失真,但我认为这可能足以满足我的需求,尽管它看起来比静止图像确实好看。 为了演示,这是该效果的视频,尽管YouTube过滤掉了其中的像素: http://youtu.be/hqokk58KFmI 但是,如果有人想出一个更好的采样解决方案,该解决方案可以保持清晰的外观,同时减少移动时的失真量,那么我将继续待几天。

1
优化重型片段着色器的性能
我需要帮助优化以下一组着色器: 顶点: precision mediump float; uniform vec2 rubyTextureSize; attribute vec4 vPosition; attribute vec2 a_TexCoordinate; varying vec2 tc; void main() { gl_Position = vPosition; tc = a_TexCoordinate; } 分段: precision mediump float; /* Uniforms - rubyTexture: texture sampler - rubyTextureSize: size of the texture before rendering */ uniform sampler2D rubyTexture; uniform …

3
轮廓精灵
我目前正在开发2D游戏,目前的任务是勾勒出选定的对象。 我基本上使用模糊着色器来完全运行它。我首先使用垂直高斯模糊着色器绘制精灵,然后使用水平高斯模糊着色器绘制精灵,然后正常绘制我的精灵。 这是我的模糊着色器:sampler TextureSampler:register(s0); #define SAMPLE_COUNT 15 float2 SampleOffsets[SAMPLE_COUNT]; float SampleWeights[SAMPLE_COUNT]; float4 PixelShaderFunction(float2 texCoord : TEXCOORD0) : COLOR0 { float4 c = 0; // Combine a number of weighted image filter taps. for (int i = 0; i < SAMPLE_COUNT; i++) { c += tex2D(TextureSampler, texCoord + SampleOffsets[i]) * SampleWeights[i]; …
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.