редактировать: как было предложено, я пытаюсь установить «начальное» значение для своих шейдеров в своем конструкторе, я включил некоторый код и был бы признателен, если бы кто-нибудь мог объяснить, почему я получаю пустой экран. если я передам значения через свой конструктор - спасибо
Способ загрузки моей текстуры
public void setTexture(GLSurfaceView view, Bitmap imgTexture) {
this.imgTexture=imgTexture;
iProgId = Utils.LoadProgram(strVShader, strFShader);
iBaseMap = GLES20.glGetUniformLocation(iProgId, "u_baseMap");
iPosition = GLES20.glGetAttribLocation(iProgId, "a_position");
iTexCoords = GLES20.glGetAttribLocation(iProgId, "a_texCoords");
texID = Utils.LoadTexture(view, imgTexture);
//Everything is working if I include the lines as part of my setTexture() method
GLES20.glUseProgram(iProgId);
mOpacityHandle = GLES20.glGetUniformLocation(iProgId, "opValue");
GLES20.glUniform1f(mOpacityHandle, 1.0f);
}
но если я помещу их в свой конструктор, ничего....
public Quad() {
//iProgId = Utils.LoadProgram(strVShader, strFShader); //I've tried with and without this line - I can confirm that loading / linking is working OK
GLES20.glUseProgram(iProgId);
mOpacityHandle = GLES20.glGetUniformLocation(iProgId, "opValue");
GLES20.glUniform1f(mOpacityHandle, 1.0f);
}
На самом деле я скопировал всю свою процедуру загрузки текстуры в свой конструктор и передал ей соответствующие параметры при создании своих четырехугольников, но я все еще ничего не делаю, если не устанавливаю значение через некоторое время после запуска конструктора!
У меня есть фрагментный шейдер, как показано ниже:
String strFShader =
"precision mediump float;" +
"uniform float opValue;"+
"varying vec2 v_texCoords;" +
"uniform sampler2D u_baseMap;" +
"void main()" +
"{" +
"gl_FragColor = texture2D(u_baseMap, v_texCoords);" +
"gl_FragColor *= opValue;"+
"}";
И когда я создаю свои объекты (квадраты), у меня есть метод, в котором я могу установить непрозрачность указанного четырехугольника следующим образом:
public void setOpacity(float op) {
GLES20.glUseProgram(iProgId);
mOpacityHandle = GLES20.glGetUniformLocation(iProgId, "opValue");
GLES20.glUniform1f(mOpacityHandle, op);
}
Однако я хочу запускать свой метод setOpacity только в том случае, если я хочу, чтобы мой спрайт (квадрат) имел некоторый уровень прозрачности. Если я не укажу уровень непрозрачности (т.е. если я не запускаю метод setOpacity), я бы хотел, чтобы он использовал значение по умолчанию или «начальное» значение (которое, очевидно, я хотел бы иметь с плавающей запятой 1,0).
Это вообще возможно?