Articles of 着色器

如何在Shader Model 3 HLSL中不展开循环

我正在HLSL的raycaster工作,不幸的是它必须在DX9。 但是它不能被编译 我在DX11中做了类似的raycaster,我知道FXC编译器总是有一个问题,它试图展开循环,这个问题可以在循环之前用[loop]命令在DX11中解决,这就告诉编译不展开循环。 我可以在DX9中做类似的事吗? 我正在使用2010年2月编译器。 我的循环没有做任何发散的stream量控制的东西。 我希望能够尽早做到这一点。

香椿着色器与纹理。 这可以优化吗?

我对OpenGL相当陌生,经过长时间的反复试验, Nehe的Cel-Shading渲染和我的模型加载器集成在一起,并且使用了Toon阴影,同时勾画出了它们的原始纹理。 结果实际上是模型纹理的Cel Shading效果,但是它提高了程序的速度,即使屏幕上只有3个模型也是非常慢的。 由于结果是一种黑客入侵,我在想,也许我正在执行一些额外的步骤或额外的渲染任务,可能是不需要的,并放慢了比赛? 不必要的东西,也许你们可以发现? MD2和3DS加载程序都有一个在创建时调用的InitToon()函数来加载着色器 initToon(){ int i; // Looping Variable ( NEW ) char Line[255]; // Storage For 255 Characters ( NEW ) float shaderData[32][3]; // Storate For The 96 Shader Values ( NEW ) FILE *In = fopen ("Shader.txt", "r"); // Open The Shader File ( NEW ) if (In) // […]

自定义的深度偏移(顶点)着色器

正如大多数中间graphics程序员所知道的,z战斗可能是一个问题。 这就是为什么大多数游戏引擎使用斜率深度偏移algorithm来防止这种情况发生的原因。 由于没有关于如何执行的直接信息,除了微软的参考DirectX页面之外 ,我想询问是否有人知道如何编写顶点着色器来实现这样的机制。 我写了一个片段,但这不像预期的那样。 这是(Cg顶点着色器代码): out_position = mul(worldviewproj_matrix, in_position); out_world_position = mul(world_matrix, in_position); float Dz = camera_position.z – out_world_position.z; float Dy = camera_position.y – out_world_position.y; float Dx = camera_position.x – out_world_position.x; float m = max( abs(Dz / Dy), abs(Dz / Dx)); float Offset = m * main_bias + main2_bias; out_position.z -= Offset * 0.005;

帮助了解iOS上的GLSL定向灯(左手坐标系)

我现在已经从GLKBaseEffect更改为自己的着色器实现。 我有一个着色器管理器,它在合适的时间编译并应用着色器,并执行一些着色器设置,如灯光。 请看看我的顶点着色器代码。 现在,眼睛的空间应该有光线的方向,但是我觉得有些东西我不明白。 在用相机设置我的视图之后,我保存一个lightMatrix来将光从全局空间转换到眼图空间。 我的模型视图和投影设置: – (void)setupViewWithWidth:(int)width height:(int)height camera:(N3DCamera *)aCamera { aCamera.aspect = (float)width / (float)height; float aspect = aCamera.aspect; float far = aCamera.far; float near = aCamera.near; float vFOV = aCamera.fieldOfView; float top = near * tanf(M_PI * vFOV / 360.0f); float bottom = -top; float right = aspect * top; float left […]

计算着色器中从查看器到对象的距离

早上好, 我正在通过创建本文中概述的球形广告牌技术。 我正在尝试创建一个着色器,用于计算从相机到场景中所有对象的距离,并将结果存储在纹理中。 我一直得到一个完全黑色或白色的纹理。 这是我的问题: 我认为从食人魔自动发送到顶点着色器的位置是在对象空间中? gpu将顶点着色器的输出位置发送到片段着色器时进行插值。 它是否对我的深度计算执行相同操作,还是需要将该计算移至片段着色器? 有没有办法debugging着色器? 我没有错误,但我不知道我得到我的参数正确传递到着色器。 这是我的着色器代码: void DepthVertexShader( float4 position : POSITION, uniform float4x4 worldViewProjMatrix, uniform float3 eyePosition, out float4 outPosition : POSITION, out float Depth ) { // position is in object space // outPosition is in camera space outPosition = mul( worldViewProjMatrix, position ); // calculate distance from […]

如何使用HLSL实现2纹理的input纹理有限的alphablending?

我试图实现一个HLSL着色器,正常的Alphablend与预乘颜色(就像XNA4一样),但取决于一些现有的颜色。 人们可以考虑在二维地形上添加一个辉光,在这个地形中,辉光只能应用于地形的不完全透明部分。 我目前的代码是: sampler TextureSampler1 : register(s1); // Addition (Terrain-only particles) sampler TextureSampler2 : register(s2); // Existing (Terrain) float4 main(float4 color : COLOR0, float2 texCoord : TEXCOORD0) : COLOR0 { // Look up color from partly transparent existing texture (premultipied colors) float4 existing = tex2D(TextureSampler2, texCoord); // For transparent pixels -> Color stays the same […]

多次渲染一个对象

目前,我正面临Directx 11中多次渲染相同对象的问题,因为对象具有: 散射着色器 定向照明着色器 纹理着色器 现在最后的颜色应该是他们所有的方式放在一起,也许是这样的: 渲染漫射 呈现纹理 呈现定向 最终颜色=(漫reflection+纹理)*照明//不知道这个 但是,这怎么能成真呢? 没有效果框架!

在Direct3D 10中奇怪的渲染

我正在写一个应用程序,在屏幕上呈现graphics。 应用程序可以在Direct3D9和Direct3D10graphics模块之间切换(我编写了包装D3D9和D3D10的DLL)。 当试图渲染一个testing网格(一个在D3DX9和DXUT库中作为一个存储网格的环面,你可以在DirectX10样本中find),Direct3D10模块的performance很怪异。 这是我得到的。 D3D9: D3D10: 对于这两种情况,视图,投影和世界matrix是相同的。 唯一不同的是设备初始化代码和HLSL效果文件(为了简单起见,我只应用环境颜色,不使用高级照明,纹理等)。 这可能是由于错误的设备初始化或由于着色器不好? 我将不胜感激任何提示。 我可以通过请求发布任何代码片段。 提前致谢。

每个碎片照明系统的行为就像环境照明系统

这是我的片段着色器的相关部分 varying vec3 normal; varying vec3 halfv; … vec4 color = ambient * gl_LightSource[0].ambient; vec3 n = normalize(normal); float nl = max(dot(n, gl_LightSource[0].position.xyz), 0.0); if (nl > 0.0) color += (diffuse * gl_LightSource[0].diffuse * nl) + (specular * gl_LightSource[0].specular * pow(max(dot(n, normalize(halfVector)), 0.0), shininess)); gl_FragColor = color; 凡环境,漫reflection,镜面reflection和光泽都已经定义。 normal和halfv在我的顶点着色器中定义为 normal = normalize(gl_NormalMatrix * gl_Normal); halfv […]

对Vector3的角度?

我正在努力使我的方向灯在大气散射着色器中与太阳相匹配。 我有一个浮动范围从0到6.28(TwoPi)。 我怎样才能从这个角度来计算vector3? 我需要一个角度的原因是因为我的光线角度是这样创建的: LookAt(new Vector3(100, 100, 100), Vector3.Zero, Vector3.Forward); 谢谢。