2017-02-06 5 views
0

私はAndroid OpenGL ESビューで6列あります。ユーザが画面にタッチすると、ある色が特定の色で発光する。最初は、すべての列が同じグロー色を使用していましたが、触れたときに各列に一意のグロー色を付けるコードを作成しようとしています。Android OpenGL ES 2.0:同じフラグメントシェイダーを持つオブジェクトのユニークな色を設定する

私が気付いているバグは、glUniformを設定するための呼び出しが最初に設定された後に1つの色に固執しているかのように、各列のグローが同じ色であるということです。 のswitch文で指定された最後の色setUniforms()は、6つの列すべてがタッチされたときに使用される色です。代わりに、各列の色が異なる必要があります。

私のフラグメントシェイダーには、すべての列が正しく使用されないというバグがありますケース5のmGlowColorHandleの値はありますか?私のsetUniformsメソッドで代わりにバグですか?

OpenGL_GLRenderer.java

public class OpenGL_GLRenderer implements GLSurfaceView.Renderer { 

    @Override 
    public void onDrawFrame(GL10 glUnused) { 
     GLES20.glUseProgram(neckProgramHandle); 
     setUniforms(neckProgramHandle); 
     ... 
    } 

    private void setUniforms(int programHandle) 
    { 
     mGlowColorHandle = GLES20.glGetUniformLocation(programHandle, "stringGlowColor");   //column glow color 

     //************************String Glow code******************************* 
     //if user's touching the screen, make nearest string glow 
     for (int i = 0; i< 6; i++) { 
      if (stringGlowEffects[i] != null) { 
       float top = orthoTop + (orthoBottom-orthoTop)*stringGlowEffects[i].y + scroller.getCurrentValue(); 
       GLES20.glUniform2f(mGlowPosHandles[i], stringGlowEffects[i].x, top); 
       float aRandomFloat = (float) (Math.random() * 100);  //generate random number from 0-99 
       float glowEffectScale = 1.0f + (aRandomFloat - 50.0f)/300.0f; 
       GLES20.glUniform1f(mGlowScaleHandles[i], glowEffectScale);  //ERROR HERE: case 5's color is displayed for every column 
       switch (i){ 
        case 0: 
         GLES20.glUniform4f(mGlowColorHandle,.0f, .0f, 1.0f, 1.0f); 
        case 1: 
         GLES20.glUniform4f(mGlowColorHandle,.0f, 1.0f, .0f, 1.0f); 
        case 2: 
         GLES20.glUniform4f(mGlowColorHandle,1.0f, .0f, .0f, 1.0f); 
        case 3: 
         GLES20.glUniform4f(mGlowColorHandle,.0f, 1.0f, 1.0f, 1.0f); 
        case 4: 
         GLES20.glUniform4f(mGlowColorHandle,1.0f, 1.0f, .0f, 1.0f); 
        case 5: 
         GLES20.glUniform4f(mGlowColorHandle,1.0f, .0f, 1.0f, 1.0f); 
       } 
      } 
      else{ 
       GLES20.glUniform1f(mGlowScaleHandles[i], 0.0f); 
      } 
     } 
    } 
} 

fragment_shader_neck.glsl

uniform sampler2D u_Texture;    // The input texture. 
varying vec2 v_TexCoordinate; // Interpolated texture coordinate per fragment. 
uniform vec4 stringGlowColor;   // color of the string (column) 

// The entry point for our fragment shader. 
void main(){ 
    ... 
    lowp vec4 fromTexture = texture2D(u_Texture, v_TexCoordinate); 
    gl_FragColor = fromTexture + stringGlowColor*effectScale; 
} 

答えて

1

あなたのswitch文のGLES20.glUniform4fへの各呼び出しの後break文を必要とします。プログラムがswitchステートメントを入力すると、適切なcaseラベルにジャンプし、別のcaseラベルを超えても、breakステートメントまたはswitchの最後に当たるまで続きます。これは便利なこともありますが、ほとんどの場合、人々を混乱させるだけです。

+0

ああ、簡単な間違い。ありがとう! – Cody

関連する問題