Articles of 着色器

什么是最有效的提水方式?

我会用C ++创建水面网格,并控制CPU中的运动/animation,然后应用任何着色器(reflection/折射/焦散/等等)。 或者,我应该只在C ++中创建网格,然后在顶点着色器中控制移动? 在第二种方法看来,模拟更复杂的水模型会更困难。 现代电子游戏中最常用的方法是什么?

Libgdx OpenGL ES像素着色器在Android和桌面上的行为有所不同

我目前正在制作一款移动游戏,其中包含一款蛇游戏。 我想要做的是使用我有限的知识来写一个像素着色器,它可以有效地在一组2D点之间绘制一定宽度的曲线。 这是我在桌面上使用基本的libgdx在着色器上绘制整个屏幕,并input。 通过GIPHY 为此,我首先find最接近gl_FragCoord的点,然后用相当多的math方法计算出该点之前的半点和之后的半点之间的曲线的方程,点作为曲线的控制点…(通过半点来表示它与下一个或之前的点之间的平均值) 然后我用更多的math来计算像素和这条曲线之间距离的所有局部最小值; 检查哪些是有效的,并计算片段和蛇之间的最小距离。 然后,我可以很容易地检查像素是否在蛇的宽度(名为W)。 我希望我解释得很好,因为代码根本没有注释。 我希望人们有什么想法可以使完美(更高)的桌面版本的libgdx和Android版本,不太好的区别… … 原始video uniform vec2 stuff; uniform vec2 points[10]; vec4 fragColor; vec3 cubicsolve(float a,float b,float c,float d); void main() { float tailLength = stuff.y; fragColor = vec4(0.,0.,0.,1.); vec4 primColor = vec4(92./255.,158./255.,237./255.,1.);//5C9EED vec4 degColor = vec4(236./255.,135./255.,192./255.,1.);//EC87C0 int pointNum = int(stuff.x); vec2 F = gl_FragCoord.xy; float W = […]

我如何创建一个“模糊蜡笔”效果?

我花了一些时间看媒体分子的梦想 。 其中,允许用户在半空中(在三维空间中)(在43:00左右的video点)模糊蜡笔笔画。 我怎样才能实现类似的效果? 这是一个多边形纹理或一些复杂的粒子系统? 我相信它有一些着色,但不知道如何。

统一 – 环境遮挡文物

当我从Unity>组件菜单创建两个立方体。 打开AO底部的立方体没有正确的阴影。 我的意思是上方的立方体是好的,但底部的立方体没有任何影子存在。 我究竟做错了什么 ? 照明设置: 结果:

发送多个灯到我的着色器有问题

我有一个C ++中的灯光,它拥有灯光的颜色和方向。 const int NUM_LIGHTS = 1; struct lightStruct { XMFLOAT4 Color; XMFLOAT4 Direction; }; 这就是我如何创建我的缓冲区并更新它。 void PBRMaterial::CreateLightBuffer(ID3D11Device* device, ID3D11Buffer** lightBuffer, std::vector<lightStruct*> lightStructs){ D3D11_BUFFER_DESC cbDesc; cbDesc.ByteWidth = sizeof(lightStruct) * NUM_LIGHTS; cbDesc.Usage = D3D11_USAGE_DYNAMIC; cbDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER; cbDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; cbDesc.MiscFlags = 0; cbDesc.StructureByteStride = 0; D3D11_SUBRESOURCE_DATA InitData; InitData.pSysMem = &lightStructs[0]; InitData.SysMemPitch = 0; InitData.SysMemSlicePitch = […]

我怎样才能在纹理切口?

我希望能够拥有一个基本上只是一个黑盒子的游戏物体。 然后,我希望能够放置其他只是渐变的游戏对象,并且应该像这样“剪掉”黑色纹理: 我怎样才能达到这种效果? 请记住,我几乎没有着色器的经验:) 这里有一个video可以帮助解释我想要达到的目标https://www.youtube.com/watch?v=L1dd4fkVSAM

DirectX11有可能使像素着色器输出一个整数而不是float4吗?

我正在尝试通过着色器实现对象拾取。 我的意图是创建一个texture2d,我会写出描述单个对象的ID值。 在绘制对象之后,我将查询焦点处的像素值并读出对象的ID。 我已经创建了我的texture2d,如下所示: // Create a very tiny selection texture. // This will record the color ID as unique identifier of a selectable object. D3D11_TEXTURE2D_DESC desc; desc.Width = 1; desc.Height = 1; desc.MipLevels = 1; desc.ArraySize = 1; desc.Format = DXGI_FORMAT_R32_UINT; // 16 bit integer, hold up to 65536 possible unique IDs. desc.SampleDesc.Count = […]

片段着色器坐标:移动像素和texCoord问题

我试图创建一个着色器,创建一个对象的位移,水平切片精灵。 这是我正在使用的地图集的一个例子,以及我试图实现的效果: 我试图做到这一点创建一个片段着色器,这将读取texcoord的Y坐标,并根据高度,水平位移。 但是我发现了两个主要问题: 1)如果我的地图集有更多的精灵,我无法确定在片段着色器中绘制精灵的高度。 由于texcoord的值相对于正在使用的地图集从0到1,因此我有更多的行,我应该select较小的值来创建水平切割。 有没有什么方法可以知道绘制的位置? 2)问题与前面的问题类似。 当水平位移像素时,如果位移太大,我最终会对正在渲染的旁边的精灵进行采样。 这个想法是为了循环开始精灵的开始。 如果我有精灵的宽度,我可以告诉你怎么做,但单独使用texcoord是不可能的。 我怎样才能做到这一点?

预制不会更改为自定义着色器

我正在写这里,因为我遇到了Unity的问题。 我写了自己的表面着色器,并希望用它来做预制。 但是,当将着色器拖放到编辑器中的预制件时,它会识别它,但不会更改预制件。 预制件是一些保持粉红色的物体的预制件。 有什么问题? 着色器的作品,我知道,因为我已经试图将着色器直接拖放到一些对象。 除此之外,我还尝试创建一个材质拖放着色器,然后将材料拖放到预制件。 那也行不通。

没有几何着色器,线框效果是否可能?

我想写一个着色器,突出显示每对顶点之间的边缘,就像UCLA线框着色器 。 我遇到的所有实现都需要几何着色器支持。 我想知道这是可能的只有顶点和片段着色器? (当然,我可以使用纹理来解决这个问题;但是我试图避免为每个需要这种效果的模型创建自定义纹理,另一方面,我可以使用几何着色器,但是在移植到iOS,缺乏支持。)