2011-01-10 90 views
0

這是我的第一篇文章,我是最近纔開始編程爲Android和OpenGL,所以對我很好:)數組索引

我正在寫一個小應用程序,其中將包括一個屏幕這將使用一個palettised圖像來快速改變顏色。對於速度,我認爲我可以使用着色器來實現系統,所以我使用Open GL ES 2.0編程指南中的精彩示例啓動並運行着色器。過去幾天我一直在抨擊我的問題是在着色器中引用我的調色板數據。

我着色器目前是:

precision lowp float; 
varying vec2  v_texCoord; 
uniform sampler2D s_texture; 
uniform int  s_palette[204]; // Specify a palette of 64 rgb entries 

void main() 
{ 
    vec4 col = texture2D(s_texture, v_texCoord); 
    int index = (int(col.r * 255.0) * 3; 

    gl_FragColor = vec4(float(s_palette[index])/255.0, float(s_palette[index+1])/255.0, float(s_palette[index+2])/255.0, 1.0); 
} 

玩這個行之有年,並沒有得到後,很遠我發現,如果我用一個恆定值引用我的調色板數據,我可以通過引用得到結果,但不與一個變量。在Google上搜索了一段時間之後,我發現這只是GLSL 1.1的方式,並且已經用GLSL 1.3修復了。我相信Android正在基於GLSL 1.3的GLSL ES1.0上運行,所以它應該可以工作,但是我不能讓我的生活得到它的工作。我在GLSLES規範中找不到任何暗示它不可能的東西,所以我錯在哪裏?

如果根本不可能,那麼有沒有人有任何其他想法如何解決這個在我的計劃中相當嚴重的缺陷?

回答

0

不,常量數組無法通過變量進行索引,但可以使用紋理而不是常量數據數組輕鬆地進行調色板查找。使用Nx1 2D紋理,並在GLSL中使用texture2D進行查找。

當然,您需要使用OpenGL中的常規紋理函數從CPU端加載紋理數據。

+0

非常感謝。像魅力一樣工作。 :) – Teknogrebo 2011-01-12 14:48:07