Articles of 片段着色器

病房模型实现:镜面组件太弱

我试图实现Ward着色模型,各向异性,计算效率高的版本: 这是我做到的: float alphaX=0.5, alphaY=0.5; // asinotropic roughness float minFloat= 1.e-6; vec4 Ward(vec3 L, vec3 N, vec3 V) { vec3 H= normalize(L+V); float NdotL= max(dot(N,L),0.0); float NdotV= max(dot(N,V),0.0); vec3 e= vec3(1.0,0.0,0.0); vec3 T= normalize(cross(N,e)); vec3 B= normalize(cross(N,T)); float HdotT= max(dot(H,T),0.0); float HdotB= max(dot(H,B),0.0); float HdotN= max(dot(H,N),0.0); float beta= -2.0 * ( pow(HdotN/alphaX, 2.0) + pow(HdotB/alphaY,2.0) […]

管道中的DirectX11像素着色器缺失

我正在编写一个使用DirectX显示MS3D模型的程序,不幸的是,结果在屏幕上什么也没有显示。 当我从Visual Studio 13使用graphicsdebugging器时,我注意到像素着色器从管道中丢失,如下图所示 这是我的像素着色器源代码: cbuffer SkinningTransforms { matrix WorldMatrix; matrix ViewProjMatrix; }; //——————————————————————————– // Inter-stage structures //——————————————————————————– struct VS_INPUT { float3 position : POSITION; int4 bone : BONEID; float4 weights : BONEWEIGHT; float3 normal : NORMAL; float3 tangent : TANGENT; float2 tex : TEXCOORD; }; //——————————————————————————– struct VS_OUTPUT { float4 position : SV_Position; float3 […]

深度地图分辨率转移

问题是你可以看到阴影映射, 实际上它工作正常,但是在一定的条件下,深度图大小必须等于渲染缓冲区的大小,我使用无限定向光 所以如果窗口是800×600深度图必须是800×600,当我改变阴影地图的大小为900×600它开始被移动,当它的大小为1024×1024时,它也移动,直到它消失 GLSL阴影function float calcShadow(sampler2D Dmap, vec4 coor){ vec4 sh = vec4((coor.xyz/coor.w),1); sh.z *= 0.9; return step(sh.z,texture2D(Dmap,sh.xy).r); } 这是与窗口大小相同的结果 彩色的结果和深度图 这里是移位的结果,因为您可以注意到深度图与前一个一样正确,并在右侧添加了空格。 彩色结果http://goo.gl/5lYIFV 深度图http://goo.gl/7320Dd

手动编写dx11镶嵌细化着色器

我正在寻找手动实现镶嵌细分步骤的资源(我正好在使用Unity CG,但任何帮助表示赞赏)。 今天看来,把大部分的gpu代码隐藏起来,并且使用相当严格的简化(比如统一的SURFace着色器) ,这种风险显得非常激烈 。 除非你做了一些表面上的东西,否则这似乎毫无用处。 一点背景:我已经程序化地生成了具有质量法线但没有UV和没有切线的网格(使用步进立方体)。 我已经成功地写了一个自定义的顶点和片段着色器来做三面体纹理和凹凸贴图投影以及一些自定义的东西(自定义光照,程序上扭曲纹理的变化等)。 我正在使用GPUgem书作为参考。 现在我需要实现曲面细分,但是似乎我必须在曲面细分器获取它们之前 ( 在进行期间通过调整法线(ctrl + f在gems中: <normal.z, normal.y, -normal.x> ))计算运行时的切线某种types的每三角形几何传递,它在vert和frag之前)。 而且我还需要保留我自定义的vert + frag设置(用我自定义的参数/纹理在它们之间传递) – 显然我不能使用表面着色器。 任何人都可以提供一些指导?

如何在GLSL中使用缓冲区来执行LUT查找?

我目前正在一个医疗应用程序,需要不同的种类(高达完全个人)的查询表(LUT)图像显示。 这完成了10bit。 所以大部分时间需要使用16位灰度像素。 我select使用现代的OpenGL,因此我希望查找发生在GLSL着色器程序中。 我试着用sampler1D上传一个1D-Tedture(R16) 来做这样的查找: uniform sampler2D tex; uniform sampler1D lutData; in vec2 fragTexCoord; out vec4 finalColor; void main() { float primaryLvl = texture(tex, fragTexCoord); // index image 'color' in Lut-Texture float red = texture(lutData, primaryLvl); finalColor = vec4(red, red, red, 1.0); } 它的工作原理和预期的一样 – 然而纹理(也是一维的)仅限于8192的大小(在我的机器上)。 所以不满足全范围16位图像的要求。 对于上述testing,我上传我的图像为R16(对我来说是灰色的) – 标准化浮点数0-1.0。 上传缓冲区(任意数据)并在那里查找是否可行? 我怎么做这个(语法)? 而且我现在的像素格式会干扰我的想法,所以我必须把它作为R16_INT上传。 或者可以(也应该)我把它在从Normalized到Int的着色器(这是如何完成的)? […]

瓷砖地图着色器?

我正在尝试着写一个统一的着色器,这个着色器将从一个精灵表中绘制一个贴图,并将它们绘制在一个贴图上。 我是着色器新手,所以这可能是完全错误的,我认为这可能只是我的一个math错误,但也许我误解了着色器的工作原理。 这是我的着色器: Shader "Custom/TileMapShader" { Properties { _TileSheet ("Tile_Sheet", 2D) = "white" {} } SubShader { Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" uniform sampler2D _TileSheet; uniform float2 _MapSize; struct vertexInput { float4 vertex : POSITION; float2 texcoord: TEXCOORD0; float4 tilecoord : TEXCOORD1; }; struct vertexOutput { float4 pos : […]

我该如何解决我的影子施法者问题?

我试图通过使用它的阴影投射通过它添加阴影物体本身的背面阴影使无形的物体与阴影。 我的意思是物体遮住了他的背面,并在背景表面上绘制了阴影(我的统一版本是Unity5.6) 你可以在下面的animationgif中看到这个问题: 这是我团结阴影传递的着色器: Shader "Test/ShadowCaster" { SubShader { Tags{ "LightMode" = "ShadowCaster" } Name "ShadowCaster" Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #pragma multi_compile_shadowcaster #pragma fragmentoption ARB_precision_hint_fastest #include "UnityCG.cginc" struct v2f { V2F_SHADOW_CASTER; }; v2f vert(appdata_base v) { v2f o; TRANSFER_SHADOW_CASTER_NORMALOFFSET(o) return o; } float4 frag(v2f i) : COLOR { SHADOW_CASTER_FRAGMENT(i) } […]

D3D11 – 为像素着色器阶段设置多个ID3D11SamplerState并保留它们

在我的Direct3D 11应用程序中,我使用几个采样器状态来检索纹理数据。 其中一些用于所有像素着色器,其中一些仅用于非常特定的像素着色器。 这个问题可能看起来很简单,但我无法find有关这个主题的任何体面信息, 在为D3D11的像素着色器阶段创建多个采样器状态时,是否有任何处罚(性能或其他),将它们一次全部设置,而不再触摸它们? 如果需要的话,我的着色器会在HLSL中引用这些采样器(例如一些着色器会引用SamplerState linear_sampler : register(s0);而另外一些则会引用SamplerState point_sampler : register(s1);可能没有引用s0。 另外,如果我不想在创建和设置后在我的c ++代码中引用这些采样器,那么我可以在设置它们之后释放自己的外部引用,并且不会被破坏,因为D3D将内部引用保留为只要他们“绑定”(?)? 即使不得不以某种方式得到一个参考,我可以简单地使用ID3D11DeviceContext :: PSGetSamplers(当然接受查找涉及的性能损失),正确的?

tex1D用2d纹理做什么?

如果我从像素着色器调用已经初始化为texture2d的纹理的tex1d,它会将数据视为一维数组,然后将该元素放在指定的位置? 例如,如果你有一个10×10的纹理(这将是一个一维数组100个元素的长度),你调用tex1d(mySampler,0.95)是否会给你回到元素95?

多个渲染目标和像素着色器输出术语

我对行话有点困惑: 多渲染目标 (MRT)是指从像素着色器到struct多个元素的输出? 也就是说,当一个人说“MRT要写入多个纹理”,多个元素是交错在一个单一的输出纹理,或者你指定多个离散输出纹理? 顺便说一句,从我所了解的情况来看,至less对于DX9来说,这个结构的所有元素都必须具有相同的大小。 这个限制是否仍然适用于DX11?