如果無法打開,嘗試訪問
然后再打開
就不會轉向香港首頁
Chrome中添加網(wǎng)址https://www.google.com/search?hl=zh-CN&q=%s
不過SSL貌似不支持圖片搜搜,因此香港版的最好保留
戰(zhàn)魂小筑討論群:309800774 知乎關注:http://zhihu.com/people/sunicdavy 開源項目:https://github.com/davyxu |
如果無法打開,嘗試訪問
然后再打開
就不會轉向香港首頁
Chrome中添加網(wǎng)址https://www.google.com/search?hl=zh-CN&q=%s
不過SSL貌似不支持圖片搜搜,因此香港版的最好保留
原文地址:http://zhaiyx.com/2010/06/ghost-fighter/
一段類似于火柴人格斗的Flash動畫,不過華麗度卻絕非火柴人系列可以相比。更牛逼的是,動畫還支持鏡頭縮放和視角切換。
動畫很簡短,但值得一看。
控制說明:
右邊數(shù)字鍵盤1、2、3、4:切換鏡頭視角
鼠標滾輪:放大/縮小鏡頭
上下:控制播放速度
左右:逐幀查看
空格:播放/暫停
S:打開/關閉音樂
F:顯示/隱藏FPS
Q:切換影片質(zhì)量
http://www.wacoool.com/up_files/flash/ghostfight.swf
原文 http://www.cnblogs.com/cocoaleaves/archive/2009/09/25/1573683.html
XNA里的很多例子提供了光照最基礎的教學,可惜XNA不是誰都喜歡, RenderMonkey才是Shader研究的王道工具, 鏈接里提供了例子下載,非常經(jīng)典,不可不看
朋友給我了一個VS2010的一個BUG: 任意位置, CTRL+F打開搜索窗口,ESC關閉,不停的重復以上過程, 窗口將會不斷變大,關閉VS2010后再次打開依然保持大小.
已經(jīng)有人報過這個BUG, http://connect.microsoft.com/VisualStudio/feedback/details/555385/find-and-replace-window-changes-size-and-location
昨天研究了下Node Based Material System, 虛幻3的材質(zhì)系統(tǒng)是沒戲了,還沒用會呢. 不過Max的一個插件: ShaderFX倒是給我很大的啟發(fā),這東西就是結點型材質(zhì)系統(tǒng), 而且能生成真正的FX. 不像虛幻3那么不厚道,只是局部顯示HLSL.
經(jīng)過分析ShaderFX導出的Shader文件, 發(fā)現(xiàn)其標準材質(zhì)系統(tǒng)使用的就是逐像素光照模型, 而不同的Materials對應的就是一種Shader處理管線, 分別可以處理各種光照,甚至達到Compositor的混合效果. 而Shader Code Generation這個環(huán)節(jié),也遠沒有虛幻3那樣復雜(虛幻是神,咱們不評論神到底如何),只是將光照需要的各種分量,例如Emissive, Ambient, Diffuse, Specular等根據(jù)各分量提供的計算因子直接嵌入到Pixel Shader主函數(shù)體即可.
逐頂點光照在前面的文章已經(jīng)有介紹,代碼相對簡單, 因此以后在材質(zhì)系統(tǒng)中準備直接上逐像素光照. 因此,需要在我的模型插件中加入Tangent及Binormal支持.
這里是一篇很不錯的講解Tangent Space Vector的文章. 文中有貼過OGRE的Tangent計算代碼,不過查閱OGRE 1.65代碼后發(fā)現(xiàn),OGRE現(xiàn)在根本就不用這個函數(shù)計算Tangent,而是更為復雜的一個類.
最終,我還是使用了大野豬的ev3d的max插件代碼, 如果需要的話,可以去他博客找svn下載
bool CMaxMesh::__cacl_tbn(sFace_t& face,bool isSkin)
{
Point3 normal[3];
Point3 Tangent;
Point3 p[3];
assign(normal[0],m_MeshData.m_VertexData.m_Normals[face.vert[0]]);
assign(normal[1],m_MeshData.m_VertexData.m_Normals[face.vert[1]]);
assign(normal[2],m_MeshData.m_VertexData.m_Normals[face.vert[2]]);
if(isSkin == false)
{
assign(p[0],m_MeshData.m_VertexData.m_Positons[face.vert[0]]);
assign(p[1],m_MeshData.m_VertexData.m_Positons[face.vert[1]]);
assign(p[2],m_MeshData.m_VertexData.m_Positons[face.vert[2]]);
}
else
{
assign(p[0],m_MeshData.m_VertexData.m_VertexWeights[face.vert[0]].m_InitPos);
assign(p[1],m_MeshData.m_VertexData.m_VertexWeights[face.vert[1]].m_InitPos);
assign(p[2],m_MeshData.m_VertexData.m_VertexWeights[face.vert[2]].m_InitPos);
}
sUVCoord_t uv[3];
uv[0] = m_MeshData.m_VertexData.m_UVChannels[0][face.vert[0]];
uv[1] = m_MeshData.m_VertexData.m_UVChannels[0][face.vert[1]];
uv[2] = m_MeshData.m_VertexData.m_UVChannels[0][face.vert[2]];
Point3 e1 = p[1] - p[0];
Point3 e2 = p[2] - p[0];
sUVCoord_t u1 = { uv[1].u - uv[0].u , uv[1].v - uv[0].v};
sUVCoord_t u2 = { uv[2].u - uv[0].u , uv[2].v - uv[0].v};
float det = ( u1.u * u2.v - u2.u * u1.v);
if(det == 0.0f)
{
Tangent = e1;
}
else
{
Tangent = u2.v * e1 - u1.v * e2;
}
//從Normal 和 Tangent里重新計算出Tangent,因為面的Tangent和頂點的Normal可能不垂直
Point3 final_tangent;
for(int i = 0 ;i < 3 ; ++i)
{
Point3 binormal = CrossProd(normal[i],Tangent);
final_tangent = CrossProd(binormal,normal[i]);
final_tangent.Normalize();
m_MeshData.m_VertexData.m_Tangents[face.vert[i]].x += final_tangent.x;
m_MeshData.m_VertexData.m_Tangents[face.vert[i]].y += final_tangent.y;
m_MeshData.m_VertexData.m_Tangents[face.vert[i]].z += final_tangent.z;
}
return true;
}
感謝大野豬友情出演,正片開始:)
在Notepad++官網(wǎng)的User DefinedLanguage files下載一種你需要的自定義語言文件,例如HLSL
將這個文件命名為userDefineLang.xml,并拷貝進以下目錄:
XP: C:\Documents and Settings\[username]\Application Data\Notepad++
Vista/Win7 C:\Users\[username]\AppData\Roaming\Notepad++
如果已經(jīng)有這種文件,將下載的文件內(nèi)容手動添加到原文件
這里推薦下OGRE官網(wǎng)的Cg自定義語言模板,這個標色比較不錯
DXSDK里光照模型的講解依然停留在DX9的固定管線時代; DX10及DX11的文檔里只是API文檔,居然一點基于Shader的光照模型講解文章都未見,失望.
無奈, 打開NV官網(wǎng),找到這樣一篇文章, 基于Cg語言的Shader標準光照模型講解, Bingo!
了解標準光照基礎知識后,就不會面對MAX的材質(zhì)系統(tǒng), Maya的Node Based Material System感到陌生.
這里貼下這組光照模型的Cg代碼
float4x4 matViewProjection;
float3 GlobalAmbient;
float3 LightColor;
float3 LightPosition;
float4 EyePosition;
float3 Ke;
float3 Ka;
float3 Kd;
float3 Ks;
float Shininess;
void vs_main(
in float4 InPosition : POSITION,
in float3 InNormal : NORMAL,
out float4 OutPosition : POSITION,
out float4 OutColor : COLOR0
)
{
OutPosition = mul( InPosition, matViewProjection );
float3 P = InPosition.xyz;
float3 N = InNormal;
// Compute the emissive term
float3 Emissive = Ke;
// Compute the ambient term
float3 Ambient = Ka * GlobalAmbient;
// Compute the diffuse term
float3 L = normalize( LightPosition - P );
float DiffuseLight = max( dot( N, L ), 0 );
float3 Diffuse = Kd * LightColor * DiffuseLight;
// Compute the specular term
float3 V = normalize( EyePosition - P );
float3 H = normalize( L + V );
float SpecularLight = pow( max( dot( N, H ), 0 ), Shininess );
if ( DiffuseLight <= 0 ) SpecularLight = 0;
float3 Specular = Ks * LightColor * SpecularLight;
OutColor.xyz = Emissive + Ambient + Diffuse + Specular;
OutColor.w = 1;
}
float4 ps_main( float4 OutColor : COLOR0 ) : COLOR0
{
return( OutColor );
}
今天順利顯示靜態(tài)模型, 加上紋理后,發(fā)現(xiàn)ZBuffer好像有點不對勁
于是檢查D3DRS_ZENABLE,D3DRS_ZWRITEENABLE, 結果都是TRUE
無奈,只有與我以前正確的Demo對比210個渲染狀態(tài). 有部分渲染不同的,使用硬代碼強行糾正,結果: 無效
懷疑頂點格式破損, 重新使用以前的模型格式,排除這個可能性, 結果:失敗
無奈中,檢查設備選項, 突然注意到D3DPRESENT_PARAMETERS 結構體中的EnableAutoDepthStencil 設置是FALSE
因為這次設備類是重寫的,對比以前正確代碼, 有差異,將其改為
PresentParameters.EnableAutoDepthStencil = TRUE;
PresentParameters.AutoDepthStencilFormat = D3DFMT_D16;
以前翻閱SDK時,注意過這個選項, 這是由D3D幫你管理ZBuffer.
測試, 問題解決.
分析: 如果EnableAutoDepthStencil = FALSE, 意味著連ZBuffer都沒有,那更不要說渲染狀態(tài).
轉載請注明: 戰(zhàn)魂小筑
本文翻譯整理總結自http://http.developer.nvidia.com/GPUGems2/gpugems2_chapter05.html
如果喜歡,請購買正版
多流技術在渲染時能對性能和結構有一定好處.但是怎樣將模型數(shù)據(jù)分配到各頂點數(shù)據(jù)流進行渲染就是一個學問.
對于頂點數(shù)據(jù)可以分為這么幾個大類:
G: 多邊形數(shù)據(jù), 包含vertex position, normal, and vertex color(s).
T: 紋理映射, 包含多層紋理坐標及tangent vectors等
A: 動畫數(shù)據(jù), 骨骼動畫中的骨骼權重及骨骼索引
I: 用于Instance繪制的用戶數(shù)據(jù)
以下是對一些常用渲染的流搭配:
靜態(tài)模型
可以是: G or G + T
骨骼動畫模型
可以是:G + A or G + T + A
Instance繪制的骨骼動畫模型
可以是:G + I or G + T + I 或者動畫類型的G + A + I or G + T + A + I
渲染Z-Pass物件
可以是G, 或者動畫類型的G + A or G + I or G + A + I