这个两个函数的参数一大堆,害我头都大了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 阅读(3230) |
评论 (3) |
编辑 收藏
在地形中获得高度,必须要知道该点所在三角形三个角的坐标和这三个点的高度,然后根据线性插值估算出该点的高度,判断该点在哪个正方形中,比较容易,只要根据定点之间的间距,和地形的开始坐标就可求出该正方形的左下角顶点,但要再进一步算是哪个三角形,就有一个技巧了,
比如:

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

vertices[0] = Vertex(-1.0f, 0.0f, 2.0f);
vertices[1] = Vertex(0.0f, 1.0f, 2.0f);
vertices[2] = Vertex(1.0f, 0.0f, 2.0f);

Triangle->Unlock();

D3DXMATRIX proj;
D3DXMatrixPerspectiveFovLH(&proj, D3DX_PI * 0.5f, (float)800 / (float)600, 1.0f, 1000.0f);
device->SetTransform(D3DTS_PROJECTION, &proj);

device->SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME);
4.在消息循环函数中
while(msg.message != WM_QUIT)

{

if(::PeekMessage(&msg, 0, 0, 0, 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(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0xffffffff, 1.0f, 0);

device->BeginScene();

device->SetStreamSource(0, Triangle, 0, sizeof(Vertex)); //将Vertexbuffer中的顶点倒入到流当中
device->SetFVF(Vertex::FVF); //设置顶点的格式 FVF已被我赋值为 FVF_XYZ

device->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1); //图元类型 三角形 个数为一个

device->EndScene();

// Swap the back and front buffers.
device->Present(0, 0, 0, 0);
posted @
2008-09-18 20:30 AstaTus 阅读(270) |
评论 (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 阅读(243) |
评论 (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 阅读(1094) |
评论 (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( -100, 0, 0 ) );
node->attachObject( ent );

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

这含代码的最后一行就是以ent实体中心为坐标原点的坐标系旋转的。。
如果要绕某一个轴旋转捏?嘎嘎
posted @
2008-08-15 21:16 AstaTus 阅读(355) |
评论 (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(3, 5));
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 阅读(225) |
评论 (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 阅读(773) |
评论 (1) |
编辑 收藏