AstaTus
-- 夏天不热。。
posts - 22,comments - 12,trackbacks - 0

    这个两个函数的参数一大堆,害我头都大了2,3倍。。今天整理下已经能够大概清晰明白的参数。。
缓存存的是一个屏幕像素的值。。
   先来SetTextureStageState:

   HRESULT SetTextureStageState(
   DWORD Stage,
   D3DTEXTURESTAGESTATETYPE Type,
   DWORD Value
   );

   stage这个参数是指第几层纹理,1.2.3...9,, 这个版本的dx最多支持9层纹理。
   Type:Defines the type of operation that a texture stage will perform.//定义对该纹理的哪个属进行设置,值很多。。。
   Value: 指的是前面所选属性的值

type:
    D3DTSS_ALPHAOP = 4,     //alpha通道的运算,
    D3DTSS_COLOROP = 1,     //颜色的运算
                                                    //这里的op 是operations,指对前面设置的颜色进行运算
                                                   //既后面的2个type:D3DTSS_COLORARG1,D3DTSS_COLORARG2
                                                   //或D3DTSS_ALPHAARG1,D3DTSS_ALPHAARG2 = 6
value:
    D3DTOP_DISABLE = 1,                           //该纹理无效,既不显示
    D3DTOP_SELECTARG1 = 2,                  //选择第1个颜色值(既D3DTSS_COLORARG1的值)作为纹理颜色输出
    D3DTOP_SELECTARG2 = 3,                  //选择第2个颜色值(既D3DTSS_COLORARG2的值)作为纹理颜色输出
    D3DTOP_MODULATE = 4,                    //将颜色1和颜色2相乘作为纹理颜色输出
    D3DTOP_MODULATE2X = 5,               //将颜色1和颜色2相乘后左移1bit(用于增亮)作为纹理颜色输出 ,
    D3DTOP_MODULATE4X = 6,               //将颜色1和颜色2相乘后左移2bit(用于增亮)作为纹理颜色输出
    D3DTOP_ADD = 7,                                 //将颜色1和颜色2相加作为纹理颜色输出
    D3DTOP_ADDSIGNED = 8,                  ///////////后面的参见SDK 都是对2个颜色进行运算
    D3DTOP_ADDSIGNED2X = 9,
    D3DTOP_SUBTRACT = 10,
    D3DTOP_ADDSMOOTH = 11,
    D3DTOP_BLENDDIFFUSEALPHA = 12,
    D3DTOP_BLENDTEXTUREALPHA = 13,
    D3DTOP_BLENDFACTORALPHA = 14,
    D3DTOP_BLENDTEXTUREALPHAPM = 15,
    D3DTOP_BLENDCURRENTALPHA = 16,
    D3DTOP_PREMODULATE = 17,
    D3DTOP_MODULATEALPHA_ADDCOLOR = 18,
    D3DTOP_MODULATECOLOR_ADDALPHA = 19,
    D3DTOP_MODULATEINVALPHA_ADDCOLOR = 20,
    D3DTOP_MODULATEINVCOLOR_ADDALPHA = 21,
    D3DTOP_BUMPENVMAP = 22,
    D3DTOP_BUMPENVMAPLUMINANCE = 23,
    D3DTOP_DOTPRODUCT3 = 24,
    D3DTOP_MULTIPLYADD = 25,
    D3DTOP_LERP = 26,
    D3DTOP_FORCE_DWORD = 0x7fffffff,

     
type:
    D3DTSS_COLORARG1 = 2,  
    D3DTSS_COLORARG2 = 3,
    D3DTSS_ALPHAARG1 = 5,
    D3DTSS_ALPHAARG2 = 6,
    D3DTSS_COLORARG0 = 26,
    D3DTSS_ALPHAARG0 = 27,
    D3DTSS_RESULTARG = 28,
value:
     这里的TA指的是texture arguments ,
      D3DTA_CONSTANT             //给当前纹理一个固定的值;
      D3DTA_DIFFUSE;               //diffuse的值作为参数 diffuse 可能有多个来源。。比如材质,vertex
      D3DTA_SELECTMASK         //Mask value for all arguments; not used when setting texture arguments 这句话不理解啊,为什么要伪装呢  
      D3DTA_SPECULAR             //取spercular 的值作为参数  来源同diffuse
      D3DTA_TEMP                     //待定。。
      D3DTA_TEXTURE              //用纹理的颜色值作为参数
      D3DTA_TFACTOR              //待定。。

 

////////////////////////////////////////////////////////////////////////////////////
以下还没来得及研究。。貌似叫难懂,还请高人指点啊


D3DTSS_BUMPENVMAT00 = 7,
D3DTSS_BUMPENVMAT01 = 8,
D3DTSS_BUMPENVMAT10 = 9,
D3DTSS_BUMPENVMAT11 = 10,
D3DTSS_TEXCOORDINDEX = 11,
D3DTSS_BUMPENVLSCALE = 22,
D3DTSS_BUMPENVLOFFSET = 23,
D3DTSS_TEXTURETRANSFORMFLAGS = 24,
D3DTSS_CONSTANT = 32,
D3DTSS_FORCE_DWORD = 0x7fffffff,

 


HRESULT SetRenderState(
D3DRENDERSTATETYPE State,     //所要设置的状态
DWORD Value                   //该状态的值
);
 
State 的取值
 
 
 
 
 
 
 

 

posted @ 2008-10-08 23:12 AstaTus 阅读(3137) | 评论 (3)编辑 收藏
      在地形中获得高度,必须要知道该点所在三角形三个角的坐标和这三个点的高度,然后根据线性插值估算出该点的高度,判断该点在哪个正方形中,比较容易,只要根据定点之间的间距,和地形的开始坐标就可求出该正方形的左下角顶点,但要再进一步算是哪个三角形,就有一个技巧了,
比如:

当正方形的边长一样时,顶点V在哪个三角形中只要判断坐标点 X + Y是否大于 边长就可以了。一般地形应该都是直角边相等的三角型吧。
然后再根据所确定下来的三角形的三个点进行线性插值就可以了。。
posted @ 2008-10-08 15:45 AstaTus 阅读(325) | 评论 (0)编辑 收藏
   强烈的欲望,我要变强!!吼~~~~~~~~~~~~~~~~~~~~~~~~~
posted @ 2008-10-06 22:08 AstaTus 阅读(219) | 评论 (1)编辑 收藏
     摘要: 最近看的那本directx 的书的源码都是用函数,没用c++的类,用起来超不爽,所以自己来,封装了下,现在才看到《顶点的颜色》的那章,所以类还很不完整,以后慢慢改进。。 //Base.h/**//////////////////////////////////////////////#ifndef BASE_H#define BASE_H#include <d...  阅读全文
posted @ 2008-09-20 22:10 AstaTus 阅读(1242) | 评论 (0)编辑 收藏
      开始看directx了,发现学ogre,还是现弄懂directx会比较好点。

      这个程序主要体现了directx的一个基本的框架。
  1. 在初始化D3D设备后,开始设置顶点缓存,将要显示的点输入,
  2.用函数D3DXMatrixPerspectiveFovLH 求投影矩阵,该函数根据视域体的属性求出投影矩阵
  3.设置顶点渲染的方法,
device->CreateVertexBuffer(3 * sizeof(Vertex), D3DUSAGE_WRITEONLY, D3DFVF_XYZ, D3DPOOL_MANAGED, &Triangle, 0);

    Vertex
* vertices;
    Triangle
->Lock(00,(void**)&vertices, 0);

    vertices[
0= Vertex(-1.0f0.0f2.0f);
    vertices[
1= Vertex(0.0f1.0f2.0f);
    vertices[
2= Vertex(1.0f0.0f2.0f);

    Triangle
->Unlock();

    D3DXMATRIX proj;
    D3DXMatrixPerspectiveFovLH(
&proj, D3DX_PI * 0.5f, (float)800 / (float)6001.0f1000.0f);
    
    device
->SetTransform(D3DTS_PROJECTION, &proj);

    device
->SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME);


  4.在消息循环函数中
while(msg.message != WM_QUIT)
    
{
        
if(::PeekMessage(&msg, 000, PM_REMOVE)) //////////////这里有个疑惑,什么时候if语句不成立呢
        {
            ::TranslateMessage(
&msg);
            ::DispatchMessage(
&msg);
             }

          
else
        
{    
               
float currTime  = (float)timeGetTime();
               
float timeDelta = (currTime - lastTime)*0.001f;

                ptr_display(timeDelta);

               lastTime 
= currTime;
           }

    }
这里是场景的渲染
device->Clear(00, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0xffffffff1.0f0);

        device
->BeginScene();

        device
->SetStreamSource(0, Triangle, 0sizeof(Vertex));   //将Vertexbuffer中的顶点倒入到流当中
        device
->SetFVF(Vertex::FVF); //设置顶点的格式  FVF已被我赋值为 FVF_XYZ
 
        device
->DrawPrimitive(D3DPT_TRIANGLELIST, 01); //图元类型 三角形 个数为一个

        device
->EndScene();

        
// Swap the back and front buffers.
        device->Present(0000);
posted @ 2008-09-18 20:30 AstaTus 阅读(226) | 评论 (0)编辑 收藏
   今天写的一个程序,很奇怪,我要让每个ball的M_CurLoc的值都不一样,但是单步调试的时候是做到了不一样,但直接运行的时候结果每个ball的M_CurLoc的值居然都一样,喊我调了2个多小时。。抓狂ing。。
后来发现是随机数里的srand在作怪
void Balloon::Loc_Reset()
{
        srand(time(NULL));
    M_CurLoc.x 
= rand()%700 + 100;
    M_CurLoc.y 
= rand()%700 + 600;
    flag 
= UP;

}


for(i = 0; i < n; i++)
{
    tempball.Loc_Reset();

    M_ActBall.push_back(tempball);    

}
这个代码实现的n个ball 中的 M_CurLoc都是一样的,因为CPU运行太快 以致每一次寻环中srand(time(NULL))所取得的系统时间都一样。。(srand的精度为秒),所以在调试和直接运行这两种情况下会出现两种结果。。
最后改了下
void Balloon::Loc_Reset()
{
    M_CurLoc.x 
= rand()%700 + 100;
    M_CurLoc.y 
= rand()%700 + 600;
    flag 
= UP;

}


void Balloon::GetSrand()
{
    srand(time(NULL));

}


////////////////////////////////////

tempball.GetSrand();

for(i = 0; i < n; i++)
{
    tempball.Loc_Reset();

    M_ActBall.push_back(tempball);    

}
posted @ 2008-09-10 19:13 AstaTus 阅读(213) | 评论 (0)编辑 收藏
   这个是摄像机绕食人魔头的一个demo,
其中的关键就在于摄像机的自动绕行 和 摄像机一直朝向食人魔头,

ogre这引擎似乎什么都帮你想到了,很多的函数都已封装好,就怕你找不到

以下的是这个demo关键代码,都是在createscene里的,我给了下具体的解释:
// Make sure the camera track this node
        mCamera->setAutoTracking(true, headNode);    //这里让摄像机总是朝着魔头

        // Create the camera node & attach camera
        SceneNode* camNode = mSceneMgr->getRootSceneNode()->createChildSceneNode();
        camNode
->attachObject(mCamera);

        
// set up spline animation of node
        Animation* anim = mSceneMgr->createAnimation("CameraTrack"10);    //这里的10指代这个摄像机绕一圈要花10秒钟,至于这10秒钟怎么分,在下面关键帧设置中会分配

        
// Spline it for nice curves
        anim->setInterpolationMode(Animation::IM_LINEAR); //设置两点间移动时的插值类型,有线型和弧线型两种,什么效果大家自个试吧
        
// Create a track to animate the camera's node
//以下就要设置相机绕行的轨迹了
        NodeAnimationTrack* track = anim->createNodeTrack(0, camNode);
        
// Setup keyframes
//关键帧就10帧,这与动画的总时间10刚好对应
        TransformKeyFrame* key = track->createNodeKeyFrame(0); // startposition
        key = track->createNodeKeyFrame(2.5);
        key
->setTranslate(Vector3(500,500,-1000));
        key 
= track->createNodeKeyFrame(5);
        key
->setTranslate(Vector3(-1500,1000,-600));
        key 
= track->createNodeKeyFrame(7.5);
        key
->setTranslate(Vector3(0,-100,0));
        key 
= track->createNodeKeyFrame(10);
        key
->setTranslate(Vector3(0,0,0));
        
// Create a new animation state to track this
        mAnimState = mSceneMgr->createAnimationState("CameraTrack");
        mAnimState
->setEnabled(true);
关键帧设置的那8行代码其实就是说从0~2.5秒 摄像机从起始点移动到(500, 500, -1000),后面几行同理


该demo中的createplane函数还是有点不明白
 MeshPtr createPlane(
            const String& name, const String& groupName, const Plane& plane,
            Real width, Real height,
            int xsegments = 1, int ysegments = 1,
            bool normals = true, int numTexCoordSets = 1,
            Real uTile = 1.0f, Real vTile = 1.0f,   //这个tile啥意思啦??????????????????
 const Vector3& upVector = Vector3::UNIT_Y,
   HardwareBuffer::Usage vertexBufferUsage = HardwareBuffer::HBU_STATIC_WRITE_ONLY,
   HardwareBuffer::Usage indexBufferUsage = HardwareBuffer::HBU_STATIC_WRITE_ONLY,
   bool vertexShadowBuffer = true, bool indexShadowBuffer = true);
posted @ 2008-09-07 20:45 AstaTus 阅读(1064) | 评论 (0)编辑 收藏
      发现3D这东西还是蛮好玩的,尤其是有了3D的ogre引擎以后。今天一口气看到了基础教程4.。。 
      到现在为止,就接触了一个Application 类 和 frameListener类

Application类继承了 ExampleApplication,主要是一些场景的资源载入 和 资源的设置 还有最重要的渲染函数
frameListener类继承了ExampleFrameListener,  OIS::MouseListener, OIS::KeyListener。 后两个是外部类,不属于ogre内部
这两个类主要用于键盘和鼠标的监听,虽然还没了解它内部的运行机制,不过感觉有点像 单片机里的中断,过几天基础
玩熟了,去研究下。^_^

除以上两个类外
目前遇到比较重要的几个类有:SceneManger,  Root, Camera, ViewPort (现在还没弄清楚Camera, ViewPort 之间的关系),Entity
Light, SceneNode。。。


场景节点在控制实体旋转的时候,它是以自己的局部坐标系为标准的
Entity *ent = mSceneMgr->createEntity( "Robot""robot.mesh" );
       SceneNode 
*node = mSceneMgr->getRootSceneNode()->createChildSceneNode( "RobotNode", Vector3( -10000 )  );
       node
->attachObject( ent );

       node
->yaw( Degree( -90 ) );


这含代码的最后一行就是以ent实体中心为坐标原点的坐标系旋转的。。

如果要绕某一个轴旋转捏?嘎嘎



posted @ 2008-08-15 21:16 AstaTus 阅读(333) | 评论 (0)编辑 收藏
  以前小梅老师教C++的时候,没有涉及到过DLL,已至现在看DLL超累。。。虽然看上去那本《VC++动态链接库深入浅出》只有很少的几页,但代码稍有不对,就出错,尤其是在链接上,。。。汗个。。

刚才花了大把时间写的个例子

//useyumen.cpp

#include 
<stdio.h>
#pragma comment(lib, 
"..\\yumen\\Debug\\yumen.lib")

extern"C" __declspec(dllimport) Add(int x, int y);

int main()
{
 printf(
"%d", Add(35));
 
return 0;
}


/**///////////////////以下是console 的 DLL工程

//yumen.h
#ifndef YUMEN_H
#define YUMEN_H
extern "C" int __declspec(dllexport) Add(int x, int y);

#endif

//yumen.cpp
#include "yumen.h"

int Add(int x, int y)
{
    
return x + y;
}



发现如果是类的DLL,调用起来比较方便。。。 

 
posted @ 2008-08-04 22:41 AstaTus 阅读(201) | 评论 (0)编辑 收藏

      在一个类中定义了一个引用类型的变量,他的初始化不能放在构造函数中,也不能放在其他的函数中,只能放在一个神秘的角落--构造函数的初始化列表中。。嘎嘎
   
  

#include <iostream.h>


int i = 9;

class A
{
    
protected:
    
int &m;
    
    
public:
    A():m(i)   
//将i赋给引用变量m
    {
        cout
<<m<<endl;
    }

}
;

void main()
{
    A a;

}


 

posted @ 2008-08-01 10:52 AstaTus 阅读(761) | 评论 (1)编辑 收藏
仅列出标题
共3页: 1 2 3