Articles of 着色器

如何将对象位置传递给顶点着色器?

我正在使用搅拌机游戏引擎 。 我想创造一个大的平面,并在移动物体附近局部变形。 到目前为止(尽管作为着色器的初学者),我已经写了一个顶点着色器,将顶点移动到正确的位置(现在是常量位置)。 我无法find一种方法来交换每个帧更新对象的位置,而着色器正在运行。 我甚至不确定是否有可能。 我只想从着色器访问特定对象的中心。

在旧着色器模型中生成片段/ HLSLdynamic链接的着色器

着色器模型5中有一个称为dynamic链接的特性,它通过使用接口及其在类中实现的方法来分离hlsl片段。 我对这种技术没有任何经验,我的程序使用了大约10个着色器(10个分离的文件* .hlsl),并且在不同的着色器中有一些相同的部分。 所以对我来说,将一个共同的逻辑(例如光)分离到自己的文件,并从其他着色器中使用它将是很好的。 我总是着迷于现代游戏引擎和他们的开发工具包,通过在一些内部编辑器中简单地点击,可以将这些着色器片段组合在一起。 所以开发人员可以通过这种方式创建非常复杂的场景 – select材质,灯光,粒子,animation等等,而且我觉得它非常的酷。 如果我省略了一些graphics编辑器和一个复杂的逻辑,那么这就是我想要实现的,不是吗? 只是在代码级别。 所以在着色器模型5中hlsl的dynamic链接,我有一些想法如何可以完成,但更老的着色器模型呢? 当没有着色器模型5时,引擎使用什么技术?

投影纹理和衰减

我很了解投影纹理如何工作。 我成功实现了以下nvidia文档的着色器。 我所面临的主要问题是,在这种实现方式下,投影机的平截头体仅用于确定投影空间中的纹理坐标,但是它并不夹在投影平截体体积之外的任何东西。 换句话说,如果我有一台投影机指向一个物体,即使物体在其平截头体之外,纹理也将被投射在它上面。 此外,当投影机几乎与投影物体平行时,纹理拉伸太明显,我想淡化它。 现在,我想了解Unity如何处理内置的投影机 。 我发现这个例子 。 这是顶点和片段的相关代码: v2f vert (float4 vertex : POSITION) { v2f o; o.pos = mul (UNITY_MATRIX_MVP, vertex); o.uvShadow = mul (_Projector, vertex); o.uvFalloff = mul (_ProjectorClip, vertex); return o; } fixed4 frag (v2f i) : SV_Target { fixed4 texS = tex2Dproj (_ShadowTex, UNITY_PROJ_COORD(i.uvShadow)); texS.rgb *= _Color.rgb; texS.a = […]

我应该在将模型导入Unity之前还是之后对模型进行遮蔽?

在3D建模软件内部还是在Unity内部遮蔽模型会更好? 作为一个例子,如果我需要使用透明模型,它应该在建模应用程序内部还是在Unity内部变得透明?

如何修复这个现有的阴影着色器/材料与alpha纹理?

我希望我能在这里得到一些帮助,最终解决这个我的问题:阴影投射与alpha纹理。 以下是我期待的结果: 我的一个朋友刚刚发送了这个着色器程序来帮忙,但我仍然无法正常工作。 像叶子这样的alpha纹理仍然留下矩形阴影。 我正在使用一个定制的基于Ogre的引擎,但总的来说,材质和合成器系统仍然是一样的。 附件: Alpha_Shader.zip 任何帮助将不胜感激。 谢谢。

HLSL像素着色器Sematics

我有一个HLSl像素着色器,我正在使用它来创建一个延迟缓冲区,我简化了代码以向您展示: struct PS_INPUT { float4 PosWVP : SV_POSITION; float4 NormalWorld : NORMAL2; }; struct PS_OUTPUT { float4 PosWorld : POSITION; float4 NormalWorld : NORMAL2; }; PS_OUTPUT main(PS_INPUT input) : SV_Target { PS_OUTPUT output = (PS_OUTPUT)0; output.PosWorld = input.PosWorld; output.NormalWorld = input.NormalWorld; return output; } 当我编译这段代码的时候,我得到这个警告warning X3576: semantics in type overridden by variable/function or enclosing type […]

在几何着色器中应用转换

所以,我试图在opengl(3.3)中编程一种机器人。 这个想法是,我有一些简单的块代表他的身体(他的arm有4个矩形,一个是躯干,最后一个是头部)。 简化一个我的想法的一个坏的画面。 所以现在我想要做的是让他根据键盘命令移动他的arm。 这样做只是旋转每个arm的数量,你想要的(也翻译)。 但是我被困住了,因为我发现制作条纹矩形(只是边框)的唯一方法是使用几何着色器。 从我对opengl知之甚less,转换被应用在顶点着色器中,这对我的想法是行不通的。 在几何着色器上应用转换效率低下? (这是从我所知道的)。 如果是这样,是否有一个更容易的方法来绘制这些矩形? 编辑:好的,我可以简化很多这个问题。 问题是我想绘制这些“骨架”的矩形,但我知道如何做的唯一方法是使用几何着色器。 但是,由于这个问题的转变,所以我想避免这样做。 还有另一种方法来绘制这些骨骼形状?

简单着色器的精灵界面

我一直在寻找任何例子很长一段时间,我不能得到任何工作(从例子)。 我曾尝试使用顶点/像素着色器,效果文件,但它们对渲染没有任何影响。 我正在使用看似简单的着色器(为红色添加一个值,或者完全删除一个颜色)。 这使我相信设置/渲染着色器的代码无法正常工作。 几乎每个例子都是基于非基于sprite的渲染,但我不知道是否重要(我无法find任何信息)。 很多论坛post/答案指向不再存在的网站。 我想得到一个简单的着色器的概念certificate,特别是对整个渲染的屏幕做任何事情。 我使用的技术是C ++ Directx 9 Sprite接口。 任何帮助/正确的方向链接表示赞赏。 先谢谢了!

无法使着色器在XNA#4中使用sprite批处理

我在网上find了一个整洁的“CRT屏幕”效果着色器,但是我之前从未使用过着色器,而且似乎也无法正常工作。 如果我在这里通常没有着色器的效果在我的代码中做第二个精灵批处理,它呈现罚款。 但是,使用我提供的着色器和参数,它只是在左上角渲染了几个像素,伪造的“挡板”应该是这样,有时候假的“屏幕”会闪烁一种颜色或另一种颜色。 我提供的参数有问题吗? 我真的很难过 protected override void LoadContent() { // Create a new SpriteBatch, which can be used to draw textures. spriteBatch = new SpriteBatch(GraphicsDevice); viewport = GraphicsDevice.Viewport; soldierFont = Content.Load<SpriteFont>("SpriteFont1"); ShaderRenderTarget = new RenderTarget2D(spriteBatch.GraphicsDevice, spriteBatch.GraphicsDevice.PresentationParameters.BackBufferWidth, spriteBatch.GraphicsDevice.PresentationParameters.BackBufferHeight, false, SurfaceFormat.Color, DepthFormat.None); WorkingTexture = new Texture2D(GraphicsDevice, SCREENWIDTH, SCREENHEIGHT); WorkingTexture1 = new Texture2D(GraphicsDevice, SCREENWIDTH, SCREENHEIGHT); effect = […]

使用DirectX 11绘制线条

我在3D中绘制线条时遇到了很多问题,并且出现了一个奇怪的结果。3D线条是2D项目,非常奇怪。 他们只能使用该视图matrixconfiguration: XMVECTOR Eye = XMVectorSet(0.0f, 3.0f, -6.0f, 0.0f); XMVECTOR At = XMVectorSet(0.0f, 1.0f, 0.0f, 0.0f); XMVECTOR Up = XMVectorSet(0.0f, 1.0f, 0.0f, 0.0f); XMMATRIX g_View = XMMatrixLookAtLH(Eye, At, Up); basicEffect->SetView(g_View); 但是当我使用我的相机视图matrix,他们得到投影在2D ..但是,我有我的地形渲染正确和其他的东西.. 这是我的相机类: void cCamera::Initialize() { Reset(); } void cCamera::Reset() { // config for left hand camera system m_Position = XMFLOAT3(0.0f, 0.0f, 0.0f); m_Forward = […]