GLES20.glUniform1f不起作用,但const不行

时间:2017-08-03 17:55:19

标签: java android

作为使用着色器的基础我已经使用过这个项目:

https://www.codeproject.com/Articles/1007973/Basic-Shader-Programming-on-Android

现在,我已经为其他人添加了另一个着色器,它只是给了我一个黑屏。我没有看到日志中的任何错误。它使用一些额外的参数(制服),例如:

uniform float scale;

public void onDrawFrame(GL10 gl)我已添加:

GLES20.glUniform1f(GLES20.glGetUniformLocation(g_hShader, "scale"), 1.0f);

嗯,它没有用。

但用以下代替:

const float scale = 1.;
着色器文件中的

使其再次工作。

这是整个着色器:

#ifdef GL_ES
    precision mediump float;
#endif

varying vec4 v_color;
varying vec2 v_TexCoordinate;
uniform sampler2D u_Texture;

//const float aspectRatio = 1.5;
//const vec2 center = vec2(0.5, 0.5);
//const float radius = 0.5;
//const float scale = 1.;

uniform float aspectRatio;
uniform vec2 center;
uniform float radius;
uniform float scale;

void main()
{
    vec2 textureCoordinateToUse = vec2(v_TexCoordinate.x, (v_TexCoordinate.y * aspectRatio + center.y - center.y * aspectRatio));
    float dist = distance(center, textureCoordinateToUse);
    textureCoordinateToUse = v_TexCoordinate;
    if (dist < radius)
    {
        textureCoordinateToUse -= center;
        float percent = 1.0 - ((radius - dist) / radius) * scale;
        percent = percent * percent;
        textureCoordinateToUse = textureCoordinateToUse * percent;
        textureCoordinateToUse += center;
    }
    gl_FragColor = texture2D(u_Texture, textureCoordinateToUse);
}

问题出在哪里?我试过了

GLES20.glUniform1f(GLES20.glGetUniformLocation(g_hShader, "scale"), 1.0f);

到onDrawFrame中的其他位置,但它没有用。据我所知,它应该是传递统一参数的正确位置。

1 个答案:

答案 0 :(得分:0)

我很确定错误在于当前没有使用程序对象。

如果要切换着色器,则必须在每次进行统一呼叫之前调用glUseProgram(g_hShader)

毫无疑问,你没有看到任何东西,在这种情况下,scale设置为0.0。您应该检查glGetUniformLocation的结果。如果它返回-1,则表示存在问题。

编辑:

看到代码后:

这是一个问题。黑色是由纹理单元未绑定的事实引起的。两个值都是texHandle

GLES20.glActiveTexture(GLES20.GL_TEXTURE0)        
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, texHandle);        
GLES20.glUniform1i(texHandle, 0);

可能会有更多问题,但检查更多代码将不符合此网站的格式。希望我能提供帮助。