HLSL頂點著色器

2021-06-29 12:42:25 字數 3096 閱讀 6361

1.在文字檔案裡編寫頂點著色器**(hlsl語言)

2.編譯著色器**(d3dxcompileshaderfromfile)

3.建立頂點著色器(createvertexshader)

4.獲取hlsl語言中變數控制代碼(getconstantbyname)

5.根據控制代碼給hlsl語言中的變數傳值(id3dxconsttable->set***)??

在文字檔案裡寫頂點著色器**:

//----------------------------------begin vertexshader.txt--------------------------------------------

//世界-觀察 矩陣

matrix g_world_view;

//世界-觀察-投影 矩陣

matrix g_world_view_proj;

//顏色

vector g_color;

//光線方向

vector g_dir_to_light;

//輸入

struct vtin

;//輸出

struct vtout

;//函式入口

vtout main(vtin input)

float v = 0.5f; //紋理y軸畫素(0.0f~1.0f)

output.uv.x = u;

output.uv.y = v;

output.diffuse = g_color;

return output;

}//----------------------------------end vertexshader.txt--------------------------------------------

//vs中程式**:

#define mesh_teapot 0

#define mesh_sphere 1

#define mesh_torus 2

#define mesh_cylinder 3

//-----------頂點著色器相關的變數------------------

idirect3dvertexshader9* m_vertexshader;

id3dxconstanttable* m_constanttable;

idirect3dtexture9* m_shadetexture;

id3dxmesh* m_meshes[4];

d3dxmatrix m_worldmatrices[4];

d3dxvector4 m_meshcolors[4];

d3dxmatrix m_projmatrix;

d3dxhandle m_worldviewhandle;

d3dxhandle m_worldviewprojhandle;

d3dxhandle m_colorhandle;

d3dxhandle m_dirlighthandle;

//setup: main函式中呼叫一次

void setup()

if (failed(hr))

//建立頂點著色器

hr = d3ddevice()createvertexshader((dword*)shader_buffer->getbufferpointer(), &m_vertexshader);

if (failed(hr))

//釋放

//safe_release(shader_buffer);

//載入紋理:

d3dxcreatetexturefromfile(d3ddevice, l"d:\\pic1.png", &m_shadetexture);

//設定狀態屬性:

d3ddevice->setsamplerstate(0, d3dsamp_magfilter, d3dtexf_point);

d3ddevice->setsamplerstate(0, d3dsamp_minfilter, d3dtexf_point);

d3ddevice->setsamplerstate(0, d3dsamp_mipfilter, d3dtexf_none);//禁用過濾

//獲取常量控制代碼

m_worldviewhandle = m_constanttable->getconstantbyname(null, "g_world_view");

m_worldviewprojhandle = m_constanttable->getconstantbyname(null, "g_world_view_proj");

m_colorhandle = m_constanttable->getconstantbyname(null, "g_color");

m_dirlighthandle = m_constanttable->getconstantbyname(null, "g_dir_to_light");

// set shader constants

d3dxvector4 dir_to_light(-0.57f, 0.57f, -0.57f, 0.0f);

m_constanttable->setvector(d3ddevice, m_dirlighthandle, &dir_to_light);

m_constanttable->setdefaults(d3ddevice);

//設定投影矩陣

rect rt;

getclientrect(hwnd, &rt);

d3dxmatrixperspectivefovlh(&m_projmatrix, d3dx_pi / 4.0f, (float)rt.right / rt.bottom, 1.0f, 1000.0f); }

//display: 在訊息迴圈中呼叫,時時更新

void display(float timedelta)

d3ddevice()->endscene();

d3ddevice()->present(null, null, null, null);

}

頂點著色器 片段著色器

一 著色器 著色器只是一種把輸入轉化為輸出的程式。著色器也是一種非常獨立的程式,因為它們之間不能相互通訊 它們之間唯一的溝通只有通過輸入和輸出。在最簡配置下,至少都得有兩個著色器 乙個叫頂點著色器 vertex shader 它將作用於每個頂點上 另乙個叫片段著色器 fragment shader ...

著色器(Shader)之頂點著色器

頂點著色器其實就是我們自己編寫的一段在gpu中執行的程式,有了頂點著色器,我們就可以從固定的功能流水線中代替一些模組,從而獲得更多的頂點操作的靈活性。對於頂點位置進行操作的的能力具有廣泛的應該場合 織物模擬 粒子系統的點尺寸處理等。可程式設計流水線中的頂點結構比固定的流水線具有更加豐富的資料。首先我...

頂點著色器與片元著色器

頂點著色器 在管線中的位置 1號 這圖作的跟病毒似的 可以替代下面這些傳統的操作 頂點變換 法線變化及規範化 紋理座標生成 紋理座標變換 光照彩色材質應用 頂點著色器可以用來指定一系列完全通用的 並將應用於各個頂點及相關資料上的操作。理解這點很重要。頂點著色器不會取代一次需要多個頂點的情況或者需要拓...