2012-07-31 35 views
1

林做一個遊戲在安卓但顏色太亮了,我不能改變的精靈,所以我決定執行着色器:開放GLES 2着色性能

const char* fETCShader = "\ 
uniform mediump sampler2D sTexture 
uniform mediump sampler2D sTexture_alpha 
\ 
varying mediump vec4 vColor 
varying mediump vec2 vTexCoord 
uniform lowp mat4 cCorrection 
\ 
void main()\ 
{\ 
    lowp vec4 color = vec4(texture2D(sTexture, vTexCoord).rgb, texture2D(sTexture_alpha, vTexCoord).r) * vColor 
    gl_FragColor = cCorrection * color 
}" 

但FPS顯着下降(如20)

沒有人知道是否存在一個較便宜的操作來做到這一點。

謝謝。

回答

1

而不是分別使用3個和1個通道的2個紋理,只需製作一個4通道RGBA紋理,以便您只需執行1次紋理拾取。

手機上的片段着色器很快就成爲瓶頸。總是儘量減少碎片着色器必須完成的工作量。

你的着色器將是這個樣子:

const char* fETCShader = "\ 
uniform mediump sampler2D sTexture 
uniform mediump sampler2D sTexture_alpha 
\ 
varying mediump vec4 vColor 
varying mediump vec2 vTexCoord 
uniform lowp mat4 cCorrection 
\ 
void main()\ 
{\ 
    gl_FragColor = cCorrection * texture2D(sTexture, vTexCoord) * vColor; 
}" 
+0

我們使用的是ETC紋理格式,這種格式只支持RGB通道,所以我們認爲我們需要額外的紋理來保存Alpha通道並創建矢量RGBA,如着色器所示。 – elios264 2012-07-31 21:03:18

+0

ETC2支持RGBA,看看你能否得到這個工作。否則,你可以嘗試一些技巧,比如alpha值的頂點屬性,或者不要使用ETC壓縮。如果你的內存擁擠,請在需要使用時降低紋理或流紋理的大小。 – 2012-07-31 22:09:38

+0

你好!你能詳細闡述一下「alpha值的頂點屬性」嗎?這是否意味着在頂點着色器中使用sampler2D,並以某種方式將結果寫入變化中以稍後在片段着色器中使用? – dimsuz 2013-01-27 15:29:16

0

你能不能改變精靈只出現一次,會第一次加載時,再使用你之前用什麼機制?否則,至少將兩個紋理合併成一個。