當前位置:首頁 » 安卓系統 » androidshader

androidshader

發布時間: 2022-05-03 20:41:14

⑴ android setshader怎樣清除掉

setShader(Shader shader)中傳入的自然是shader對象了,shader類是Android在圖形變換中非常重要的一個類。Shader在三維軟體中我們稱之為著色器,其作用是來給圖像著色。它有五個子類,像PathEffect一樣,它的每個子類都實現了一種Shader。下面來看看文檔中的解釋:
子類:BitmapShader, ComposeShader, LinearGradient, RadialGradient, SweepGradient

二、BitmapShader
2.1 構造方法
只有有一個含參的構造方法:
BitmapShader (Bitmap bitmap, Shader.TileMode tileX, Shader.TileMode tileY)
顧名思義,它是給bitmap做處理的類,傳入的參數也有bitmap對象。從字面理解,傳入的第一個參數是bitmap對象,應該會對bitmap做一定的處理,後面兩個常量都是mode(模式),應該是設定處理效果的。理解了這個,我們就可以正式介紹下傳入的三個參數了。
第一個參數:要處理的bitmap對象
第二個參數:在X軸處理的效果,Shader.TileMode里有三種模式:CLAMP、MIRROR和REPETA
第三個參數:在Y軸處理的效果,Shader.TileMode里有三種模式:CLAMP、MIRROR和REPETA
下面我們就來用代碼進行各種模式的演示,演示之前自然要准備一個演示圖片了:

說明:為了講解需要,我給這個圖片邊界PS了幾個像素的紅色。

2.2 Shader.TileMode.CLAMP

@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);

Bitmap bitmap = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.kale);
// 設置shader
mPaint.setShader(new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP));
// 用設置好的畫筆繪制一個矩形
canvas.drawRect(180, 200, 600, 600, mPaint);
}

效果:

從效果看,我們看不明白這是什麼東西,只看到了大片的紅色區域,左上角漏出了一個原圖的小腳。我們索性把繪制區域放大,看看效果會有什麼變化。
canvas.drawRect(0, 0, 800, 800, mPaint);

效果:

這下我們的圖片終於完全顯示了出來,仔細分析發現圖片邊界的紅邊是在的,但是為啥右邊、下邊都沒有呢?因為我們設定的Shader.TileMode.CLAMP會將邊緣的一個像素進行拉伸、擴展。所以整個的紅色區域其實就是紅色邊框擴展後的結果。

2.3 Shader.TileMode.MIRROR
上面的例子我們知道CLAMP模式會拉伸邊緣的一個像素來填充,可以說是邊緣拉伸模式,那麼這個MIRROR模式會有什麼作用呢?顧名思義是鏡像,那麼就來測試一下。測試的代碼就是從上面的改動的,僅僅把X軸的模式換成了MIRROR而已。

@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);

Bitmap bitmap = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.kale);
// 設置shader
mPaint.setShader(new BitmapShader(bitmap, Shader.TileMode.MIRROR, Shader.TileMode.CLAMP));
// 用設置好的畫筆繪制一個矩形
canvas.drawRect(0, 0, 800, 800, mPaint);
}

結果:

可見,在繪制的矩形區域內,X軸方向上出現了鏡面翻轉,就像翻牌子一樣一個個翻開,和復印一樣。而Y軸我們還是用的CLAMP,繼續是拉伸邊緣的紅色像素,直到布滿畫布。

⑵ Unity卡通Shader在PC上正常,但到了Android手機上就閃爍 ,怎麼回事

這個可能是著色器不支持移動端

⑶ 怎樣用Android開發Unity3D游戲

1.認識Unity3D
Unity3D是一個讓開發者能夠在多平台製作同一款游戲的游戲開發工具,有專業的圖像處理和游戲引擎,能做出各式各樣的游戲。
羽化以前認為Android游戲開發只能在Eclipse裡面死活敲代碼,也許是自己閱歷不夠,不知道游戲引擎能給游戲開發帶來如此大的便利,無論是3D游戲還是2D游戲都可以用Unity3D開發而且轉成IPHONE游戲也很簡單,因為Unity3D很多移動開發功能IPHONE與Android是共用的,其中最主要的控制器就是一樣的,這樣我們就基本上告別Eclipse了。。。

由於Unity3D裡面的腳本是用C#或者java Script寫的,學習過這兩個語言最好,不會也沒關系,還可以學嘛(和羽化一樣),其實C#和JS與Java類似,看起來不會那麼陌生,要注意的是JS中無論什麼變數聲明都是」var」表示,這點對於聲明經常出錯的羽化來說很好-0-

2. Unity3D環境搭建與Android軟體生成方法
這里給大家介紹兩個網站,在裡面可以下載到最新的UnitySetup-3.3.0包括破解補丁U3v3.3.0f4_Win和腳本編輯器UnityScriptEditor2.55,還有很多學習資料,包括羽化正在學的Unity視頻教程(全英文啊=。=),還有全中文幫助文檔,雖然現在資料很少,但可以看出Unity3D越來越給力中。。。

安裝過程就不詳細寫了,很簡單的。這里要注意的是,安裝的系統用戶名不要是中文的,要不打開Unity3D以後Scene裡面看不到東西,這是羽化的切生體驗- -。
1)第一次打開Unity3D後會出現創建Project的界面,這就和Eclipse創建項目一樣的道理,這時候可以添加一些插件包,這步操作羽化留在了軟體打開後。

2)新建以後就出現了開發界面,這里簡單介紹下:
Scene 開發視圖:裡面可以拖拽物體位置、改變大小、旋轉角度等,是開發中最常的地方。
Game 游戲視圖:點上面的運行以後游戲就會在Game視圖裡面運行,沒點的時候可以看到攝像機當前的圖像。
Hierarchy 層試圖:放置游戲物件,在游戲運行時可以觀察游戲物件變化
Project 工程視圖:裡面可以新建文件夾管理腳本,渲染,圖片等。
Inspector 檢查視圖:顯示物件屬性等
最下面一條,一般情況下不會顯示東西,如果出錯或者列印語句都是顯示在下面:

先不管那麼多,生成個Android軟體再說。

3)在Project裡面右擊 ——〉 Import Package ——〉 Standard Assets(Mobile)這是移動開發的包,全部Import導入吧。再在Project裡面選中導入的Standard Assets(Mobile)———〉Control Setups——〉CameraRelativeSetup,這會提示保存Scene,我們就保存一個,可以看到Project裡面多了一個我們保存的Scene,游戲運行就是從Scene開始,這時應該可以看到這個包的顯示了。一眼就看出這是一個演示控制器的包,這個時候我們就不管這個工作原理,先放在Android手機裡面看看效果。

4)點擊左上角的File菜單——〉Build Settings——〉選中Android——〉右邊Development Build勾打上——〉點擊下面Player Settings,這時在Insperctor視圖裡面可以看到一些基本設定,第一個Resolution and Presentation是游戲視圖設定,橫屏還是豎屏隨你可以默認它,點擊Other Settings,這里主要設置Identification這個屬性,裡面第一個相當於項目包,這個一定不能默認,自己隨便寫個名字比如羽化就是com.LB.first其他設定大家可以自己研究,對於生成這個軟體,這步必須改。

5)然後回到窗口點擊Build,這里第一次點會跳出一個選中Android SDK的路徑,大家都懂的,自己放哪的選哪,確定後,輸入一個apk的名字,就叫作LB,如果發生什麼錯誤,可以看看下面的提示。

6)軟體已經生成好了後就可以丟到手機裡面安裝試試了,你可以直接丟在SD卡裡面安裝,這里羽化給大家介紹個簡單的方法,對於模擬器還是真機都適用,首先設置環境變數,在Path裡面添加如羽化自己目錄的D:android-sdk-windowsplatform-tools,這樣就可以在命令控制台裡面打命令了,比如羽化安裝的命令是cd C:UsersLiBeiDocumentsLB先到apk目錄下,再輸入adb install LB.apk這里要注意若你原來安裝過相同名字軟體,先卸載了再裝。

7)實際運行效果左搖桿是控制位移,右搖桿是控制方向:

步驟看起很多,其實很簡單。

3.Unity3D基本使用方法
這里羽化推薦大家看看視頻,看視頻學起來得很快,羽化就講講自己照視頻做的例子,解壓後可以通過Open Project選項打開這個例子,選中Scene裡面的Scene1打開,運行是在電腦上。

1)場景創建
全是Cube搭建的,看一眼就知道了,Cube可以在上方Gameobject——〉create other裡面創建,也點擊Hierarchy層視圖下面的Create創建,位置調整可以在Scene裡面通過左上角的物件選項慢慢調整,第一個是觀察,第二個是調整位置,第三個是調整角度,第四個調整大小。
2)主視角
這里主視角是用Standard Assets(這要自己導入)——〉Character Controllers——〉First Person Controller 可以看到這里能直接用的物件其實都是Prefab預設。這里可以看天空,其實是運用了Skybox組件,選中Main Camera可以在菜單中Component——〉Rendering——〉Skybox。
3)光
若無光運行的時候漆黑一片,這里放了個Point Light點光,數值可自行調整,添加和Cube一樣。
4)腳本
腳本放在Scripts文件夾下,裡面Door是控制門開關,Shoot是滑鼠點擊事件,Respawn是墜落返原地。注意這里腳本寫好以後要拖到對應物體上才能運行。
5)動畫
開門其實是個動畫,創建在Component——〉Miscellaneous ——〉Animation
6)火焰
火焰是粒子產生的,粒子創建和Cube類似,Particle System裡面的數值要做相應調整就會有火焰效果了。

再介紹幾個Component裡面重要的組件
1)Rigidbody 剛體
剛體顧名思義,有重量,帶碰撞都是剛體的屬性,若你為一個物件添加這個組件,證明你需要前面這幾個屬性。
2)Character 人物
其實裡面放的都是控制視角或者是主角操作的腳本。
3)Trail Renderer 路徑渲染器
很有用的組件,可以看到自己走過的路徑,論壇上有個切水果刀光的例子就是用到它。

⑷ 如何在Android上使用OpenGL ES 2.0繪制點

如何在Android使用OpenGL
ES
2.0繪制點,看上去並不是一個復雜的問題,但是上網一搜,滿眼都是繪制點的代碼。
如果你看到類似如下代碼,基本上你已經掉坑裡了。
···
c
glBeging();
...
glDrawPoint(...);
...
glEnd();
```
如上是使用OpenGL
ES
1.0繪制點的代碼。因為架構不同,在OPENGL
ES
2.0的世界裡,這一套已經徹底不管用了。
在OpenGL
ES
2.0里繪制點,要使用Shader,使用Shader,用Shader。。。。。。
具體怎麼繪制呢,首先你要搞清楚,如何用Shader繪制一個普通帶顏色的三角形。我這里假設你已經會了。
三角形顯示出來的那一刻,你一定會有這樣的代碼:
GLES20.glDrawArrays(GLES20.GL_TRIANGLES,
0,
vertexCount);
那麼,只顯示三角形的三個頂點該怎麼辦,說來簡單,這行代碼改成
GLES20.glDrawArrays(GLES20.GL_POINTS,
0,
vertexCount);
即可。
但是,理想和現實的差距總是很大,改完後三角形消失了但是頂點沒有出現。正常OpenGL
2.0環境下應該怎麼做呢?
1)首先調用
GL20.glEnable(GL_VERTEX_PROGRAM_POINT_SIZE);
這樣在Shader中可以訪問glPointSize;
2)然後類似准備每個頂點色彩那樣准備頂點的大小的數值,三角形是三個頂點,就准備3個float。把頂點數據像色彩數據那樣,綁定到VOB,再綁定到Shader的參數中。基本上就是照準備色彩那樣准備頂點大小數據,不同之處在於每個色彩4個float,每個頂點尺寸1個float。
3)最後,把你的頂點Shader文件改好,增加頂點大小的輸入參數和gl_PointSize賦值。
4)另外,如果你打算顯示圓形頂點,而不是方形的,還要用GL20.glEnable()函數設置其他參數,具體可查OpenGL官網。
比如:
uniform
mat4
matrix;
attribute
vec4
aVertex;
attribute
vec4
aColor;
attribute
float
aPointSize;
varying
vec4
vColor;
void
main(){
vColor
=
aColor;
gl_Position
=
matrix
*
aVertex;
gl_PointSize
=
aPointSize;
}
這樣,基本上就搞定了。
現在,坑爹的問題來了,在Android上你找不到GLES20.GL_VERTEX_PROGRAM_POINT_SIZE的常量,谷歌似乎認為在手機的3D環境下繪制點沒多大必要性,所以並沒有加上這個參數,好在預設情況下,模擬器中Shader中的gl_PointSize是打開的(Android
4.4.x)。所以你可以跳過第一步,直接傳遞點大小的參數,並把Shader改好就成。
那麼,為什麼你不寫gl_PointSize
=
aPointSize,點就顯示不出來呢。我估計預設情況下,gl_PointSize
=
0.0f,所以顯示不出來。
如果你顯示點的大小總是固定不變的,你甚至可以把傳遞頂點大小數值的步驟也省略掉,直接在Shader中寫上gl_PointSize
=
10.0f;即可。
閱讀本文,當你打算在Android上用OPENGL
ES
2.0顯示點時,即可跳過谷歌的那些坑了。我想,手機GPU硬體廠商的開發包應該對OpenGL
ES
2.0支持的更好些,比如高通的AdrenoSDK,建議大家下載嘗試。

⑸ Android中shape與shader的區別

shape是定義圖形用的,用xml定義出來的圖形可以給控制項設置背景,可以定義的屬性有形狀、邊框、填充方式等;

shader是渲染方式,一般用於游戲和對Ui要求比較高的app,他是對已有的圖片進行美化處理;

⑹ 在android 的openGL ES 2.0中怎麼向shader中傳struct

沒想到openGL ES 2.0和1.x之間的差別那麼大,而市面上介紹2.0的資料又很少。
說說問題:怎麼向shader中的struct傳數據?
直接說答案:struct不提供一次全部賦值的方法,只能一個一個數據傳入。
比如:
struct Blur{
int a;
float b;
}
uniform Blur blur;
那麼就需要向
blur.a和blur.b中一個一個賦值數據。
GLES20.glUniform1i(GLES20.glGetUniformLocation(mProgram,」blur.a」),123);
GLES20.glUniform1f(GLES20.glGetUniformLocation(mProgram,」blur.b」),123.456);
還有一件事,本以為GLSL的語法在Android和iOS上都一樣,結果,有差別:
在iOS中變數名和方法名可以共用,在android中不可以共用。否在在useProgram的時候會報invalidate_operation的錯誤。
多麼坑爹的差別啊!
關於錯誤碼,咱上網搜了很久錯誤碼都沒找到代表什麼意思。結果很SB,錯誤碼寫在了GLES20的常量中。如果你能看到源代碼,他們還被寫在了一起。
再補充一條,關於圖像載入。
原以為載入完圖像了會自動分配到sampler2D上,結果不是這樣的,需要自己給sampler2D分配編號:
fragmentShader:
uniform sampler2D pic1; uniform sampler2D pic2;
如果不分配編號的話,載入的就都是一個圖像,苦逼。
java:
int th1 = GLES20.glGetUniformLocation(mProgram, 「pic1″);
GLES20.glUniform1i(th1,0);
int th2 = GLES20.glGetUniformLocation(mProgram, 「pic2″);
GLES20.glUniform1i(th2,1);

⑺ android的BitmapShader使用問題

這個基本實現不了,個人觀點吧

⑻ android Shader.TileMode.MIRROR 什麼作用

的實力的空間地方律師快捷

⑼ android應用中怎麼使用shader製作光影閃過效果

這個,光影得放在shaderpacks這個文件。你可以按openshaderpacks那個,應該可以創建一個shaderpacks文件,然後將光影的東西丟進去,記得得把裡面的東西復制,不能夠直接整個文件夾進去,不然沒用的哦

熱點內容
c語言自考 發布:2025-05-15 07:52:42 瀏覽:501
壓縮的玉 發布:2025-05-15 07:51:22 瀏覽:790
android的控制項 發布:2025-05-15 07:50:36 瀏覽:553
南崗法院伺服器ip地址 發布:2025-05-15 07:46:02 瀏覽:288
實況如何退出賬號安卓 發布:2025-05-15 07:45:56 瀏覽:919
深入編譯器 發布:2025-05-15 07:41:35 瀏覽:879
電信手機號服務密碼怎麼查 發布:2025-05-15 07:40:10 瀏覽:613
python全局變數文件 發布:2025-05-15 07:35:06 瀏覽:955
位元組和存儲位元組 發布:2025-05-15 07:32:10 瀏覽:522
linux應用開發工程師 發布:2025-05-15 07:32:07 瀏覽:262