這個兩個函數的參數一大堆,害我頭都大了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 閱讀(3234) |
評論 (3) |
編輯 收藏
在地形中獲得高度,必須要知道該點所在三角形三個角的坐標和這三個點的高度,然后根據線性插值估算出該點的高度,判斷該點在哪個正方形中,比較容易,只要根據定點之間的間距,和地形的開始坐標就可求出該正方形的左下角頂點,但要再進一步算是哪個三角形,就有一個技巧了,
比如:

當正方形的邊長一樣時,頂點V在哪個三角形中只要判斷坐標點 X + Y是否大于 邊長就可以了。一般地形應該都是直角邊相等的三角型吧。
然后再根據所確定下來的三角形的三個點進行線性插值就可以了。。
posted @
2008-10-08 15:45 AstaTus 閱讀(375) |
評論 (0) |
編輯 收藏
強烈的欲望,我要變強!!吼~~~~~~~~~~~~~~~~~~~~~~~~~
posted @
2008-10-06 22:08 AstaTus 閱讀(237) |
評論 (1) |
編輯 收藏
摘要: 最近看的那本directx 的書的源碼都是用函數,沒用c++的類,用起來超不爽,所以自己來,封裝了下,現在才看到《頂點的顏色》的那章,所以類還很不完整,以后慢慢改進。。
//Base.h/**//////////////////////////////////////////////#ifndef BASE_H#define BASE_H#include <d...
閱讀全文
posted @
2008-09-20 22:10 AstaTus 閱讀(1337) |
評論 (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 閱讀(244) |
評論 (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 閱讀(1096) |
評論 (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 閱讀(356) |
評論 (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 閱讀(226) |
評論 (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) |
編輯 收藏