fx文件:

 float4x4 matWorld;
float Time=1.0f; struct VS_OUTPUT
{
float4 Pos :POSITION;
float4 Color :COLOR;
}; VS_OUTPUT VS(float4 Pos:POSITION,float4 Color:COLOR)
{
VS_OUTPUT Out=(VS_OUTPUT);
float4 pos1=Pos;
pos1.y+= cos( Time*2.0f)+;
Out.Pos=mul(pos1,matWorld);
Out.Color=Color;
return Out;
} float4 PS(VS_OUTPUT vsout): COLOR
{
return vsout.Color;
} technique RenderScene
{
pass P0
{
CullMode=None;
vertexShader=compile vs_1_1 VS();
pixelShader=compile ps_2_0 PS();
}
}

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

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using WorldWind.Renderable;
using Utility;
using Microsoft.DirectX.Direct3D;
using System.IO;
using Microsoft.DirectX;
using System.Drawing;
using System.Windows.Forms; namespace AppScene
{
public class Tri : RenderableObject
{
static Effect m_effect = null;
VertexBuffer vertexBuffer = null;
public Tri(string name)
: base(name)
{
}
public override void Initialize(DrawArgs drawArgs)
{
if (m_effect == null)
{
string outerrors = "";
System.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();
Stream effectStream = assembly.GetManifestResourceStream("AppScene.Tri.fx");
string pathfx = "Tris.fx";
// string pathfx = " Default_DirectX_Effect.fx";
//string pathfx = "CreateParamModel.fx"; //string pathfx = "flag.fx";
//m_effect = Effect.FromStream(
// drawArgs.device,
// effectStream,
// null,
// null,
// ShaderFlags.None,
// null,
// out outerrors);
m_effect = Effect.FromFile(
drawArgs.device,
pathfx,
null,
null,
ShaderFlags.None,
null,
out outerrors);
if (outerrors != null && outerrors.Length > )
Log.Write(Log.Levels.Error, outerrors);
}
vertexBuffer = new VertexBuffer(typeof(CustomVertex.PositionColored), , drawArgs.device, , CustomVertex.PositionColored.Format, Pool.Default);
vertexBuffer.Created += new EventHandler(vertexBuffer_Created);
vertexBuffer_Created(vertexBuffer, null);
Matrix WorldMatrix = Matrix.Identity;
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));
Matrix projMatrix = Matrix.PerspectiveFovLH((float)Math.PI / , 1.0f, 1.0f, 100.0f);
WorldMatrix = drawArgs.device.GetTransform(TransformType.World);
viewMatrix = drawArgs.device.GetTransform(TransformType.View);
projMatrix = drawArgs.device.GetTransform(TransformType.Projection); m_effect.SetValue("matWorld", WorldMatrix * viewMatrix * projMatrix);
// m_effect.SetValue("matViewProjection", viewMatrix * projMatrix);
isInitialized = true;
} public override void Update(DrawArgs drawArgs)
{
try
{
if (!isInitialized)
Initialize(drawArgs); }
catch (Exception ex)
{
Log.Write(ex);
}
}
public override void Render(DrawArgs drawArgs)
{
if (!isInitialized)
return; drawArgs.device.SetStreamSource(, vertexBuffer, );
drawArgs.device.VertexFormat = CustomVertex.PositionColored.Format;
int iTime = Environment.TickCount % ;
float Angle = iTime * (2.0f * (float)Math.PI) / 1000.0f;
m_effect.SetValue("Time", Angle);
m_effect.Technique = "RenderScene";
// m_effect.Technique = "Default_DirectX_Effect";
int numPasses = m_effect.Begin(); for (int i = ; i < numPasses; i++)
{
m_effect.BeginPass(i);
drawArgs.device.DrawPrimitives( PrimitiveType.TriangleList, , );
m_effect.EndPass();
}
m_effect.End(); } void vertexBuffer_Created(object sender, EventArgs e)
{
CustomVertex.PositionColored[] verts = (CustomVertex.PositionColored[])vertexBuffer.Lock(, );
verts[].Position = new Vector3(12.0f,11.0f,10.0f);
verts[].Color = Color.Red.ToArgb();
verts[].Position = new Vector3(30.0f, 32.0f, 10.0f);
verts[].Color = Color.Red.ToArgb();
verts[].Position = new Vector3(10.0f, 60.0f, 10.0f);
verts[].Color = Color.Yellow.ToArgb();
vertexBuffer.Unlock();
} public override void Dispose()
{
if (vertexBuffer!=null)
{
vertexBuffer.Dispose();
}
} public override bool PerformSelectionAction(DrawArgs drawArgs)
{
return false;
}
}
}

这里出现一个问题:

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

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

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

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

机器有没有问题?

这个问题真是困扰人!

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

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

第一个Shader程序的更多相关文章

  1. 【浅墨Unity3D Shader编程】之一 夏威夷篇:游戏场景的创建 & 第一个Shader的书写

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/40723789 作者:毛星云(浅墨)  ...

  2. 【OpenGL】详解第一个OpenGL程序

    写在前面 OpenGL能做的事情太多了!很多程序也看起来很复杂.很多人感觉OpenGL晦涩难懂,原因大多是被OpenGL里面各种语句搞得头大,一会gen一下,一会bind一下,一会又active一下. ...

  3. 【浅墨Unity3D Shader编程】之中的一个 夏威夷篇:游戏场景的创建 &amp; 第一个Shader的书写

    本系列文章由@浅墨_毛星云 出品.转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/40723789 作者:毛星云(浅墨)  ...

  4. DirectX游戏编程(一):创建一个Direct3D程序

    一.环境 Visual Studio 2012,DirectX SDK (June 2010) 二.准备 1.环境变量(如没有配置请添加) 变量名:DXSDK_DIR 变量值:D:\Software\ ...

  5. 第一个python程序

    一个python程序的两种执行方式: 1.第一种方式是通过python解释器: cmd->python->进入python解释器->编写python代码->回车. 2.第二种方 ...

  6. 编写第一个MapReduce程序—— 统计气温

    摘要:hadoop安装完成后,像学习其他语言一样,要开始写一个“hello world!” ,看了一些学习资料,模仿写了个程序.对于一个C#程序员来说,写个java程序,并调用hadoop的包,并跑在 ...

  7. 1.3 第一个C#程序

    几乎没一门编程语言的第一个程序都叫“你好,世界”,所以先在visual studio 中创建一个Helloworld程序. 各部分的详细内容: Main方法是程序运行的起点,最重要的代码就写在Main ...

  8. 一个.net程序员的安卓之旅-Eclipse设置代码智能提示功能

    一个.net程序员的安卓之旅-代码智能提示功能 过完年回来就决心开始学安卓开发,就网上买了个内存条加在笔记本上(因为笔记本原来2G内存太卡了,装了vs2010.SQL Server 2008.orac ...

  9. MFC-01-Chapter01:Hello,MFC---1.3 第一个MFC程序(02)

    1.3.1 应用程序对象 MFC应用程序的核心就是基于CWinApp类的应用程序对象,CWinApp提供了消息循环来检索消息并将消息调度给应用程序的窗口.当包含头文件<afxwin.h>, ...

随机推荐

  1. hadoop基础学习---数据管理策略

    上图中的ABCDE都代表默认大小64M的数据块 nameNode与dataNode之间有一个心跳机制,datanode每隔多秒钟定期的发送心跳到nameNode

  2. Unity战斗系统之AI自主决策

    http://www.taikr.com/course/448/tasks http://www.xuanyusong.com/archives/1840 http://www.cnblogs.com ...

  3. Visual Studio各版本一览!

    上图红线标识处为常用版本,最经典的是VC++ 6.0,专为早期C++开发设计.红框标识处是其内部版本,如VS2008,其内部版本为vc9.0,注意查找区分! 目前,最新版本的VS2017已经发布,很大 ...

  4. 工作流JBPM_day02:1-回顾_2-设计流程Transition

    工作流JBPM_day02:1-回顾 1,工作流框架 处理流程的 流程多,有变化 2,准备环境 + HelloWorld 一.概念 Deployment部署对象 ProcessDefinition 流 ...

  5. day13<常见对象+>

    常见对象(StringBuffer类的概述) 常见对象(StringBuffer类的构造方法) 常见对象(StringBuffer的添加功能) 常见对象(StringBuffer的删除功能) 常见对象 ...

  6. 九度 1534:数组中第K小的数字(二分法变形)

    题目描述: 给定两个整型数组A和B.我们将A和B中的元素两两相加可以得到数组C.譬如A为[1,2],B为[3,4].那么由A和B中的元素两两相加得到的数组C为[4,5,5,6].现在给你数组A和B,求 ...

  7. Android:控件布局(相对布局)RelativeLayout(转)

    相对布局常用属性: 子类控件相对子类控件:值是另外一个控件的id android:layout_above----------位于给定DI控件之上android:layout_below ------ ...

  8. Hbase的基本认识

    1.使用场景:实时查询交互 说说概念性的东西,方便今后更加深入的理解. HBase是Apache Hadoop中的一个子项目,Hbase依托于Hadoop的HDFS作为最基本存储基础单元,通过使用ha ...

  9. django model 数据类型

    转自:http://www.cnblogs.com/lhj588/archive/2012/05/24/2516040.html Django 通过 models 实现数据库的创建.修改.删除等操作, ...

  10. 第三篇:关于TIME_WAIT状态

    前言 为何TCP ”四次分手“ 的过程中会有一个TIME_WAIT状态?这个状态有什么意义呢?这是网络中的一个经典问题,本文将给出精简的回答. 什么是TIME_WAIT状态 这是TCP通信协议中出现的 ...