Articles of hlsl

HLSL灰度像素着色器:如何获取模型的原始颜色?

下面的代码给了我一个完全黑色的模型,而它应该是一个以灰度阴影的模型: float4 SimplePixelShader(VertexShaderOutput input) : COLOR0 { //some lambertian shading done in the code I left out here return color; } sampler TextureSampler = sampler_state { Texture = <ScreenTexture>; }; float4 GrayscalePixelShader(float2 TextureCoordinate : TEXCOORD0) : COLOR0 { // Get the color. float4 color = tex2D(TextureSampler, TextureCoordinate); // Turn pixel to grayscale. float grayscale = […]

HLSL纹理光:只输出纹理的特定部分(新问题)

问题1 我试图创造一个聚光灯,而不是给聚光灯内的圆圈一个简单的颜色,应用纹理。 但是,纹理应该只是一个黑色圆圈: 图像 。 解决scheme:我用于纹理的位置不正确。 旧的和错误的代码: float4 TexturedSpotlightPixelShader(VertexShaderOutput input, float2 TextureCoordinate : TEXCOORD0) : COLOR0 { //I left out all the other code in the shader, full code is at the bottom of the thread color = tex2D(SpotlightTextureSampler, TextureCoordinate); } 更好的代码,解决了我的黑色问题(但创建了一个新的): float4 TexturedSpotlightPixelShader(VertexShaderOutput input) : COLOR0 { //I left out all the other code […]

HLSL是否执行Shader Model LOD指令?

DX Shader Model 5.0 有一个lod指令 。 它返回“将用于纹理过滤的LOD(详细程度)”。 HLSL是否具有可以做同样的内置内在function? 我知道我可以手动评估LOD ,但我想知道是否有更好的方法。

HLSL如何处理剪辑(vector)?

我的目标是将clip()转换为1.5版本的GLSL。 我目前正在做一个基本的: if (x < 0) discard; 但是如果x不是标量,显然我不能使用“<”运算符。 所以我想知道HLSL究竟是如何处理剪辑函数中的vector(或matrix),所以我可以解释这些。 任何资源将不胜感激,因为我找不到任何有关该function的详细信息。 谢谢!

XNA渲染目标深度testing

我想这是一个经常被问到的问题,但是阅读它我似乎无法得出如何解决这个问题的明确答案。 我有两个HLSL着色器(我简化了它们,只是输出一个颜色)需要RenderTargets。 例如模糊着色器。 有两个球围绕一个中心点旋转。 当他们旋转,一个穿过另一个和相机闭塞另一个球,反之亦然。 如果我将它们渲染到同一个rendertarget(使用相同的技术),他们显然共享一个深度缓冲区,深度testing正确发生。 但是,当我需要使用不同的技术来分别渲染每个球(一个球到一个rendertarget,另一个球到另一个球),然后尝试复合他们深度testing失败,他们只是呈现在对方之上。 附加是我正在使用的代码。 我已经简化了很多,但它表明我遇到的问题。 我如何去渲染两个不同的对象,使用两种不同的技术来处理两个不同的rendertarget,然后将它们合成? DepthTesting.cs effect.fx

在VS2012中可以同时编译VS和PS吗?

VS2012有一个编译时编译*.hlsl文件的内置选项(例如检查错误)。 但从我看到它需要我为每个文件提供入口点(函数)名称。 如果我在一个文件中同时包含Vertex Shader和Pixel Shader该怎么办? 是否有可能使VS2012编译该文件(两个着色器)来检查错误? 我知道这是可能的Custom Build Tool选项,并在Command Line使用fxc (我只是告诉它编译文件,而不指定入口点)。 但是由于默认情况下VS2012也使用fxc ,我认为在selectHLSL Compiler选项时也应该可以在单个文件中编译2个着色HLSL Compiler 。

HLSL着色器(效果)中的SetFloat()不起作用 – variables停留在0

我有一个问题,我想在我的着色器中设置两个简单的浮点variables。 我在这个项目中有十几个其他着色器,但是由于某种原因,我在这个项目中有一个我不能发现的bug。 这是我正在做的事情。 为了简洁起见,我会对其进行编辑,但请尽量保持完整。 任何建议都非常欢迎! 首先,将video的宽度和高度存储在表示着色器的类中,然后调用设置variables的函数。 _hVideoWidth = _ptrEffect->GetParameterByName(0, "videoWidth"); _hVideoHeight = _ptrEffect->GetParameterByName(0, "videoHeight"); pShader->_videoWidth = pCameraManager->_backBufferWidth; pShader->_videoHeight = pCameraManager->_backBufferHeight; pShader->SetActive(); _ptrEffect->SetFloat(_hVideoWidth, _videoWidth); _ptrEffect->SetFloat(_hVideoHeight, _videoHeight); 然后我做我的绘画: UINT cPasses; pShader->GetEffect()->Begin(&cPasses, 0); // Drawing code here pShader->GetEffect()->End(); 我的着色器将使用videoHeight / Width来缩放到视口。 如果我硬编码的宽度和高度,这一切都完美的作品。 cbuffer VideoData : register(b0) { float videoWidth; float videoHeight; } VertexShaderOutput UILineVertexShaderFunction(VertexShaderInput input) { VertexShaderOutput output; […]

如何使用XNA / HLSL渲染纹理地图集的子区域?

是否有可能渲染成纹理图集? 我一直在想如何减less阴影映射所需的纹理数量,并且在这里发现了一篇关于将多达十六个阴影贴图渲染成一个纹理贴图的博客文章。 根据上面提到的博客文章,这是所需的步骤: 1.第一步是写纹理; 绑定到framebuffer并设置视口渲染到纹理子区域。 2.访问子区域时,缩放/偏置纹理坐标如下:scale =区域大小/纹理大小,bias =区域偏移/纹理大小。 我明白这一点,但我不知道如何专门改变视口,使我能够渲染到纹理的某个方块。 我已经find了很多关于阅读的信息(上取样和下取样),但我不知道如何操作视口来渲染到屏幕上的一个小方形区域,以及如何用比后台缓冲区小的纹理做这个。 我现在使用的是XNA和HLSL,因为它比SharpDX更简单,在我理论工作达到100%之前,没有任何意义。 谢谢你的帮助。

如何在不使用Effect类的情况下在sharpdx中设置着色器全局variables

我正在与SharpDX,我想尝试使用(统一)全局variables为HLSL常量,而不是常量缓冲区。 但是,在我的代码SharpDX的效果类不使用:我使用PixelShader和VertexShader类,而不是直接从字节码blob(我只是不使用技术/通道,我编译着色器分开)构造。 通过Effect类,我可以通过名称为HLSL程序中的任何常量赋值新的值,因为DirectX允许在任何时候。 例子(我没有testing过这个,是的,这里很丑): SharpDX.Direct3D11.Effect fx = // fx.GetVariableByName("someOption").AsVector().Set<Vector3>(newVectorValue);//nice 但是我不使用Effect类。 我如何使用Vertex / PixelShader类实例设置全局HLSLvariables? 如果这是不可能的,那么SharpDX开发人员就会感到羞耻,而在本机DirectX中则更容易。

适当的方向灯在多个型号上

我一直在试图实现一个定向光进入我正在做的XNA游戏,但由于某种原因,我似乎无法让定向光成为一个真正的定向光。 相反,我坚持定向点光源。 在这种情况下,“方向点光”意味着“每个模型都有一个适当的定向光源,但是光线来自一个固定点,而不是偏离模型的位置”。 我想要的是定向光来自每个模型的偏移量,以便每个模型,不管位置,将从相同的角度点亮。 例如:如果我有2个立方体(单独的模型),c1在(0,0,0)和c2在(4,0,4),我的光线方向为(0,2,2),我站在(6,0,-3)我想看到顶部,左侧(如果我能看到它),我的立方体的面被点亮,但是我得到了c1的背面,左面和顶面,但右面,c2灯的前面和上面,这不是我想要的。 当前的着色器代码 // Global world variables float4x4 World; float4x4 View; float4x4 Projection; // Ambient Lighting variables float3 AmbientColor; float AmbientIntensity; // Diffuse Lighting variables float3 DiffuseColor; float DiffuseIntensity; float3 DiffuseLightDirection; // Texturing variables Texture ModelTexture; // Texture sampler sampler TextureSampler = sampler_state { texture = <ModelTexture> ; magfilter = LINEAR; minfilter […]