作为使用着色器的基础我已经使用过这个项目:
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中的其他位置,但它没有用。据我所知,它应该是传递统一参数的正确位置。
答案 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);
可能会有更多问题,但检查更多代码将不符合此网站的格式。希望我能提供帮助。