Articles of 着色器

XNA奇怪的照明,着色器

嘿家伙,我有奇怪的照明问题。 我写了自己的“延迟照明”着色器,这个事情发生了: 图:正常地图 图:光照图 只要我只使用一个大的网格,一切似乎都没问题,但这看起来很不对。 这里是我如何计算点光源地图( http://www.packtpub.com/article/advanced-lighting-3d-graphics-xna-game-studio-40 ): float4 PixelShaderFunction(VertexShaderOutput input) : COLOR0 { // Find the pixel coordinates of the input position in the depth // and normal textures float2 texCoord = postProjToScreen(input.LightPosition) + halfPixel(); // Extract the depth for this pixel from the depth map float4 depth = tex2D(depthSampler, texCoord); // Recreate the […]

凹凸贴图问题GLSL

我的凹凸映射项目有一个小问题。 虽然一切正常(至less从我所知道的情况来看),但是在某个地方会有一些小小的错误,当灯光照到一边或另一边时,我会在砖墙上看到不正确的阴影,如下图所示: 光在右侧,所以墙上的阴影应该是另一种方式。 我提供了着色器来帮助find问题(我没有太多的着色器经验)。 着色器: varying vec3 viewVec; varying vec3 position; varying vec3 lightvec; attribute vec3 tangent; attribute vec3 binormal; uniform vec3 lightpos; uniform mat4 cameraMat; void main() { gl_TexCoord[0] = gl_MultiTexCoord0; gl_Position = ftransform(); position = vec3(gl_ModelViewMatrix * gl_Vertex); lightvec = vec3(cameraMat * vec4(lightpos,1.0)) – position ; vec3 eyeVec = vec3(gl_ModelViewMatrix * gl_Vertex); viewVec […]

如何自动渲染具有特定着色器的所有不透明网格物体?

我有一个镜面轮廓着色器,我希望在特定相机呈现时在场景的所有不透明网格物体上使用。 当手动应用于某些材质时,着色器正常工作。 着色器如下所示: Shader "Custom/Outline" { Properties { _Color ("Main Color", Color) = (.5,.5,.5,1) _OutlineColor ("Outline Color", Color) = (1,0.5,0,1) _Outline ("Outline width", Range (0.0, 0.1)) = .05 _SpecColor ("Specular Color", Color) = (0.5, 0.5, 0.5, 1) _Shininess ("Shininess", Range (0.03, 1)) = 0.078125 _MainTex ("Base (RGB) Gloss (A)", 2D) = "white" {} } SubShader […]

我如何find片段着色器中4个顶点之间的位置?

我使用SharpDX(C#中的DirectX11)创建了一个着色器,该着色器从顶点着色器的输出中获取一个片段(2个点),然后将它们传递给一个几何着色器,该着色器将该线条转换为一个矩形(4个点)四角有纹理坐标。 之后,我想要一个片段着色器(它接收插入的位置和插值的纹理坐标),检查“矩形的脊柱”的深度(即,在通过矩形中间的线)。 问题是我不知道如何提取在矩形的脊柱相应片段的位置。 发生这种情况是因为我有纹理坐标插值,但我不知道如何使用它们来获得我想要的片段,因为a)纹理的坐标系和b)我的片段在屏幕空间中的位置不是相同。

用Gregory补丁逼近细分曲面进行硬件镶嵌

我正在尝试实施该方法( http://research.microsoft.com/en-us/um/people/cloop/sga09.pdf )。 不幸的是我对第三章中的公式不太清楚,我希望得到一些答案。 我不清楚以下几点,你知道吗? 当我计算T(u,v,w)(一个点)时,我得到了什么样的价值?我该如何处理结果呢? 我从域着色器SV_DomainLocation接收值u,v,w还是计算? 第3.2章重心也是角点吗? 图5中的v被v取代了吗? 在第3.3章边点中有一个e0 +的公式,但没有一个是e0-? 图5中哪个边是e0 +? 以及如何计算e0 +的其他边缘? 在我看来(图5)有5个边,但只有一个e0 +计算,不应该有5 e0 +? 你可能有一个关于控制网格的控制点图吗? 我有看到大局的问题 在第3.4章:面点中,提到了不同的横向向量r,r0 +和r0-,但r0 +只有一个公式。 是r = r0 + = r0-? 如果不是,我该如何计算r和r0-? 我希望有人能指出我正确的方向,提前谢谢你!

ShaderBytecode编译一种技术多遍

我有一个像基本结构的效果代码 technique TechniqueName { pass FirstPass { Profile = fx_4_0 VertexShader = RenderFirstVS GeometryShader = null PixelShader = RenderFirstPS } pass SecondPass { Profile = fx_4_0 VetrexShader = RenderSecondVS GeometryShader = null PixelShader = RenderSecondPS } pass ThirdPass { Profile = fx_4_0 VertexShader = RenderThirdVS GeometryShader = null PixelShader = RenderThirdPS } } 现在我试着编译这个 using […]

VertexColor着色器在构建的应用程序中无法正常工作

我想改变我的网格的顶点颜色。 光源不得影响具有该着色器的对象,其光照必须仅由其顶点颜色确定,因此我将Lighting Off 。 我使用这个简单的着色器: Shader "VertexColored/Simple" { Properties { _MainTex ("Base (RGB)", 2D) = "white" {} } SubShader { Pass { ColorMaterial AmbientAndDiffuse Lighting Off SetTexture [_MainTex] { Combine texture * primary } } } Fallback "VertexLit" } 而这个脚本: using UnityEngine; using System.Collections; public class BehaviourScript : MonoBehaviour { void Start() { Color[] exclrs […]

核心opengl 3.3推荐的着色器管道基础设施

我正在编写一个游戏项目,我正在使用OpenGl 3.3核心上下文来执行我的渲染。 目前我有不同types的渲染器。 每个渲染器都有它自己的一对顶点和片段着色器,一个统一的和属性的位置结构。 一个包含glBuffers,vertex-array-object和numverts(int)的结构,包含渲染一个对象(网格)所需的所有数据。 最后但并非最不重要的一个构造函数来创建和初始化属性/统一的位置一种方法来加载网格到网格数据和渲染方法本身。 我对这个devise绝对不满意。 每次我想创建一个新的简单着色器时,我都必须编写所有这些代码,而且我还没有find一种方法来减小新着色器的开销。 我所能做的就是在属性/统一位置结构中根据variables名自动获取属性/统一位置,并根据顶点结构的布局自动设置属性指针。 另一件我不喜欢的事情是,当我想要实现固定functionstream水线的函数glClipPlane的function时,我需要分别添加到每个着色器的统一,我需要在每个着色器中设置这个统一我需要在每个片段着色器中实现碎片的丢弃 是否有一些常见的做法可以显着降低新着色器的代码开销? 有好的着色器管道,你可以推荐我看看吗? 是否有一些好的做法,一次向几个着色器添加function?

不可见时绘制角色轮廓

我有一个网格代表我的性格。 当其他物体从相机的视野中阻挡时,我想给它一个部分透明的灰色轮廓。 我使用Ogre3D和GLSL作为着色语言,但这是一个相当技术/语言不可知论的问题。

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; […]