簡體   English   中英

Android OpenGL ES 2.0:為具有相同片段着色器的對象設置唯一的顏色

[英]Android OpenGL ES 2.0: Setting Unique Colors for Objects with same Fragment Shader

我在Android OpenGL ES視圖中有6列。 當用戶觸摸屏幕時,列會發出某種顏色。 最初,所有列都使用相同的發光顏色,但是我試圖編寫代碼以使每列在觸摸時都具有唯一的發光顏色。

我注意到的錯誤是,每列輝光仍然是相同的顏色,好像我設置glUniform的調用在第一次設置后卡在一種顏色上一樣。 我在setUniforms()中的switch語句中指定的最后一種顏色是所有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; 
}

switch語句中每次調用GLES20.glUniform4f之后,都需要一個break語句。 當您的程序輸入switch語句時,它會跳到適當的case標簽,並繼續運行,直到遇到break語句或switch的結尾為止,即使這使它超過了另一個case標簽。 有時這很有用,但大多數情況下只會使人感到困惑。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM