【翻译】Managed DirectX(第十二章上 )

用PY32F003F18的PWM互补输出驱动无刷电机,保姆级配置流程(含代码) 本文详细介绍了如何利用PY32F003F18微控制器的TIM1定时器配置PWM互补输出功能来驱动三相无刷电机,涵盖硬件设计、代码实现及六步换相算法。通过保姆级配置流程和实用代码示例,帮助开发者快速掌握无刷电机驱动技术,适用于工业自动化和消费电子等领域。 阅读详情

第十二章 使用Hight Level Shader Language(上)

翻译:clayman

clayman_joe@yahoo.com.cn

仅供个人学习只用,勿用于任何商业用途,转载请注明作者^_^   

 

    

至今为止,我们的对于编程管道和HLSL的学习还根本没有表现出它的强大来。所实现的功能都可以通过固定管道来完成。然而,还有很多高级功能是固定管道不能完成的,只有使用HLSL才能完成。

     这一章我们将深入学习HLSL,教你如何使用这门技术来完成固定管道不能完成的任务。包括:

n          简单的顶点动画

n          简单的颜色动画

n          纹理混合

n          光照模型以及纹理

n          per-vertex lighting和per-pixel lighting的区别

 

 

使用简单的公式模拟动画

     为了节约时间,我们将使用上一章中的渲染茶壶的文件作为开始。我们将稍微修改一下代码,来让你知道适用编程管道实现一些简单的动画是多么容易。我们将让mesh在渲染时不停晃动。

     打开文件之后,首先要做的就是把茶壶换为一个球体。并不是不能对茶壶进行动画,只不过球体的效果会更好而已。修改如下代码:

mesh = Mesh.Sphere(device, 3.0f,36,36);

     球体尺寸比较大,因此修改一个观察矩阵:

viewMatrix = Matrix.LookAtLH(new Vector3(0,0, 15.0f), new Vector3(), new Vector3(0,1,0));

     现在运行程序,可以看到一个被单一方向光照亮了不停在旋转的球体,非常单调。我们如何才能让他动画起来呢?在着色器代码中,把唯一一行变换顶点的代码作如下修改:

float4 tempPos = Pos;

tempPos.y += cos(Pos + (Time * 2.0f));

Out.pos = mul(tempPos, WorldViewProj);

     注意到这里再次使用了Time变量。由于之前的代码没有声明过这个变量,所以还要添加代码:

Float Time = 0.0f;

     除此之外,还必须每帧更新这个变量,在UpdateWorld方法中添加对这个变量的更新:

effect.SetValue("Time",angle);

     但是,这段着色代码到底作了些什么呢?首先,使用一个临时变量来保存输入顶点的位置。然后使用当前顶点位置加上固定更新的时间变量的余弦值作为这个临时变量的y值。由于余弦值是在-1到1之间重复变化的,因此,这种效果会不断重复。在动画了顶点之后,对临时变量进行变换而不是变换原来的输入位置。

     虽然这样的更新过后效果看起来好了很多,但是,我们还能做的更好。为什么不对颜色也做一些动画呢?使用以下代码代替原来的Out.diff初始化。

Out.diff = sin(Pos + Time);

     显然,这段代码和之前动画顶点的差不多。唯一的区别就是这次使用了正弦值。这个例子的目的只是告诉你我们如何让一个枯燥的物体很快就运动起来。HLSL允许通过对主要代码做最少的修改就改变整个渲染效果。

至今为止,我们的对于编程管道和HLSL的学习还根本没有表现出它的强大来。所实现的功能都可以通过固定管道来完成。然而,还有很多高级功能是固定管道不能完成的,只有使用HLSL才能完成。

     这一章我们将深入学习HLSL,教你如何使用这门技术来完成固定管道不能完成的任务。包括:

n          简单的顶点动画

n          简单的颜色动画

n          纹理混合

n          光照模型以及纹理

n          per-vertex lighting和per-pixel lighting的区别

 

 

使用简单的公式模拟动画

     为了节约时间,我们将使用上一章中的渲染茶壶的文件作为开始。我们将稍微修改一下代码,来让你知道适用编程管道实现一些简单的动画是多么容易。我们将让mesh在渲染时不停晃动。

     打开文件之后,首先要做的就是把茶壶换为一个球体。并不是不能对茶壶进行动画,只不过球体的效果会更好而已。修改如下代码:

mesh = Mesh.Sphere(device, 3.0f,36,36);

     球体尺寸比较大,因此修改一个观察矩阵:

viewMatrix = Matrix.LookAtLH(new Vector3(0,0, 15.0f), new Vector3(), new Vector3(0,1,0));

     现在运行程序,可以看到一个被单一方向光照亮了不停在旋转的球体,非常单调。我们如何才能让他动画起来呢?在着色器代码中,把唯一一行变换顶点的代码作如下修改:

float4 tempPos = Pos;

tempPos.y += cos(Pos + (Time * 2.0f));

Out.pos = mul(tempPos, WorldViewProj);

     注意到这里再次使用了Time变量。由于之前的代码没有声明过这个变量,所以还要添加代码:

Float Time = 0.0f;

     除此之外,还必须每帧更新这个变量,在UpdateWorld方法中添加对这个变量的更新:

effect.SetValue("Time",angle);

     但是,这段着色代码到底作了些什么呢?首先,使用一个临时变量来保存输入顶点的位置。然后使用当前顶点位置加上固定更新的时间变量的余弦值作为这个临时变量的y值。由于余弦值是在-1到1之间重复变化的,因此,这种效果会不断重复。在动画了顶点之后,对临时变量进行变换而不是变换原来的输入位置。

     虽然这样的更新过后效果看起来好了很多,但是,我们还能做的更好。为什么不对颜色也做一些动画呢?使用以下代码代替原来的Out.diff初始化。

Out.diff = sin(Pos + Time);

     显然,这段代码和之前动画顶点的差不多。唯一的区别就是这次使用了正弦值。这个例子的目的只是告诉你我们如何让一个枯燥的物体很快就运动起来。HLSL允许通过对主要代码做最少的修改就改变整个渲染效果。

至今为止,我们的对于编程管道和HLSL的学习还根本没有表现出它的强大来。所实现的功能都可以通过固定管道来完成。然而,还有很多高级功能是固定管道不能完成的,只有使用HLSL才能完成。

     这一章我们将深入学习HLSL,教你如何使用这门技术来完成固定管道不能完成的任务。包括:

n          简单的顶点动画

n          简单的颜色动画

n          纹理混合

n          光照模型以及纹理

n          per-vertex lighting和per-pixel lighting的区别

 

 

使用简单的公式模拟动画

     为了节约时间,我们将使用上一章中的渲染茶壶的文件作为开始。我们将稍微修改一下代码,来让你知道适用编程管道实现一些简单的动画是多么容易。我们将让mesh在渲染时不停晃动。

     打开文件之后,首先要做的就是把茶壶换为一个球体。并不是不能对茶壶进行动画,只不过球体的效果会更好而已。修改如下代码:

mesh = Mesh.Sphere(device, 3.0f,36,36);

     球体尺寸比较大,因此修改一个观察矩阵:

viewMatrix = Matrix.LookAtLH(new Vector3(0,0, 15.0f), new Vector3(), new Vector3(0,1,0));

     现在运行程序,可以看到一个被单一方向光照亮了不停在旋转的球体,非常单调。我们如何才能让他动画起来呢?在着色器代码中,把唯一一行变换顶点的代码作如下修改:

float4 tempPos = Pos;

tempPos.y += cos(Pos + (Time * 2.0f));

Out.pos = mul(tempPos, WorldViewProj);

     注意到这里再次使用了Time变量。由于之前的代码没有声明过这个变量,所以还要添加代码:

Float Time = 0.0f;

     除此之外,还必须每帧更新这个变量,在UpdateWorld方法中添加对这个变量的更新:

effect.SetValue("Time",angle);

     但是,这段着色代码到底作了些什么呢?首先,使用一个临时变量来保存输入顶点的位置。然后使用当前顶点位置加上固定更新的时间变量的余弦值作为这个临时变量的y值。由于余弦值是在-1到1之间重复变化的,因此,这种效果会不断重复。在动画了顶点之后,对临时变量进行变换而不是变换原来的输入位置。

     虽然这样的更新过后效果看起来好了很多,但是,我们还能做的更好。为什么不对颜色也做一些动画呢?使用以下代码代替原来的Out.diff初始化。

Out.diff = sin(Pos + Time);

     显然,这段代码和之前动画顶点的差不多。唯一的区别就是这次使用了正弦值。这个例子的目的只是告诉你我们如何让一个枯燥的物体很快就运动起来。HLSL允许通过对主要代码做最少的修改就改变整个渲染效果。

使用纹理混合来决定颜色(Determining Color by Blending Textures)

     现实世界里,并不是所有的程序都随机的方式来产生颜色。一个模型通常都有一张或多张高细节的纹理。当需要把多张纹理混合起来时因该怎么做呢?当然,可以使用固定管道来完成这个任务。但是,如果你使用的模型和我们一直适用的tiny.x一样该怎么办呢?这个模型只有一张纹理,如何把两张纹理混合起来呢?

     为了方便,我们再从上一章渲染mesh的例子开始。注意此,我们的注意力将放在如何添加第二张纹理,并通过代码把两张纹理混合到一起,计算出最后的颜色。

特别提示:关于pixel shader中对结构的限制

    由于这里我们将要编写pixel shader,因此,了解在pixel shader1.1中对“结构体”的限制是很重要的。在1.4之前的版本,整个着色程序中只允许有12个结构体。对于1.4来说,限制是28个,仍然不是太多。对于2.0来说,支持更多复杂操作以及更高的结构数量。可以通过检查显卡的特性来看到底支持多少。

     知道了这个限制,我们纹理混合的方法将分为独立的两种:一个是相对相对简单的pixel shader,用于之支持1.1的显卡;另一个复杂版本则用于支持2.0以上的显卡。

     自然,从简单的1.1版本开始。在开始编写着色程序之前,更新一下代码。我们需要第二张纹理来进行混合。在类中添加纹理变量:

private Textur skyTexture;

     由于加载的模型只有一张纹理,我们还必须删除使用用材质和纹理数组的代码,具体修改请看源码。

     接下来,创建将用于混合到模型上的第二张纹理。你需要手动把SDK中的skybox.jpg文件复制到工程目录下。当然,也可以选择任何你喜欢的图片。在LoadMesh方法中创建这张纹理。

meshTexture = TextureLoader.FromFile(device, @"../../" + mtrl[i].TextureFilename);

skyTexture = TextureLoader.FromFile(device,@"../../skybox_top.jpg");

     好了,现在可以编写代码来混合这两张纹理了。在HLSL文件中添加如下代码:

float Time;

Texture meshTexture;

Texture skyTexture;

sampler TextureSampler = sampler_state{texture = <meshTexture>; mipfilter = LINEAR;};

sampler SkyTextureSample = sample_state{texture = <skyTexture>; mipfilter = LINEAR;};

     时间变量没有什么需要解释的。来看看两个Texture变量。这里不使用SetTexture方法来设定纹理状态,着色的代码将控制纹理并进行合适的采样。完全可以删除程序中的SetTexture方法了。两个sampler变量决定了如何对纹理进行采样。这里,使用一个线性mipmap过滤器对实际的纹理进行采样。你也可以使用minify以及magnify过滤器,以及这些采样状态下的大量clamping types。但这里,mipmap过滤器就可以了。

     在使用这个两个纹理变量之前,还需要对他们赋值。在C#代码中,加载了mesh之后的地方添加代码:

     加载了mesh之后就应该创建纹理,所以放在这个地方是合适的。但是,就算加载了mesh,创建了纹理,还有一个基本问题没有解决。模型只包含一组纹理坐标。使用以下的vertex shader程序代替原来的代码。

void TransformV1_1(

     in float4 inputPosition : POSITION,

     in float4 inputTexCoord : TEXCOORD0,

     out float4 outputPosition   : POSITION,

     out float4 outputTexCoord   : TEXCOORD0,

     out float4 outputSecondTexCoord  : TEXCOORD1

     )

{

     //Transform our position

     outputPosition = mul(inputPosition,WorldViewProj);

     //set our texture coordinates

     outputTexCoord = inputTexCoord;

     outputSecondTexCoord = inputTexCoord;

}

     可以看到,这段程序把顶点位置和一组纹理坐标作为输入,而输出时则返回变换之后的顶点位置,以及两组纹理坐标。实际上,这段代码为每个顶点复制了一遍纹理坐标。接下来,使用一下代码代替原来的pixel shader:

void TextureColorV1_1(

 in float4 P : POSITION,

 in float2 textureCoords : TEXCOORD0,

 in float2 textureCoords2 : TEXCOORD1,

 out float4 diffuseColor : COLOR0)

{

     //Get the texture color

     float4 diffuseColor1 = tex2D(TextureSampler, textureCoords);

     float4 diffuseColor2 = tex2D(SkyTextureSampler, textureCoords2);

     diffuseColor = lerp(diffuseColor1, diffuseColor2, Time);

};

     这段代码接收从vertex shader返回的顶点位置以及两组纹理坐标作为参数,返回每一个像素的颜色。这里,我们对两张加载的纹理进行采样(使用同样的纹理坐标),之后,对他们进行线性的茶汁计算(使用lerp函数)。Time变量决定了每张纹理的可见度。由于程序中还没有设置Time变量,因此,在DrawMesh方法中添加如下代码:

effect.SetValue("Time", (float)Math.Abs(Math.Sin(angle)));

     你可能会问为什么在这里进行数学运算,为什么不让着色程序来做呢?由于GPU更善于进行这种运算,你自然希望使它GPU来进行计算,而不是CPU。但是,这里的pixel shader限制你这样做。如果我们在shader里进行数学运算,那么只支持pixel shader1.1的显卡就不能运行它了。

     在测试混合效果之前,还需要做一件事。Vertex以及pixel shader的名称都改变了,technique也不再有效。修改代码:

technique TransformTexture

{

    pass P0

    {

        // shaders

        VertexShader = compile vs_1_1 TransformV1_1();

        PixelShader  = compile ps_1_1 TextureColorV1_1();

    }

}

     Technique本身的名字并没有改变,因此现在可以运行程序看看了。

     如果你的显卡支持pixel shader2.0怎么办呢?接下来,我们将修改代码,让他同时支持pixel shader1.1以及2.0。首先在C#代码中添加变量:

private bool canDo2_0Shaders = false;

     默认情况下,我们假设你的显卡不支持2.0。在创建了设备之后,再来检查pixel shader2.0是否可用。确保在创建Effect对象前添加如下代码:

canDo2_0Shaders = device.DeviceCaps.PixelShaderVersion >= new Version(2,0);

     由于我们将添加第二组technique来处理第二组着色器,所以我们将根据所能支持的最高着色模型(shader model)版本来选择使用哪一个technique:

effect.Technique = canDo2_0Shaders ? "transformTextrue2_0" : "TransformTexture";

     这里,如果支持2.0我们就使用新的technique,否则,还是用刚才的technique。在编写这个shader之前,还有一个需要更新的地方。修改对Time变量的更新:

if(CanDo2_0Shaders)

     effect.SetValue("Time",angle);

else

     effect.SetValue("Time", (float)Math.Abs(Math.Sin(angle)));

     你看,在高级的着色程序中,我们将让图形卡来完成数学运算。接下来添加新的HLSL代码:

     首先你注意到的一定是vertex shader变的更简单了。我们只是简单的进行了位置变换,传递了原来的纹理坐标,省略了原来的复制步骤。Pixel shader也同样变简单了。使用同一组纹理坐标来对不同的纹理进行采样。在pixel shader2.0之前,着色器只能只能对纹理坐标进行一次“读取”,所以我们之前编写的程序必须复制一遍坐标。同时,你还应该看到我们使用了同样的公式来进行插值计算。而对于technique来说,我们使用了ps_2_0来编译piexl shader程序。

     从画面上来说,你几乎看不出是哪一个shader在运行。如今,大多数的应用程序都应该支持最新的图形卡,并且使用各种特性来让画面变的光彩夺目。但是,同时也应该尽可能的让硬件不支持这些特性的机器能通过其他一些方法,大概的模拟出这些效果。

光照纹理

     在前一章,讨论了如何使用方向光来照亮茶壶。当时所用的茶壶并没有纹理,而且灯光都是通过顶点程序来计算的。下面我们将看到使用pixel shader也能很容易的完成这个任务。还是从上一章渲染mesh的例子开作为起点。我们将对它添加灯光效果。

     首先,在HLSL代码中作如下更新:

float4x4 WorldMatrix   : WORLD;

float4 DiffuseDirection;

Texture meshTexture;

sampler TextureSampler = sampler_state{texture = <meshTexture>;mipfilter = LINEAR: };

struct   VS_OUTPUT

{

     float4 Pos    : POSITION;

     float2 TexCoord    : TEXCOORD0;

     float3 Light  : TEXCOORD1;

     float3 Normal : TEXCOORD2;

};

     这次,我们额外保存了世界变换矩阵。在后面的讨论中你会知道为什么需要这样做。此外还有一个保存灯光方向的变量,以及用于读取纹理的纹理和采样状态。这里的输出结构有些特别。不仅返回位置和纹理坐标,还返回两个新的纹理坐标。实际上,这些变量根本不会用作纹理坐标,他们只是用来把所需数据从vertex shader传递到pixel shader。

     接下来,在C#代码中为这几个变量作一些更新。在DrawMesh方法中,添加如下代码:

effect.SetValue("WorldMatrix",worldMatrix);

effect.SetValue("DiffuseDirection",new Vector4(0,0,1,1));

     在初始化的方法中,加载了mesh之后,设置纹理:

     好了,简单的更新之后,可以开始编写HLSL代码实现灯光了。选择白色以外的灯光,这样效果看起来会明显一些。先来看看vertex shader:

VS_OUTPUT Transform(

     float4 inputPosition   : POSITION,

     float3 inputNormal : NORMAL,

     float2 inputTexCoord   : TEXCOORD0

     )

{

     VS_OUTPUT Out = (VS_OUTPUT)0;

     Out.Pos = mul(inputPosition,WorldViewProj);

     Out.TexCoord = inputTexCoord;

     Out.Light = DiffuseDirection;

     Out.Normal = normalize(mul(inputNormal,WorldMatrix));

    

     return Out;

}

     首先,变换坐标,保存纹理坐标。接下来,把灯关方向保存为第二组纹理坐标。注意,Light是一个float4的变量,而纹理坐标是float3,所以这里包含了对较大数据类型中xyz重组(swizzle)。因为漫射方向是3维的矢量,所以这里忽略w元素不会有任何问题。同样,把法线保存为第三张纹理坐标。但是在这之前,还需要把发现变换到世界坐标系中。没有这一步,灯光计算则会失败。

     接下来编写piexl shader:

float4 TextureColor(

 float2 textureCoords : TEXCOORD0,

 float3 lightDirection : TEXCOORD1,

 float3 normal : TEXCOORD2) : COLOR0

{

    // Get the texture color

    float4 textureColor = tex2D(TextureSampler, textureCoords);

    // Make our diffuse color purple for now

    float4 diffuseColor = { 0.5f, 0.0f, 1.0f, 1.0f};

   

    // Return the combined color after calculating the effect of

    // the diffuse directional light

    return textureColor * (diffuseColor * saturate(dot(lightDirection, normal)));

};

     Pixel shader把vertex shader输出的所有纹理坐标作为参数,同时返回当前像素的颜色。第一步是简单的对纹理采样。接下来,设置灯光颜色。通过计算灯关方向与法线的亮度来计算光照强度。Saturate方法把返回值调整到0-1之间,这样就不会有太暗或者太亮的地方。最后,把纹理颜色与灯光的漫射颜色相乘,获得最后的颜色。运行程序看看吧。

Keil MDK下载报错:Flash Download failed终极解决指南(附固件恢复步骤) 本文针对Keil MDK开发中常见的“Error: Flash Download failed”报错,提供了从基础连接到深度诊断的系统性解决指南。文章详细解析了错误成因,并重点介绍了当常规SWD调试失效时,如何通过Bootloader模式和ISP模式(特别是UART Bootloader)恢复“变砖”芯片的完整实战步骤,帮助开发者彻底解决固件下载难题。 阅读详情

相关推荐

Hyper-V显卡直通实战:手把手解决Windows 11虚拟机错误码43(附完整参数配置)

本文详细解析了在Windows 11 Hyper-V虚拟机中配置显卡直通时遭遇错误码43的根源,并提供了从环境检查、核心PowerShell命令(如Set-VMGpuPartitionAdapter)配置到虚拟机内驱动替换的完整实战解决方案,帮助用户彻底解决显卡驱动无法加载的问题。

weixin_29238147的博客 898

【翻译】managed DirectX (第三章)

使用简单的渲染技术翻译:clayman    至今为止,我们的渲染工作效率都很低。每次渲染场景时,都要分配新的顶点列表,并且所有东西存储在系统内存里。现代显卡集成了足够显存,把顶点数据存放在显存可以获得大幅的新能提升:存放在系统内存里的数据,渲染每一帧时都要拷贝到显卡,这会带来极大的损失。只有移除每帧时的这种分配才能帮助我们提高性能。  使用顶点缓冲(Using Vertex Buffers)Di

Clayman的专栏 5027

用Python的fengwo模块复刻通达信筹码峰(COST/WINNER),选股效率提升10倍

本文介绍了如何使用Python的fengwo模块高效复刻通达信的筹码峰(COST/WINNER)计算,显著提升选股效率。通过C++内核与多线程优化,fengwo模块将传统Python实现的数小时计算压缩至分钟级,解决了量化交易中的性能瓶颈问题。文章详细解析了筹码峰计算原理、fengwo模块的技术架构及实战应用,助力量化开发者构建高效选股系统。

weixin_29062823的博客 438

Managed DirectX +C# 开发(入门篇)(四)

  Managed DirectX +C# 开发(入门篇)第四章 入门程序一、创建设备本节介绍的示例为DirectX SDK自带的示例,在这里将其解释一下,本示例什么也不做,只是显示一个空白窗体。现在先看程序运行的主函数:static void Main()          {//建立一个窗体实例;            using (CreateDevi

dandanCool的专栏 4574

全面分析总结解决Could not transfer artifact org.apache.maven.plugins等此类问题的方法

全面分析总结解决Could not transfer artifact org.apache.maven.plugins,Could not transfer artifact xxx from/to xxx等此类问题的方法

ccjjjjdff的博客 1万+

动作识别(三)Win10复现OpenPose1.7.0+ST-GCN代码

动作识别(三)Win10复现OpenPose1.7.0+ST-GCN代码1.Win10系统配置OpenPose1.7.0的Python API 本人最近在研究基于骨架的动作识别方法,有幸看到端到端的ST-GCN算法,于是决定自己复现一下。(具体原理这里不介绍,大家自行查阅,比如Openpose是个啥?ST-GCN又是个啥?) 1.Win10系统配置OpenPose1.7.0的Python API 安装步骤: (1) ...

QIANFANGshiwo的博客 3039

Managed DirectX(第十三章)

第十三章 渲染骨骼动画(Rendering Skeletal Animation)       本文版权归原作者所有,仅供个人学习使用,请勿转载,勿用于任何商业用途。由于本人水平有限,难免出错,不清楚的地方请大家以原著为准。欢迎大家和我多多交流。翻译:claymanBlog:http://blog.youkuaiyun.com/soilworkclayman_joe@y

Clayman的专栏 4148

银河麒麟V10离线升级OpenSSH实战:从编译到回滚全流程

OpenSSH作为Linux系统远程登录的核心组件,其版本升级直接关系到系统安全与等保合规。在信创环境下,银河麒麟V10自带的OpenSSH版本往往无法满足漏洞扫描与安全加固要求,而离线编译升级涉及依赖处理、编译参数、服务替换与回滚方案等多个技术环节。本文围绕银河麒麟V10(x86_64)平台,详细讲解OpenSSH离线升级的完整实操流程,包括环境摸底、依赖包安装、源码编译、配置文件兼容性处理、服务重启验证以及常见问题排查,并分享批量升级与安全加固的工程经验,帮助运维人员在不断网、不重装的前提下一次成功完成

weixin_30582943的博客 383

sampler state

昨天遇到一个非常诡异的错误 samplerstate 无法加大括弧定义 编译器非要一个; 而不要{ 去掉吧'''之后的编译似乎又会报某些ss没method 现在想想 也许是 samplerstate要在函数外面定义!不能嵌在函数里面 今天去试一下 还有个问题是'''据说定义了rowmajor就不用交换mul的两个参数了'''今天也去确认下吧 转载于:https://www....

anfu8346的博客 288

千兆网口电路设计中的EMC防护与TVS选型实战

本文深入探讨了千兆网口电路设计中面临的EMC挑战,并提供了TVS二极管选型的实战指南。文章分析了ESD、浪涌和EFT等主要威胁,重点阐述了如何根据工作电压、钳位电压和关键的低结电容等参数为PHY芯片选择匹配的TVS器件,以确保在严苛电磁环境下实现可靠的信号完整性与防护。

m3n5b7v8c9x的博客 530

Raptor码(一):2007RFC5053标准编解码学习

RFC 5053 标准

a_beatiful_knife的博客 3493

很好的几个Managed Directx 例子

2014/09/25 (转载自:http://www.codesampler.com/dx9src/dx9src_2.htm)

narutojzm1的博客 1429

告别Qweb!用ReportBro在Odoo 13-19版本中5步搞定动态报表

本文介绍了如何在Odoo 13-19版本中使用ReportBro替代Qweb快速实现动态报表设计。通过5步集成指南,包括环境准备、前端集成、后端服务搭建等,展示了ReportBro在可视化设计、即时预览和多格式输出(PDF/XLSX)方面的优势,显著提升开发效率和报表灵活性。

mac99的博客 799

【翻译】Managed DirectX(第十二章 下)

第十二章 使用Hight Level Shader Language(下)本文版权归原作者所有,仅供个人学习使用,请勿转载,勿用于任何商业用途。由于本人水平有限,难免出错,不清楚的地方请大家以原著为准。欢迎大家和我多多交流。翻译:claymanBlog:http://blog.youkuaiyun.com/soilworkclayman_joe@yahoo.com.cn  

Clayman的专栏 3522

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Managed DirectX +C# 开发(入门篇)(一)

  前      言以前是用VC 作计算机图形学的,大约在一年前,公司接到一个用C#+DirecX的项目,从那时起便开始学习Mangaged DirectX ,现将在开发过程中的一点总结发表出来,和同行们共同参考,共同学习,共同进步,前面是一些基础内容,算是入门篇吧,现在正将开发过程中所用到的一些算法整理中,算是中级篇吧。1:在整理过程中,有些内容为从网上找的资料,部分为翻译国外文章,正所

dandanCool的专栏 8816

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Managed DirectX(第五章)

定义Mesh    虽然有很多时候,你需要手动创建顶点和索引数据,但更普遍的情况是从外部的资源加载已有的顶点数据,比如从一个文件。通常我们使用.X文件来保存这些信息。在前一章里,代码的大部分都用来创建几何体了。对于简单的三角形和立方体来说这似乎是完全可行的,但设想假如用相同的方式来创建拥有上万个顶点的物体将,所花费的时间和努力都将是很可怕的。     幸运的是,Managed DirectX里有一

sunkangta的专栏 1208

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

【翻译】Managed DirectX(第五章)

Rendering with Meshes翻译:claymanclayman_joe@yahoo.com.cn 定义Mesh    虽然有很多时候,你需要手动创建顶点和索引数据,但更普遍的情况是从外部的资源加载已有的顶点数据,比如从一个文件。通常我们使用.X文件来保存这些信息。在前一章里,代码的大部分都用来创建几何体了。对于简单的三角形和立方体来说这似乎是完全可行的,但设想假如用相同的方式来创建拥

Clayman的专栏 3645

【翻译】Managed DirectX(第九章)

第九章 使用其它Mesh类型翻译:claymanclayman_joe@yahoo.com.cn仅供个人学习之用,勿用于任何商业用途,转载请注明作者^_^简化Mesh(Simplifying Meshes)         我们花了大量的时间来学习扩展库中的基本Mesh类,但实际上,还有3种其它Mesh类型我们没有讨论过,在这一章中,我们就来看看这几个对象。         我们已经知道如何通过使

Clayman的专栏 3572

【翻译】Managed DirectX(第七章)

第七章 Using Advanced Mesh Features翻译:claymanclayman_joe@yahoo.com.cn仅供个人学习之用,勿用于任何商业用途,转载请注明作者^_^这一章,我们将要调论一些关于Mesh对象的高级特性,包括:n                        优化(Optimizing)mesh数据n                        简化(Sim

Clayman的专栏 3884

【翻译】Managed DirectX(第六章)

第六章 使用Managed DirectX编写游戏翻译:claymanclayman_joe@yahoo.com.cn仅供个人学习之用,勿用于任何商业用途,转载请注明作者^_^选择游戏      虽然很多关于3D游戏编程的高级主题还没有讨论,但我们已经有足够的背景知识来写一个简单游戏了。这一章,我们将使用至今学过的知识,再加上一点点新的东西来创建游戏。     真正开始写游戏之前,最好先拟一份计划

Clayman的专栏 4175

【翻译】Managed DirectX(第八章)

第八章 理解资源(Understanding Resoruces)翻译:claymanclayman_joe@yahoo.com.cn仅供个人学习之用,勿用于任何商业用途,转载请注明作者^_^资源是在Direct3D中渲染复杂对象的重要部分。在这一章的学习中,我们将会讨论关于资源的一些高级特性,包括:n          静态和动态的资源n          Updating the buffer

Clayman的专栏 3881

【翻译】Managed DirectX(第十章)

第十章 使用助手类(Using the Helper Classes) 翻译:claymanclayman_joe@yahoo.com.cn仅供个人学习之用,勿用于任何商业用途,转载请注明作者^_^绘制直线         在第四章里我们就讨论过关于绘制直线的问题:使用基本图元里的line list或line strip绘制直线。但是这两种直线都不能改变宽度,也没有抗锯齿功能(除非整个场景都使用了

Clayman的专栏 5363

Rendering terrains with Managed DirectX翻译

《翻译》 原文链接:http://www.codeproject.com/Articles/8195/Rendering-terrains-with-Managed-DirectX (忽然发现自己翻译的自己都不知道说的什么。。。也罢,一个小时的产物,不要要求太高) (丫的,翻译完也不不知道怎么实现的,还是老老实实去看代码吧,话说我还没用过c#,容我编程c++的,龙书第13章不就讲的地...

weixin_30301183的博客 121

【翻译】Managed DirectX(第十一章)

第十一章 可编程渲染管道以及高级着色语言入门翻译:claymanclayman_joe@yahoo.com.cn仅供个人学习之用,勿用于任何商业用途,转载请注明作者^_^至今为止,我们都在使用固定功能的管道(fixed-function pipeline)进行渲染。回到那段古老的日子(DirectX 8.0之前),这是唯一渲染物体的方法。固定功能的渲染管道本质上就是一系列用来控制如何渲染特定类型数

Clayman的专栏 4205

翻译 managed DirectX9(第一章)

第一章 Introducing Direct 3D翻译:clayman创建设备  Device类是DirectX里的所有绘图操作所必须的。可以把这个类假想为真实的图形卡。场景里所有其他图形对象都依赖于device。你的计算机里可以有一个到几个device,在Mnaged DirctX3D里,你可以控制任意多个device。         Device共有三个构造函数,我们现在只讨论其中的一个,但

Clayman的专栏 9801

Managed Directx 9 kick start,第五章 纹理

Rendering with Meshes 我们又向前迈进了一大步,这可比总看着立方体旋转要有趣多了。下一章我们将使用Managed DirectX来写一个真正的游戏了,最然它可能看起来很简单,但毕竟是我们的第一个三维游戏^_^,第六章内容比较,大概3、4次才能翻译完^_^。  定义Mesh    虽然有很多时候,你需要手动创建顶

bbwolfcool的专栏 1181
上一篇: 使用Managed DirectX编写游戏----理解sample framework 之枚举设备
下一篇: 使用Managed DirectX编写游戏----理解sample framework 之事件处理
soilwork
博客等级 码龄23年 290粉丝 116原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值