Questions tagged «shaders»

在图形硬件上运行的计算机程序,可高度控制场景的渲染方式

2
OpenGL ES 2.0:设置2D投影
本文总体上介绍了如何使用固定功能管线绘制清晰的OpenGL 2D图形。 http://basic4gl.wikispaces.com/2D+Drawing+in+OpenGL 由于OpenGL ES 2.0具有某些ES 1.x功能不可用(例如:glOrtho()),因此必须在“片段/顶点”着色器中替换其功能。 我的问题是,如何在可编程功能管线中设置以下2D投影? const XSize = 640, YSize = 480 glMatrixMode (GL_PROJECTION) glLoadIdentity (); glOrtho (0, XSize, YSize, 0, 0, 1) glMatrixMode (GL_MODELVIEW) 如何配置片段和顶点着色器以完全替代上述固定功能2D投影设置?


1
高斯模糊是柔和阴影边缘的相当准确的表示吗?
我不确定现实生活中的柔和阴影(来自封闭的大型光源)是否具有高斯或线性衰减,或其他原因。 我正在做一些可以通过操纵某种预渲染的渐变纹理来创建阴影的事情,因此我不必依靠帧缓冲区和传统的阴影技术。我计划将渐变烘焙到网格纹理的一个通道中,然后根据每个四边形覆盖多少阴影来操纵值。这是可能的,因为我只是像锯齿一样排列了四边形,其中每个峰都可以将阴影投射到下一个相邻的四边形上。 因此,线性衰减将是最简单的(只需要从线性梯度中减去一些值即可),但是我很难说出实际看起来是真实的。是否有一个简单的数学公式可以应用于线性梯度以得出高斯近似值?

2
较大的顶点缓冲区与多个绘制调用
我刚刚开始使用OpenGL,并且尝试使用它来创建2D游戏。在这个游戏中,我有一个六角形网格,由许多不同颜色的六角形组成。作为新手OpenGL程序员,我看到了绘制此网格的两种方法: 将顶点缓冲区与单个六边形的数据一起使用,然后使用统一的偏移值并在CPU上迭代多次以绘制同一程序,直到获得网格为止。 创建一个单一的非常大的预先计算的顶点缓冲区,该缓冲区在一次调用中绘制所有六边形。 什么是最有效的方法?有更好的方法吗?
14 opengl  shaders 

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 …

1
什么是斜坡着色或照明?
什么是匝道阴影或照明,它如何工作?它与卡通着色是不同的还是相同的概念?渐变阴影与blinn-phong或lambert的镜面反射度如何计算不同?
14 shaders  lighting 

3
用AA渲染线的最快方法,DirectX中的线宽变化
因此,我正在做一些DirectX开发,确切地说是在.NET下使用SharpDX(但DirectX / C ++ API解决方案适用)。我正在寻找使用DirectX在正交投影中渲染线的最快方法(例如,模拟科学应用程序的2D线图)。 我尝试渲染的各种情节的屏幕截图如下: 这类绘图具有数百万个线段,可变厚度,是否带有每行抗锯齿(或全屏AA开/关)的情况并不少见。我需要非常频繁地更新线条的顶点(例如20次/秒),并尽可能多地卸载GPU。 到目前为止,我已经尝试过: 软件渲染(例如GDI +)的性能实际上并不差,但显然在CPU上很沉重 Direct2D API-比GDI慢,尤其是在启用抗锯齿功能时 Direct3D10使用此方法在CPU端使用顶点颜色和细分来模拟AA。也很慢(我分析了它,花费了80%的时间用于计算顶点位置) 对于第三种方法,我使用“顶点缓冲区”将三角带发送到GPU,并每200毫秒用新顶点更新一次。100,000个线段的刷新率约为5FPS。我理想地需要数百万! 现在,我在想最快的方法是在GPU上进行细分,例如在Geometry Shader中。我可以将顶点作为线列表发送,也可以打包成纹理,然后在“几何着色器”中解包以创建四边形。或者,只需将原始点发送到像素着色器,然后在像素着色器中完全实现Bresenham Line绘图。我的HLSL是2006年的生锈着色器模型2,所以我不了解现代GPU可以完成的疯狂工作。 所以问题是:-有人做过吗,您有什么建议可以尝试吗?-您对通过快速更新几何来提高性能有什么建议(例如,每20毫秒创建一个新的顶点列表)? 1月21日更新 从那以后,我已经使用LineStrip和Dynamic Vertex Buffers使用Geometry Shader实现了上述方法(3)。现在我以100k点获得100FPS,以1,000,000点获得10FPS。这是一个巨大的改进,但是现在我的填充率和计算能力受到限制,因此我开始考虑其他技术/想法。 线段几何的硬件实例化如何? Sprite Batch呢? 其他面向(像素着色器)的方法呢? 我可以有效地淘汰GPU或CPU吗? 您的意见和建议深表感谢!
14 2d  directx  shaders 

5
避免在DirectX 10着色器中使用if语句?
我听说应该在着色器中避免if语句,因为语句的两个部分都将被执行,并且错误的语句将被丢弃(这会损害性能)。 在DirectX 10中仍然存在问题吗?有人告诉我,只有正确的分支才能执行。 对于该示例,我有以下代码: float y1 = 5; float y2 = 6; float b1 = 2; float b2 = 3; if(x>0.5){ x = 10 * y1 + b1; }else{ x = 10 * y2 + b2; } 还有其他方法可以使其更快吗? 如果是这样,该怎么办? 两个分支看起来都相似,唯一的区别是“常量”的值(y1, y2, b1, b2对于Pixel Shader中的所有像素都是相同的)。

2
为什么树木在背景中发光?
目前,我正在黑暗中创建森林场景,而树木在遥远的地方闪闪发光,但是当我靠近时,它们就很好了。我已将着色器设置为“自然/树软遮挡[树皮/叶子]”,但它们仍在很远的地方渲染出奇特效果,但在关闭时效果很好。 我尝试将树木放置在名为“环境光遮挡”的文件夹中,就像这里所说的那样,但是没有运气。雾也被关闭。提前致谢。 更新 当我使用“渲染路径”相机查看树木时,它们显示为红色,而其他所有颜色均为绿色。 更新2 我尝试重新安装从中下载这些软件包的程序包,但是仍然没有运气。 更新3 我已经手动添加了一些树,它们可以正常工作,但是通过在地形上绘画来添加它们时出现了问题。 最后更新 我尝试构建游戏,以查看这是否对.exe有影响,但没有。因此,当我调试它时,我只需要忽略它,因为它可以在构建中正常工作。感谢所有的帮助,这似乎是一个统一的错误。构建图片:
14 unity  shaders  terrain  tree 

1
如何制作“ Life is Strange”之类的轮廓着色器?
我想让像生活一样的素描着色器变得奇怪。 着色器有两个部分: 1.动画虚线 2.嘈杂的轮廓 我想知道如何制作嘈杂的轮廓? 看到物体的轮廓 首先,我尝试通过复制输入的顶点数据来制作轮廓,并根据法线方向缩放,然后再按Cull Back。但是我认为这类似于“ 图像效果”,因为轮廓有时会在对象内部移动。无论如何,如果有人帮助我实现此着色器,我将不胜感激:) 我尝试了什么 我使用了边缘检测并通过顶点着色器对其进行了动画处理,但这并不像上面的gif那样好。
13 unity  shaders  hlsl 

3
重建阴影效果
我会简短。如何实现下图所示的效果?实时进行是否可行?它看起来看似简单,但事实并非如此。我可以搜索任何关键字以获取有关对着色器进行编程以实现此外观的更多信息吗?谢谢。

3
如何使用HLSL像素着色器复制NES的颜色限制?
因此,由于256色模式已被弃用,并且在Direct3D模式下不再受支持,因此我有了一个想法,改为使用像素着色器来模拟所有可能颜色的NES调色板,以便淡出的对象以及不具有alpha通道的平滑淡出效果。(我知道对象在NES上并不能真正淡出,但是我的所有对象都会在纯黑色背景上淡入和淡出,这可以通过调换调色板来实现。此外,当您暂停时,屏幕也可以淡入和淡出。我知道通过调色板交换也可以实现,就像在《洛克人》游戏中所做的那样。)问题是,我几乎不了解HLSL着色器。 我该怎么做?
13 shaders  pixel 


4
调试着色器代码?
我正在编写一个游戏引擎,当我使用透视相机时,屏幕会黑屏。我不会确切地问这是为什么,因为会有很多代码要共享,并且坦率地说,我认为即使打扰大家,这也是一个小问题。 麻烦在于我不知道如何调试它。所有更改都是我的投影矩阵,如果我的投影矩阵看起来不错,我不知道为什么它不起作用。理想情况下,我将在着色器进行计算时打印出各种东西的值,但是GLSL不方便地没有printf()函数。 所以我的问题是:如何调试我的问题?我唯一想到的就是在客户端检查尽可能多的值,然后通过置换进行编程,但是我这样做并没有成功。有什么方法可以查看视频卡中发生的情况?我可以使用一种完全不同的技术吗? 我使用的是GLSL 420版(以及该版本的特定功能),因此考虑到上次更新是2010年,我不认为glslDevil是一个选项。 编辑 我设法通过一些完全不相关的调试解决了我的问题。

2
逼真的金属着色器
如何创建一个好的金属着色器? 对于不同的金属,说或多或少地腐蚀/生锈等等。 我知道与普通材料的不同之处在于,金属应该使镜面反射光“着色”,但是例如当我用金做到这一点时,它看起来只是“黄色”,而根本不是金属。 任何帮助表示赞赏!

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.