Articles of 着色器

渲染2个使用不同着色器的图像

基于giawa / nehe教程,我如何渲染2个不同着色器的图像。 我对OpenGl和着色器相当陌生,所以我不完全确定我的代码中发生了什么,但是我认为最后调用的着色器会覆盖第一个。 private static void OnRenderFrame() { // calculate how much time has elapsed since the last frame watch.Stop(); float deltaTime = (float)watch.ElapsedTicks / System.Diagnostics.Stopwatch.Frequency; watch.Restart(); // use the deltaTime to adjust the angle of the cube angle += deltaTime; // set up the OpenGL viewport and clear both the color and depth […]

深度地图分辨率转移

问题是你可以看到阴影映射, 实际上它工作正常,但是在一定的条件下,深度图大小必须等于渲染缓冲区的大小,我使用无限定向光 所以如果窗口是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

从OpenGL中的Cg着色器访问统一variables

我想用OpenGL实现一个简单的PC程序,使用强制Cg着色器(不需要任何Unity)。 我在这个页面上find了一些提示http://bobobobo.wordpress.com/2008/10/05/cg-1/ ,并在我自己的项目中保存了Cgprogram , Cgcontext和Cgprofiletypes。 问题是:如何访问C ++代码中的统一variables? 我已经尝试了glGetUniformLocation的方式,但这将无法正常工作,因为第一个参数必须是GLuinttypes的程序ID,我有CG程序types。 我已经自己search了(包括Nvidia Cg'教程'),但是我似乎无法在页面上findCg和OpenGL,而无需处理Unity。 编辑:我现在可以访问variables,但在我的情况下,我试图改变一个纹理,它不绑定。

用SV语义进行D3D11着色器签名validation

我试图找出将一个着色阶段的输出与下一个着色阶段的input相关联的规则是什么。 由于D3D11没有任何错误检查着色器阶段之间的联系,我已经写了一些代码来检查它们,比较每个input的D3D11_SIGNATURE_PARAMETER_DESC结构,并将其匹配到前一阶段的输出。 检查签名的代码在这里 。 除了当前阶段没有通过某个阶段的某些特殊input时,这种情况通常是有效的。 一个例子是像素着色器的SV_IsFrontFaceinput。 另一个例子是顶点着色器之后的任何阶段的SV_PrimitiveIDinput。 我一直在谷歌search和阅读msdn.microsoft.com到目前为止,我完全不清楚这些特殊的SV语义如何工作。 尤其是: Q1 。 他们的顺序是否重要? 还是必须在上一阶段传入的所有input之后才会发生? Q2 。 这些“特殊的”SV值中的一些可以通过查看SystemValueType字段来D3D11_SIGNATURE_PARAMETER_DESC 。 例如,可以通过检查SystemValueType字段是否是D3D_NAME_IS_FRONT_FACE来识别D3D_NAME_IS_FRONT_FACE 。 但是, SV_GSInstanceID呢? 在D3D_NAME枚举中似乎没有相应的值。 http://msdn.microsoft.com/en-us/library/windows/desktop/ff728724(v=vs.85).aspx Q3 。 有明确解释着色器input参数链接规则的链接吗? 或者更好的,validation着色器签名的代码?

HLSL:一组纹理和采样器状态

着色器必须根据每个像素的原始纹理的Alpha值在多个纹理之间切换。 现在,如果我不必担心SamplerStates,那么这将会很好。 我创建了我的纹理数组,并可以根据像素的Alpha值select纹理。 但是,如何创建一个SamplerState数组并将其链接到我的纹理数组? 我试图通过添加(int i)来将SamplerState作为一个函数来处理,但是这不起作用。 此外,我不能使用Texture.Sample,因为这是着色器模型2.0。 //shader model 2.0 (DX9) texture subTextures[255]; SamplerState MeshTextureSampler(int i) { Texture = (subTextures[i]); }; float4 SampleCompoundTexture(float2 texCoord, float4 diffuse) { float4 SelectedColor = SAMPLE_TEXTURE(Texture, texCoord); int i = SelectedColor.a; texture SelectedTx = subTextures[i]; return tex2D(MeshTextureSampler(i), texCoord) * diffuse; }

空间纹理方向的问题

我目前在3D空间中绘制纹理,并且在方向上存在一些问题。 我希望我的纹理总是面向用户。 我期望的结果看起来像 请注意,当我们旋转世界并保持面向用户时,文本大小保持不变。 现在我可以在3D空间中绘制文字,但是它并不是以正面而是以世界旋转。 我用下面的着色器得到了这样的结果: 顶点着色器 统一的vec3位置; void main() { gl_Position = vec4(Position, 1.0); } 几何着色器 layout(points) in; layout(triangle_strip, max_vertices = 4) out; out vec2 fsTextureCoordinates; uniform mat4 projectionMatrix; uniform mat4 modelViewMatrix; uniform sampler2D og_texture0; uniform float og_highResolutionSnapScale; uniform vec2 u_originScale; void main() { vec2 halfSize = vec2(textureSize(og_texture0, 0)) * 0.5 * og_highResolutionSnapScale; vec4 […]

使用深度纹理进行深度testing

我想知道是否可以将我的场景渲染到深度纹理上,然后在另一个传递中使用该纹理进行深度testing。 我有一个想法,在着色器,但是可能的硬件方面?

在着色器操作中查找表格

我所需要的显然是非常简单的,在片段着色器中的查找表。 似乎自然的方式将是一个数组float lut[] ,但在OpenGL ES的一些实现中,我得到一个错误 “configuration文件要求索引expression式是编译时常量”。 接下来的方法将是一个1D纹理填充的值,但再次OpenGL ES不喜欢:) 在片段着色器中有256个浮点元素的查找表最简单的方法是什么? (我想这将是一个2D纹理,但它看起来像是一些开销,我不知道是否有可能处理着色器上的两个纹理) PS我是OpenGL的初学者,但我需要的是简单的纹理image processing。

如何修复在顶点着色器中碰撞的模型matrix?

我是OpenGL编程的新手,我正在编写一些基本代码来在屏幕上显示一些对象。 我正在显示一个金字塔形状,以及我正在显示的一个框形状。 金字塔形状是一个类(C ++),每个金字塔对象创建它自己的VBO(存储点/颜色)。 盒子也一样。 我遇到的问题是我有两个形状,并使用相同的顶点着色器。 由于我在着色器中为每个对象应用了一个模型matrix,所以模型matrix被设置为一个对象,但是当另一个对象去显示它自己时,它会覆盖前一个对象的模型matrix。 所以只有一个对象在完成显示方法后才有正确的模型matrix。 我也使用分层转换来将对象附加到对方。 我有根对象存储视图/投影matrix,层次结构树的子项存储他们各自的模型转换。 当孩子想要展示自己的时候,它会向上走,计算出自己需要做的所有转换。 这个问题在这里也适用,因为要显示的最后一个孩子将是其模型matrix被应用在顶点着色器中的那个孩子。 我似乎无法弄清楚如何区分MVPmatrix应用于哪个顶点的着色器。 我想我错过了一些非常基本的东西,但我似乎无法弄清楚…任何帮助都会让我的生活变得更轻松! 编辑:是否有可能着色器覆盖glDrawArrays()/ glDrawElements()调用之间的MVPmatrix?

雪碧框架绑定多个纹理

在尝试批量渲染尽可能多的四边形(精灵),我实例渲染一个单位大小的四边形,并传递每个实例数据的缓冲区,包括宽度/高度,纹理坐标,颜色, 纹理ID ,等等 离线,我有一个工具,基于任何特定的精灵animation构造纹理地图,所以输出灵活的纹理地图集宽度/高度,哪些精灵参考哪些纹理地图集,等等。 最终的结果是,我可能有许多纹理地图集和精灵参考任何一个地图集当前帧。 我需要一个强大的解决scheme,可以让我以任何顺序绘制这些精灵,同时尽可能减less纹理绑定。 经过一番研究,有两个select: 将多个2D纹理合并为一个2Darrays纹理(高达GL_MAX_ARRAY_TEXTURE_LAYERS_EXT) 绑定采样器数组中的多个纹理(最多MAX_TEXTURE_IMAGE_UNITS) 我相信第一个解决scheme需要所有的纹理是相同的高度/宽度。 第二个解决scheme似乎有一个限制,需要一个固定的索引来访问片段着色器中的采样器数组。 我想我想用第二种解决scheme,但是我担心如果必须使用一个常量索引,我将无法正确编写片段着色器,因为我将通过每个实例数据获取索引input。 我的上述怀疑是否正确? 第二个解决scheme有一个已知的工作吗? 还是有更好的办法做到这一点比我提出的。