![](/img/trans.png)
[英]Java Android OpenGL ES 2.0 - fragment shader texture2D does not work
[英]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.