Android著色器Shader使用誤區

2021-09-11 14:54:28 字數 2211 閱讀 7284

[toc]

shader的基本使用不多說了,請參考blog.csdn.net/iispring/ar…,這裡我們只講解shader使用過程中的小細節或誤區。

bitmapshader載入的原圖如下:

測試**如下:

public class bitmapshaderview extends view 

public bitmapshaderview(context context, @nullable attributeset attrs)

public bitmapshaderview(context context, @nullable attributeset attrs, int defstyleattr)

private void init(context context)

@override

protected void onlayout(boolean changed, int left, int top, int right, int bottom)

@override

protected void ondraw(canvas canvas)

}複製**

xml中定義如下:

"200dp"

android:layout_height="200dp"

android:layout_margintop="10dp" />

複製**

為了進行測試,我們將bitmapshaderview的寬高都定義為200dp,這個值大於bitmap的原始寬高。

用如下方法替換上面的testx方法

private void test0(canvas canvas) 

複製**

此時繪製的rect與bitmap的實際大小一致,得到如下效果:

我們將test0中**修改如下

private void test0(canvas canvas) 

複製**

此時繪製的rect大小是整個view,遠大於bitmap的實際大小,得到如下效果:

對比「1.繪製圖形大小與bitmap大小相等」的結果,此時發現bitmapshader的第2、3個引數有作用了

bitmapshader(bitmap bitmap, shader.tilemode tilex, shader.tilemode tiley)

複製**

小結:當繪製的圖形區域大於bitmap實際大小時(其實這個說法不準備,具體看後面分析),會按照bitmapshader的第2、3個引數的設定進行著色。

我們將test0中**修改如下

private void test0(canvas canvas) 

複製**

此時繪製的rect大小是只有bitmap實際大小的一般,得到如下效果:

對比「1.繪製圖形大小與bitmap大小相等」的結果,發現源影象只有左上角2/3區域被顯示出來了。

總結:在使用bitmapshader進行著色時,要理解繪製圖形大小與bitmap實際大小最終對著色結果的影響。

private void test0(canvas canvas) 

複製**

我們將座標系遠點移動到bitmapshaderview的中心,得到的結果如下:

發現源bitmap繪製的啟動已經轉移到bitmapshaderview的中心,但這還說明不了什麼,因為drawrect的啟動也是從中心開始的,得到上圖所示的結果也是理所當然的。下面我們再修改test0**如下:

private void test0(canvas canvas) 

複製**

我們以bitmapshaderview的中心為中心畫乙個正方形,這個正方形的大小與源bitmap大小是一致的,得到的結果如下:

(注:bitmapshader的第2、3個引數為repeat)

得到這樣的結果可能會讓很多人覺得奇怪,按照「1.繪製圖形大小與bitmap大小相等」的分析,得到的結果應該與「1.繪製圖形大小與bitmap大小相等」的結果是一致的。這就是我想講清楚的關鍵點:

lineargradient、radialgradient、sweepgradient的使用過程中,同樣要注意上面的問題。

著色器(Shader)之畫素著色器

畫素著色器實際上就是對每乙個畫素進行光柵化的處理期間,在gpu上運算的一段程式。不同與頂點著色器,畫素著色器不會以軟體的形式來模擬畫素著色器。畫素著色器實質上是取代了固定功能流水線中多重紋理的環節,而且賦予了我們訪問單個畫素以及訪問每乙個畫素紋理座標的能力 多重紋理就是我們同時啟用多層紋理,然後規定...

OpenGL ES 著色器 片斷著色器詳解

opengl es 入門 01 opengl es 入門 02 opengl es 入門 03 opengl es 入門 04 opengl es 入門 05 opengl es 入門練習 01 opengl es 入門練習 02 opengl es 入門練習 03 opengl es 入門練習 0...

頂點著色器 片段著色器

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