代碼著色器
Ⅰ 頂點著色器傳遞給片段著色器的值老被插值改變,怎麼解決
應該把pos.x乘pos.x的代碼從頂點著色器轉到片段著色器
比如頂點是3個點(1,0),(-1,0),(1,1)
然後頂點著色器只會計算一次該點的坐標,比如x*x則計算出的是(1,0),(1,0),(1,1),那頂點最終計算出的該頂點的坐標就是(1,0),(1,0),(1,1),你先平了方,再傳到段著色器,因為3個點x都是1,線性插值後片段的x都是1
但是如果你先把pos先傳到片段著色器,再平方,那片段著色器處理的是(1,0),(1,0),(1,1)平均後的坐標再平方,那就是正確的了
頂點只會計算3次,片段是每個像素都會計算一次,所以你在頂點計算的cos,是那個點坐標的cos,不是片段的坐標的cos
Ⅱ unity3d中 如何用js代碼來更改shader中的3個子著色器
用SetColor()函數
具體看官方腳本手冊的Material類
例子是:
function
Start
()
{
//設置glossy著色器以便使用高光顏色
renderer.material.shader
=
Shader.Find
("
Glossy");
//設置高光色為紅色
renderer.material.SetColor
("_SpecColor",
Color.red
);
}
Ⅲ opengl 著色器 有什麼用
這是可編程管線里的術語 著色器分為 頂點和像素 兩種 也叫 vertex shader 和 fragment shader(或pixel shader),就是可編程管線里兩種代碼的稱呼.用shader可以完成你的各種3d模型,圖片顯示需要.
Ⅳ 電腦常識:著色器的像素和條數的定義是
像素著色器包含由ASCII文本組成的像素著色器指令。算術指令可以用來進行漫反射和/或鏡面反射光照計算。紋理定址指令提供了多種讀取和應用紋理數據的操作。著色器具有這樣的功能,可以給顏色分量設置掩碼以及交換顏色分量。著色器的正文看起來有點像匯編語言,它用Direct3D擴展(D3DX)進行匯編,輸入可以是文本字元串或是文件。匯編器的輸出是一系列操作碼,應用程序可以通過IDirect3DDevice9::CreatePixelShader方法把這些操作碼提供給Direct3D。 本示例用像素著色器對一個四邊形的漫反射色進行高洛德插值。示例顯示了著色器文件的內容以及應用程序中所需的代碼。 著色器(shaders):一個腳本系統被用於使用多種不同方法來組合紋理材質來實現驚人的視覺效果。支持實時的像素渲染,凸凹反射,漫反射,反射,容積光效果,透明顯示,窗口,彈眼和光澤表面。
Ⅳ 有個游戲要求顯卡頂點像素著色器3.0,是什麼意思
頂點像素著色器對顯卡的性能影響很大,是顯卡的主要參數之一。
什麼是頂點著色器?
1 頂點著色器是一組指令代碼,這組指令代碼在頂點被渲染時執行。
2 同一時間內,只能激活一個頂點著色器。
3 每個源頂點著色器最多擁有128條指令(DirextX8.1),而在DirectX9,則可以達到256條。
為什麼大家要使用頂點著色器?
1 頂點著色器可以提高渲染場景速度。
2 用頂點著色器你可以做布類模擬,高級別動畫,實時修改透視效果(比如水底效果),高級光亮(需要像素著色器支持)
頂點著色器如何運作?
簡單說來,運作方式如下:當渲染一個頂點時,API會執行你在頂點著色器中所寫的指令。依靠這種方法,你可以自己控制每個頂點,包括渲染,確定位置,是否顯示在屏幕上。
如何創建一個頂點著色器?
用一個文本編輯器就可以了!我建議你們使用notepad或者vs開發環境來創建和修改著色器。另外,必須擁有一個支持可編程著色器的顯卡。寫完著色器後,保存他。API就可以調用他了(Direct3D或OpenGL)。API通過一些函數來調用這些代碼指令到硬體中。
什麼是像素著色器?
1 像素著色器也是一組指令,這組指令在頂點中像素被渲染時執行。在每個執行時間,都會有很多像素被渲染。(像素的數目依靠屏幕的解析度決定)
2像素著色器的指令和頂點著色器的指令非常接近。像素著色器不能像頂點著色器那樣,單獨存在。他們在運行的時候,必須有一個頂點著色器被激活。
為什麼大家要使用像素著色器?
1 像素著色器過去是一種高級圖形技術,專門用來提高渲染速度。
2 和頂點著色器一樣,使用像素著色器,程序員能自定義渲染每個像素。
像素著色器如何運作?
一個像素著色器操作頂點上單獨的像素。和頂點著色器一樣,像素著色器源代碼也是通過一些API載入到硬體的。
如何創建一個像素著色器?
也和頂點著色器一樣,你只需要一個文本編輯器和支持著色器編程的顯卡即可。同樣,API(Direct3D OpenGL)載入像素著色器代碼指令到硬體中。
我從別的地方復制的,很全面我就不再打字了。 另外SM3.0是要顯卡硬體支持的,一般顯卡包裝上有支持DirectX 9.0C(DirectX 9.0b的只支持SM2.0)的就行了,現在的顯卡一般都支持了。
Ⅵ 怎麼使用頂點著色器
2.3 使用頂點著色器的步驟
閱讀此文表明您已同意文末的聲明
下面的列表概括了創建和使用頂點著色器的必須步驟。
1. 編寫並編譯頂點著色器
2. 創建一個IDirect3DVertexShader9介面以代表基於已編譯著色器代碼上的頂點著色器。
3. 用IDirect3DDevice9:: SetVertexShader方法允許這個頂點著色器。
當然,在我們做完這些之後,我們還得銷毀這個頂點著色器。下面的各小節將更詳細的邁入這些步驟。
2.3.1 編寫並編譯頂點著色器
首先,我們必須編寫一個頂點著色器程序。在本書中的HLSL一章中,我們已經編寫了我們的著色器(譯者註:參見我翻譯的譯文第一章中各節)。一旦著色器代碼寫好之後,我們就使用D3DXCompileShaderFromFile函數編譯這個著色器,如1.2.2節所述。回憶一下,這個函數返回一個ID3DXBuffer指針,它包含了已編譯的著色器代碼。
2.3.2 創建頂點著色器
一旦我們擁有了編譯好的著色器代碼,我們就能夠獲得一個IDirect3DVertexShader9介面的指針,它代表一個頂點著色器——通過使用下面的方法:
HRESULT IDirect3DDevice9::CreateVertexShader(
const DWORD *pFunction,
IDirect3DVertexShader9** ppShader
);
pFunction——已編譯著色器代碼的指針
ppShader——返回一個IDirect3DVertexShader9介面的指針
例如,假設變數shader是一個包含已編譯著色器代碼的ID3DXBuffer(的介面指針)。然後要獲得一個IDirect3DVertexShader9介面,我們可以寫:
IDirect3DVertexShader9* ToonShader = 0;
hr = Device->CreateVertexShader(
(DWORD*)shader->GetBufferPointer(),
&ToonShader);
注意:重申一遍,D3DXCompileShaderFromFile是一個返回已編譯著色器代碼(shader)的函數。
2.3.3 建立頂點著色器
在我們獲得了一個代表我們的頂點著色器的IDirect3DVertexShader9介面的指針之後,我們就能夠使用下面的方法允許(enable)它:
HRESULT IDirect3DDevice9::SetVertexShader(
IDirect3DVertexShader9* pShader
);
這個方法僅接受一個參數,我們在其中傳遞一個想要允許的頂點著色器的指針。要允許這個我們在2.3.2節創建的著色器,我們可以寫:
Device->SetVertexShader(ToonShader);
2.3.4 銷毀頂點著色器
和所有的Direc3D介面一樣,要清除他們,我們就必須在用完它們之後調用其的Release方法。仍然以我們在2.3.2節創建的頂點著色器為例,我們寫:
d3d::Release<IDirect3DVertexShader9*>(ToonShader);
[聲明]:本文譯自Frank Luna的《Introction to 3D Game Programming with DirectX 9.0》,限於譯者水平,文中難免錯漏之處,歡迎各位網友批評指正;本文僅用於學習交流與參考用途,不得用於任何形式的商業用途;如需轉載需事先徵得作者本人和譯者的同意,保持文章的完整性,並註明作者、譯者和出處,作者保留對譯文的所有權利。對於違反以上條款造成的後果,譯者對此不負任何責任。我的MSN是[email protected],歡迎熱愛3D圖形和游戲,並有一定圖形編程經驗的朋友與我進行交流。
Ⅶ 如何修改標准著色器StandardShader中的Emission屬性
1、利用DirectX Caps Viewer查我的顯卡(GeForce 9400 GT)支持的著色器版本,是3.0,這樣最好了,支持16層紋理。對於D3DXCompileShaderFromFile()這個函數,有個參數值得注意,就是Flags,書(DirectX 9.0 游戲看法編程基礎)上只講了三種合法的編譯選項,但是我們如果直接在VS上運行它的代碼,發現出錯,就是因為這個Flags的緣故。解決辦法:查看SDK,發現其實不只有三種,DX9支持10中FLAGES,而DX10支持的更多,解決方法有二:修改ps_1_1為ps_3_0,不改變FLAGES,具體看你的顯卡了;方法二是修改D3DXSHADER_DEBUG為D3DXSHADER_ENABLE_BACKWARDS_COMPATIBILITY可把1.0當做2.0編譯,即向後兼容,不過這個編譯項是DX10支持的,加入相應的庫鏈接就可以。 2、對於編譯好的shader,我們用通過CreatePixelShader獲得IDirectX3DPixelShader9介面(DX都是對一些介面進行操作)的指針,要通過應用程序改變設定shader(著色器)裡面的變數值或初始值,我們必須使用介面ID3DConstantTable,使用下面的語句便是初始化為默認值。 show sourceview source print? 1MultiTexCT->SetDefaults(Device);通過下面的語句進行設定: show sourceview source print? 1HRESULT SetXXX( 2 LPDIRECT3DDEVICE9 pDevice, 3 D3DXHANDLE hConstant, 4 XXX VALUE 5);對於紋理,第一步載入到相應的介面中: show sourceview source print? 1D3DXCreateTextureFromFile(Device, "crate.bmp", &BaseTex); 2D3DXCreateTextureFromFile(Device, "spotlight.bmp", &SpotLightTex); 3D3DXCreateTextureFromFile(Device, "text.bmp", &StringTex);第二步得到著色器中紋理采樣器的句柄: view source print? 1BaseTexHandle = MultiTexCT->GetConstantByName(0, "BaseTex");//此BaseTex與上面的BaseTex不同,這個BaseTex是著色器裡面的采樣器名稱,那個是紋理介面 2SpotLightTexHandle = MultiTexCT->GetConstantByName(0, "SpotLightTex"); 3StringTexHandle = MultiTexCT->GetConstantByName(0, "StringTex");第三步是設定著色器中的采樣器的值,我實驗了有兩種方法,個人感覺書上的更繁瑣一些:書上的,先用GetConstantDesc得到采樣器的描述情況,由於描述情況包含了採用器的注冊索引,具體參考課本: show sourceview source print? 1MultiTexCT->GetConstantDesc(BaseTexHandle, &BaseTexDesc, &count); 2 Device->SetSamplerState(BaseTexDesc.RegisterIndex, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR); 3 Device->SetSamplerState(BaseTexDesc.RegisterIndex, D3DSAMP_MINFILTER, D3DTEXF_LINEAR); 4 Device->SetSamplerState(BaseTexDesc.RegisterIndex, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR); 第二種方法是自己無意間查SDK發現的,就是直接得到采樣器的注冊索引,而不通過描述情況,如下: view source print? 1// base tex 2Device->SetTexture(MultiTexCT->GetSamplerIndex(BaseTexHandle), BaseTex); 3Device->SetSamplerState(MultiTexCT->GetSamplerIndex(BaseTexHandle), D3DSAMP_MAGFILTER, D3DTEXF_LINEAR); 4Device->SetSamplerState(MultiTexCT->GetSamplerIndex(BaseTexHandle), D3DSAMP_MINFILTER, D3DTEXF_LINEAR); 5Device->SetSamplerState(MultiTexCT->GetSamplerIndex(BaseTexHandle), D3DSAMP_MIPFILTER, D3DTEXF_LINEAR); view source print? 1第四步就是調用來設定采樣器和其綁定的紋理:<DIV class=cnblogs_Highlighter><PRE class=brush:cpp>IDirect3DDevice9::SetTexture 2 3</PRE> 4</DIV>