第一个Shader程序

fx文件:

复制代码
 1 float4x4 matWorld;
 2 float Time=1.0f;
 3 
 4 struct VS_OUTPUT
 5 {
 6     float4 Pos :POSITION;
 7     float4 Color :COLOR;
 8 };
 9 
10 VS_OUTPUT VS(float4 Pos:POSITION,float4 Color:COLOR)
11 {
12     VS_OUTPUT Out=(VS_OUTPUT)0;
13     float4 pos1=Pos;
14     pos1.y+= cos( Time*2.0f)+5;
15     Out.Pos=mul(pos1,matWorld);
16     Out.Color=Color;
17     return Out;
18 }
19 
20 float4 PS(VS_OUTPUT vsout): COLOR
21 {
22     return vsout.Color;
23 }
24 
25 technique RenderScene
26 {
27     pass P0
28     {
29         CullMode=None;
30         vertexShader=compile vs_1_1 VS();
31         pixelShader=compile ps_2_0 PS();
32     }
33 }
View Code
复制代码

C#编写的托管代码,基于WW的渲染框架用托管D3D9 调用:

复制代码
  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 using System.Text;
  5 using WorldWind.Renderable;
  6 using Utility;
  7 using Microsoft.DirectX.Direct3D;
  8 using System.IO;
  9 using Microsoft.DirectX;
 10 using System.Drawing;
 11 using System.Windows.Forms;
 12 
 13 namespace AppScene
 14 {
 15     public class Tri : RenderableObject
 16     {
 17         static Effect m_effect = null;
 18         VertexBuffer vertexBuffer = null;
 19         public Tri(string name)
 20             : base(name)
 21         {
 22         }
 23         public override void Initialize(DrawArgs drawArgs)
 24         {
 25             if (m_effect == null)
 26             {
 27                 string outerrors = "";
 28                 System.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();
 29                 Stream effectStream = assembly.GetManifestResourceStream("AppScene.Tri.fx");
 30                 string pathfx = "Tris.fx";
 31                // string pathfx = " Default_DirectX_Effect.fx";
 32                 //string pathfx = "CreateParamModel.fx";
 33 
 34                 //string pathfx = "flag.fx";
 35                 //m_effect = Effect.FromStream(
 36                 //    drawArgs.device,
 37                 //    effectStream,
 38                 //    null,
 39                 //    null,
 40                 //    ShaderFlags.None,
 41                 //    null,
 42                 //    out outerrors);
 43                 m_effect = Effect.FromFile(
 44                     drawArgs.device,
 45                     pathfx,
 46                     null,
 47                     null,
 48                     ShaderFlags.None,
 49                     null,
 50                     out outerrors);
 51                 if (outerrors != null && outerrors.Length > 0)
 52                     Log.Write(Log.Levels.Error, outerrors);
 53             }
 54             vertexBuffer = new VertexBuffer(typeof(CustomVertex.PositionColored), 3, drawArgs.device, 0, CustomVertex.PositionColored.Format, Pool.Default);
 55             vertexBuffer.Created += new EventHandler(vertexBuffer_Created);
 56             vertexBuffer_Created(vertexBuffer, null);
 57             Matrix WorldMatrix = Matrix.Identity;
 58             Matrix viewMatrix = Matrix.LookAtLH(new Vector3(0.0f, 3.0f, -9.0f), new Vector3(0.0f, 0.0f, 0.0f), new Vector3(0.0f, 1.0f, 0.0f));
 59             Matrix projMatrix = Matrix.PerspectiveFovLH((float)Math.PI / 4, 1.0f, 1.0f, 100.0f);
 60             WorldMatrix = drawArgs.device.GetTransform(TransformType.World);
 61             viewMatrix = drawArgs.device.GetTransform(TransformType.View);
 62             projMatrix = drawArgs.device.GetTransform(TransformType.Projection);
 63             
 64             m_effect.SetValue("matWorld", WorldMatrix * viewMatrix * projMatrix);
 65            // m_effect.SetValue("matViewProjection", viewMatrix * projMatrix); 
 66             isInitialized = true;
 67         }
 68 
 69         public override void Update(DrawArgs drawArgs)
 70         {
 71             try
 72             {
 73                 if (!isInitialized)
 74                     Initialize(drawArgs);
 75                 
 76             }
 77             catch (Exception ex)
 78             {
 79                 Log.Write(ex);
 80             }
 81         }
 82         public override void Render(DrawArgs drawArgs)
 83         {
 84             if (!isInitialized)
 85                 return;
 86 
 87             drawArgs.device.SetStreamSource(0, vertexBuffer, 0);
 88             drawArgs.device.VertexFormat = CustomVertex.PositionColored.Format;
 89             int iTime = Environment.TickCount % 1000;
 90             float Angle = iTime * (2.0f * (float)Math.PI) / 1000.0f;
 91             m_effect.SetValue("Time", Angle);
 92             m_effect.Technique = "RenderScene";
 93            // m_effect.Technique = "Default_DirectX_Effect";
 94             int numPasses = m_effect.Begin(0);
 95         
 96             for (int i = 0; i < numPasses; i++)
 97             {
 98                 m_effect.BeginPass(i);
 99                 drawArgs.device.DrawPrimitives(  PrimitiveType.TriangleList, 0,1 );
100                 m_effect.EndPass();
101             }
102             m_effect.End();
103 
104         }
105 
106         void vertexBuffer_Created(object sender, EventArgs e)
107         {
108             CustomVertex.PositionColored[] verts = (CustomVertex.PositionColored[])vertexBuffer.Lock(0, 0);
109             verts[0].Position = new Vector3(12.0f,11.0f,10.0f);
110             verts[0].Color = Color.Red.ToArgb();
111             verts[1].Position = new Vector3(30.0f, 32.0f, 10.0f);
112             verts[1].Color = Color.Red.ToArgb();
113             verts[2].Position = new Vector3(10.0f, 60.0f, 10.0f);
114             verts[2].Color = Color.Yellow.ToArgb();
115             vertexBuffer.Unlock();
116         }
117 
118         public override void Dispose()
119         {
120             if (vertexBuffer!=null)
121             {
122                 vertexBuffer.Dispose();
123             }
124         }
125 
126         public override bool PerformSelectionAction(DrawArgs drawArgs)
127         {
128             return false;
129         }
130     }
131 }
View Code
复制代码

这里出现一个问题:

鼠标在窗体上移动才能够显示上下移动的三角形。

有时候启动了程序,三角形干脆不显示。开始还没有这个问题,后来出现这个问题!

原来我以为是视域体的问题,但是这个三角形肯定在视域体内部啊。

是帧率控制的问题?需要控制帧率吗,控制帧率是为了减少屏幕刷新次数。不至于刷新太频繁画面干脆不显示吧!

机器有没有问题?

这个问题真是困扰人!

WW的渲染框架本身会有问题吗,通过继承构建的渲染列表对状态机产生影响了?书上的示例程序是没有问题的,为啥我写到一个RenderObject中会出现问题?

后记:移植了NativeMethod类后就好了,应该是消息分发的问题。

posted @   太一吾鱼水  阅读(330)  评论(0编辑  收藏  举报
编辑推荐:
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
· .NET 9 new features-C#13新的锁类型和语义
阅读排行:
· Spring AI + Ollama 实现 deepseek-r1 的API服务和调用
· 《HelloGitHub》第 106 期
· 数据库服务器 SQL Server 版本升级公告
· 深入理解Mybatis分库分表执行原理
· 使用 Dify + LLM 构建精确任务处理应用
点击右上角即可分享
微信分享提示