我的一個新着色器出現問題。OpenGL ES 2.0 NVIDIA TEGRA 2展開
當我在不同的設備上嘗試着色器時,着色器編譯並順利運行。
當我嘗試它的的NVIDIA Tegra 2的GPU,運行本地代碼,我得到以下編譯錯誤:
着色器無法編譯。頂點着色器 (0):錯誤C6002:超過指令限制256; 532條指令需要編譯程序 86行,1個錯誤。
我認爲這是由於NVIDIA的gcg編譯器執行某種類型的展開,但我無法弄清楚如何解決這種情況。
現在,我試圖減少if/else語句的類型,而不是if/else,而是一連串簡單的連續ifs(只是爲了查看問題是否已解決),但它不起作用。
我試圖刪除所有的條件,只留下一個和着色器編譯良好(儘管它沒有做我真正需要的)。
這是我的頂點着色器的代碼,片段着色器只包含gl_color信息並編譯良好。
void main(){
//Converto direttamente in int, cosi le divisioni dopo sono piu veloci
int_character_position = int(character_position);
uniform_reference = (int_character_position/4);
uniform_reference_sub_item = int(mod(character_position,4.0));
if(uniform_reference == 0) {
working_float = charsequence_1[uniform_reference][uniform_reference_sub_item];
} else if(uniform_reference == 1) {
working_float = charsequence_1[uniform_reference][uniform_reference_sub_item];
} else if(uniform_reference == 2) {
working_float = charsequence_1[uniform_reference][uniform_reference_sub_item];
} else if(uniform_reference == 3) {
working_float = charsequence_1[uniform_reference][uniform_reference_sub_item];
} else if(uniform_reference == 4) {
working_float = charsequence_2[uniform_reference - 4][uniform_reference_sub_item];
} else if(uniform_reference == 5) {
working_float = charsequence_2[uniform_reference - 4][uniform_reference_sub_item];
} else if(uniform_reference == 6) {
working_float = charsequence_2[uniform_reference - 4][uniform_reference_sub_item];
} else if(uniform_reference == 7) {
working_float = charsequence_2[uniform_reference - 4][uniform_reference_sub_item];
} else if(uniform_reference == 8) {
working_float = charsequence_3[uniform_reference - 8][uniform_reference_sub_item];
} else if(uniform_reference == 9) {
working_float = charsequence_3[uniform_reference - 8][uniform_reference_sub_item];
} else if(uniform_reference == 10) {
working_float = charsequence_3[uniform_reference - 8][uniform_reference_sub_item];
} else if(uniform_reference == 11) {
working_float = charsequence_3[uniform_reference - 8][uniform_reference_sub_item];
} else if(uniform_reference == 12) {
working_float = charsequence_4[uniform_reference -12][uniform_reference_sub_item];
} else if(uniform_reference == 13) {
working_float = charsequence_4[uniform_reference -12][uniform_reference_sub_item];
} else if(uniform_reference == 14) {
working_float = charsequence_4[uniform_reference -12][uniform_reference_sub_item];
} else if(uniform_reference == 15) {
working_float = charsequence_4[uniform_reference -12][uniform_reference_sub_item];
} else if(uniform_reference == 16) {
working_float = charsequence_5[uniform_reference -16][uniform_reference_sub_item];
} else if(uniform_reference == 17) {
working_float = charsequence_5[uniform_reference -16][uniform_reference_sub_item];
} else if(uniform_reference == 18) {
working_float = charsequence_5[uniform_reference -16][uniform_reference_sub_item];
} else if(uniform_reference == 19) {
working_float = charsequence_5[uniform_reference -16][uniform_reference_sub_item];
} else if(uniform_reference == 20) {
working_float = charsequence_6[uniform_reference -20][uniform_reference_sub_item];
} else if(uniform_reference == 21) {
working_float = charsequence_6[uniform_reference -20][uniform_reference_sub_item];
} else if(uniform_reference == 22) {
working_float = charsequence_6[uniform_reference -20][uniform_reference_sub_item];
} else if(uniform_reference == 23) {
working_float = charsequence_6[uniform_reference -20][uniform_reference_sub_item];
}
v_texCoord.y = a_texture.y;
v_texCoord.x = a_texture.x + (0.0105 * float(working_float));
gl_Position = myMVPMatrix * myVertex;
非常感謝。在我發佈了我的請求之後,我已經相應地修改了我的if語句,並且我正在此處針對該問題的解決方案更新社區。 無論如何,您的回答非常好。非常感謝你的協助。着色器代碼是一個相當原型,最終它遠比實際要求的要複雜得多:) 非常感謝。 – 2012-01-09 20:57:06