Articles of 着色器

创建一个片段着色器随着时间的推移使白色纹理变暗 – OpenGL GLSL

所以作为学习OpenGL的一部分,我现在决定尝试使用着色器来创造更多的创意,作为使用C / OpenGL的练习游戏的一部分。 在处理着色器方面,我是全新的,所以我仍然试图习惯于用它来创建一些东西。 就此而言,这是我想要尝试的。 作为游戏的一部分,游戏的整个背景由白色,简单的2D纹理组成。 随着时间的推移,白色的纹理应该慢慢地把黑色的圆圈变成animation,直到整个纹理完全变黑为止。 我已经考虑了一些不同的方法来解决这个问题,并且想知道哪一个对于着色器来说是最实用的。 使用帧缓冲区 :正如我从互联网上看到的一样,你不能真正地说,将某些颜色应用到片段着色器中特定的片段区域(如创建一个黑色圆圈),然后保存那些状态为下一帧的片段。 相反,我将不得不应用效果,并将纹理渲染到帧缓冲区,然后在下一帧再次使用它。 我可以不断地做这个缓慢地添加黑色圆圈的纹理。 问题是,这样做是否真的做了太多的工作? 还是会足够快? 据我所见,帧缓冲区通常用于后期处理整个场景帧的效果。 这不适用于整个场景,只适用于背景。 这种方法的优势在于,只需要处理一个纹理,处理起来相对简单。 用自己的片段着色器创建个别的圆形对象 :这是我想要做的另一个方法。 基本上,我没有在整个背景纹理上使用一个着色器,而是简单地产生纹理四边形,每个纹理四边形单独运行一个片段着色器,使用简单的百分比值input作为统一,随着时间推移纹理变黑。 这个解决scheme的缺点是,由于必须在运行时处理更多的对象,而不是简单地使用一个纹理,使得它变得更加复杂。 渲染时还需要处理更多的顶点。 在这两种方法中,我不知道真正的解决scheme是什么。 我想使用帧缓冲器的方法,但我不知道是否会“滥用”这种问题的技术与否。 或者也许还有另一种方法,我完全错过了,因为我是着色器的新手,在这种情况下,欢迎其他建议! 感谢大家的帮助 :)

HLSL用于GLSL的Tex2D?

我正在尝试将一个HLSL着色器移植到GLSL上。 我只是不太清楚如何转换这一行: outA += Input.Color.a * tex2D(s, Input.TexCoord.xy + float2(-4.0 * pxSz.x * blurSize,0)).a * 0.05; 这主要是我遇到麻烦的Tex2D。 在GLSL中,它似乎工作不同。 我正在移植一个水平的模糊 texture al_tex; sampler2D s = sampler_state { texture = <al_tex>; }; int tWidth; int tHeight; float blurSize = 5.0; float4 ps_main(VS_OUTPUT Input) : COLOR0 { float2 pxSz = float2(1.0 / tWidth,1.0 / tHeight); float4 outC = […]

帮助我的发光着色器!

我正在尝试为霓虹灯风格的游戏创建一个发光着色器,但是我对rendertargets有点麻烦。 现在我想要的就是非常简单的一个地方,我改变了rendertarget,然后绘制到渲染器中。 我看过的很多例子都是在第一部分做的,但是不包括如何通过着色器来传递。 现在我并不是真的担心辉光部分,我只是想让它通过着色器,所以我可以在辉光部分工作。 编辑 – 新的代码: graphicsDevice.SetRenderTarget(renderTarget); .. .. .. graphicsDevice.SetRenderTarget(null); renderTargetTexture = (Texture2D)renderTarget; loader.GlowShader.Parameters["glowTexture"].SetValue(renderTargetTexture); for (int l = 0; l < loader.GlowShader.CurrentTechnique.Passes.Count; l++) { loader.GlowShader.CurrentTechnique.Passes[l].Apply(); } renderQuad.Draw(); 而辉光着色器(这可能非常混乱,但我现在并没有真正模糊,我只想要基本的东西): float4x4 World; float4x4 View; float4x4 Projection; Texture glowTexture; sampler glowSampler = sampler_state { texture = <glowTexture>; magfilter = LINEAR; minfilter = LINEAR; mipfilter = LINEAR; […]

推断BRDF中的半向量长度

这是我的第一个问题。 是否有可能从N·L和N·V推断镜面照明的半角vector的长度,而没有整个视图和光vector? 我可能完全偏离轨道,但我有这种直觉,这是可能的…为什么? 我正在做一个皮肤着色器,我已经做了N·L + N·E的一次纹理查找和一次用N·H + N·V的镜面查找。 只要我有半个vector长度,后者就可以转化为N·L + N·E查找。 这样做可以简化着色器,并将一些操作移动到预先计算的查找纹理中。 这将会产生巨大的影响,因为我试图将尽可能多的function挤到一个单一的移动版本,因此指令数量很重要。 谢谢。 编辑,为了清楚起见,我正在做这样的事情: float NdotL = dot(s.Normal, lightDir); float NdotE = dot(s.Normal, viewDir); fixed3 diffAndTransl = 2.0 * tex3D(_Lookup3d, half3(diffNdotL, NdotE * 0.5 + 0.5, depth)).rgb; 现在我们已经散布了SSS和从查找反向散射以下的一切可能只是一个查询,如果我有长度(h)信息时计算查找 float3 h = lightDir + viewDir; float hLen = length(h); //float3 H = normalize(h); float3 H […]

从着色器访问深度缓冲区

我读了这个演示文稿,并在第六张幻灯片上发现,不需要使用多个渲染目标,深度可以直接从深度缓冲区中获取。 从哪个版本的DirectX或OpenGL可以使用的function? 怎么做?

我如何修改着色器中的Texture2DArray值

我正在使用HLSL Shader Model 5.0。 我正在使用具有网格顶点位置的Texture2D。 在着色器中,我试图沿着补丁的正常位置移动修补位置,我希望将纹理的新位置移出着色器,因此下一个补丁正在使用修改后的值。 有负载函数用于加载值的纹理,但是有一个函数来存储值返回到纹理? 我没有find任何东西。 你们如何管理类似的问题? 谢谢

何时应该将纹理设置为着色器资源以读取它?

我正在用SharpDX写一个Direct3D 11 HLSL着色器。 我想要做的是将深度写入一个纹理,然后在下一个纹理中读取。 在声明纹理之后,是否必须在每帧中设置深度纹理和着色器资源视图,或者在附加时只设置一次? this.depthStencilShaderResourceVariable = this.effect.GetVariableByName("DepthTexture").AsShaderResource(); this.depthStencilShaderResourceVariable.SetResource(this.depthTextureShaderResourceView);

如何在HLSL中共享matrix?

我正在尝试在多个效果文件中分享这个内容: matrix worldMatrix : register(vs_4_0, b0); 如果我从一个效果文件中设置它,它是否会影响具有相同types的variables分配给该特定的寄存器的每个效果文件? 这和cbuffer结构有什么区别?

简单的关于glDrawElements函数的好奇心

我写了一个非常简单的OpenGL程序,显示一个白色的立方体。 为了完成这项工作,我从一个描述我的立方体的OBJ文件中恢复了顶点位置和数据。 这里是OBJ文件的内容: o Cube v 1.000000 -1.000000 -1.000000 v 1.000000 -1.000000 1.000000 v -1.000000 -1.000000 1.000000 v -1.000000 -1.000000 -1.000000 v 1.000000 1.000000 -0.999999 v 0.999999 1.000000 1.000001 v -1.000000 1.000000 1.000000 v -1.000000 1.000000 -1.000000 usemtl BoxMtl s off f 1 2 3 f 5 8 7 f 1 5 6 f 2 […]

管理着色器参数

我正在用OpenGL做一些testing,我的应用程序devise有问题。 目前,我在伪代码中有这样的东西: // Ask to draw a given scene. renderer->drawScene( myScene, myCamera ); // Here is what I do in the renderer for( auto& mesh : scene->getElements() ) { this->draw(mesh); } // And here is what my draw method do. // First geometry stuff. context->setVertexFormat( mesh->geometry->vertexFormat ); context->setVertexBuffer( mesh->geometry->vertexBuffer ); // Use VAO is available. […]