2011-07-23 76 views
3

在Android設備上獲取驗證我着色器的奇怪錯誤。 (這是一個運行Android 3.1的華碩eee Pad)Android:紋理的gl狀態與着色器不匹配

Texture's gl states do not match with shader's

任何人都知道如何解決這個錯誤?

這裏是代碼生成錯誤:

GLES20.glValidateProgram(id); 
GLES20.glGetProgramiv(id, GLES20.GL_VALIDATE_STATUS, ShaderStatus, 0); 

if (ShaderStatus[0] != GLES20.GL_TRUE) { 
    String glerror = GLES20.glGetProgramInfoLog(id); 
    throw new Error("ERROR TIME! failed to validate GLSL program"); 
} 

這裏是頂點着色器:

#ifdef GL_ES 
precision highp float; 
#endif 

attribute vec3 Position; 
attribute vec2 TexCoord; 

uniform mat4 Projection; 
uniform vec3 Location; 
uniform float Angle; 
uniform vec3 Scale; 
uniform sampler2D Texture; 

varying vec2 vTexCoord; 

void main(void) { 
    mat3 RotationMatrix = mat3(cos(-Angle), -sin(-Angle), 0.0, 
           sin(-Angle), cos(-Angle), 0.0, 
           0.0,   0.0,    1.0); 

    gl_Position = Projection * vec4(RotationMatrix * (Position*Scale) + Location, 1.0); 
    //vColor = vec4(1.0, 1.0, 1.0, 1.0); 
    vTexCoord = TexCoord; 
} 

這裏是片段着色器:

#ifdef GL_ES 
precision highp float; 
#endif 

uniform sampler2D Texture; 
varying vec2 vTexCoord; 
uniform vec4 Color; 

void main(void) { 
    vec4 color = texture2D(Texture, vTexCoord) * Color; 
    gl_FragColor = color; 
} 
+0

我也得到了這個與Android演示代碼,所以我認爲這是我可以忽略的東西。果然,在註釋掉代碼(以及其他一些強烈的調試)之後,它很有效。 – leech

+0

這是什麼紋理格式? Tegra可能需要着色器中的#pragma來通知編譯器該紋理不是標準的8位格式。混合也是一樣。 NVIDIA在那裏的標準並不嚴格。 –

+0

我把大部分內容留給圖書館,所以我希望這個答案是你要找的:RGBA,我認爲每個頻道都是8bit。我會檢查一下,看看我的假設是否正確。 – leech

回答

0

我的Tegra3裝置將失敗glValidateProgram()。 像上面評論中提到的'豬'一樣,沒有被綁定的紋理會導致這種情況。

所以我只調用glValidateProgram()後,紋理已經創建了glActiveTexture()和glBindTexture()固定我的驗證錯誤。

我的設備與馬裏GPU從未有過這個問題,所以它可能只是一個Tegra的東西。