私は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;
}
ああ、簡単な間違い。ありがとう! – Cody