Directx11教程四十三之glow 邊緣發光

2021-08-02 16:59:42 字數 2644 閱讀 4402

這一節教程是關於渲染3d物體的發光邊緣,**結構如下:

這裡借用下虛幻四引擎演示下「邊緣發光效果」,如下圖所示:

如上面圖中虛幻四引擎中被選中的立方體的邊緣是發光的,我實現的就是這種發光效果

這裡有篇部落格介紹了「glow」是怎麼實現的:

[unity3d][shader 著色器]給物體邊緣加高光輪廓的辦法

這裡大致說下我實現的方法步驟:

(1)正常的渲染整個場景得到一張rtt,我稱其為scenertt,如下所示:

(2)渲染要發光的物體成一張blackwhitertt(也就是只有黑白兩種顏色的rt),如下所示:

實現的shader**:

drawblackwhiteshader.fx

cbuffer cbmatrix:register(b0)

;struct vertexin

;struct vertexout

;vertexout vs(vertexin ina)

float4 ps(vertexout outa) : sv_target

(3)對blackwhitertt進行高斯模糊,將物體邊緣的畫素偏移,也就是先進行水平模糊,然後進行垂直模糊,最終得到glowmapverticalblurrtt,如下所示:

相應的shader實現**:

horizontalblurshader.fx

texture2d shadertexture:register(t0);  //紋理資源

samplerstate sampletype:register(s0); //取樣方式

//vertexshader

cbuffer cbmatrix:register(b0)

;cbuffer cbscreenwidth:register(b1)

struct vertexin

;struct vertexout

;vertexout vs(vertexin ina)

float4 ps(vertexout outa) : sv_target

verticalblurshader.fx

texture2d shadertexture:register(t0);  //紋理資源

samplerstate sampletype:register(s0); //取樣方式

//vertexshader

cbuffer cbmatrix:register(b0)

;cbuffer cbscreenheight:register(b1)

struct vertexin

;struct vertexout

;vertexout vs(vertexin ina)

float4 ps(vertexout outa) : sv_target

(4)進行2d rendering,將第一步得到的「scenertt」和第三步得到的「glowmapverticalblurrtt」作為紋理資源使用。實現「發光邊緣」的思路:由於我們對之前只有黑白兩色的blackwhitertt進行渲染,那麼經過高斯模糊後,glowmapverticalblurrtt的邊緣顏色值變為灰色,也就是位於0.0f和1.0f之間,將這部分的畫素變為「高亮部分」,如下圖所示:

實現的shader**如下:

glowshader.fx

texture2d scenertt:register(t0);  //scenertt

texture2d glowmaprtt:register(t1); //glowmaprtt

samplerstate wrapsampletype:register(s0); //取樣方式

cbuffer cbmatrix:register(b0)

;cbuffer cbglow:register(b1)

;struct vertexin

;struct vertexout

;vertexout vs(vertexin ina)

float4 ps(vertexout outa) : sv_target

else

return color;

}

Directx11教程四十二下之進行骨骼動畫的渲染

前面兩小節分別說明了骨骼動畫的數學原理和一種骨骼動畫格式m3d的讀取,這一節講解渲染的思路。其實,進行骨骼動畫的渲染,整體思路是 第一,求出某個動畫片段下某乙個時間點下所有骨骼的finalmatrix 由骨骼在某一幀的pos,scale,quat求出 第二,由於 第一 中渲染骨骼動畫的時間點可能不在...

Directx11教程37 紋理對映 7

本章是在教程35 36的基礎上來實現乙個光照紋理結合的程式,就是把場景中旋轉的cube加上紋理。lighttex.vs中頂點的結構現在為 struct vertexinputtype 紋理座標 output.tex input.tex 紋理座標不做任何變化,只是單純的從vs輸出到ps中。lightt...

Directx11教程38 紋理對映 8

上篇日誌中,我們用紋理和光照顏色調製的方式得到最終顏色,本章我們嘗試用紋理取樣的顏色,直接做為材質的漫反射係數kd,並用它來做光照計算,最後再做個gamma校正,如果不做的話,效果會偏亮。lighttex.ps主要改動 float4 texturecolor shadertexture.sample...