GLSurfaceView 内のフラグメント シェーダー内のコントロールの変数として使用したいメイン アクティビティにシークバーがあります。
アクティビティとGLSurfaceViewビュー内のglGetUniformLocationの間でシークバーの値/変数を共有するための最良の方法は何ですか.
単純なフラグメント シェーダー:
precision mediump float;
uniform sampler2D u_Texture0;
varying vec2 v_TexCoordinate;
uniform float myOffsetVariable;
void main()
{
vec4 baseColor;
baseColor = texture2D(u_Texture0, v_TexCoordinate);
vec4 offsetColor = baselcolor * myOffsetVariable;
gl_FragColor = vec4(offsetColor,1.0);
}
主な活動:
public class GLActivity extends Activity {
GLSurfaceView mView;
private float mOffset = 0.0f;
private SeekBar mOffsetSeekBar;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.main);
mView = (GLSurfaceView)findViewById(R.id.glview);
mView.setEGLConfigChooser(8, 8, 8, 8, 16, 0);
mView.setZOrderOnTop(true);
mView.setEGLContextClientVersion(2);
mView.setRenderer(new GLLayer(this));
mOffsetSeekBar = (SeekBar)findViewById(R.id.inOffset);
final TextView OffsetSeekBarValue = (TextView)findViewById(R.id.OffsetSeekBarValue);
mOffsetSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener(){
@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
// TODO Auto-generated method stub
OffsetSeekBarValue.setText(String.valueOf(progress));
mOffset= (float)progress;
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub
}
});
mOffsetSeekBar.setProgress(50);
}
}
.......
GLSurfaceView クラス
public class GLLayer implements GLSurfaceView.Renderer {
private float mOffset = (float) 0.0;
....
@Override
public void onDrawFrame(GL10 glUnused ) {
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);
final String vertexShader = getVertexShader();
final String fragmentShader = getFragmentShader();
final int vertexShaderHandle = ShaderHelper.compileShader(
GLES20.GL_VERTEX_SHADER, vertexShader);
final int fragmentShaderHandle = ShaderHelper.compileShader(
GLES20.GL_FRAGMENT_SHADER, fragmentShader);
mProgramHandle = ShaderHelper.createAndLinkProgram(vertexShaderHandle,
fragmentShaderHandle, new String[] { "a_Position",
"a_TexCoordinate" });
// Set our per-vertex lighting program.
GLES20.glUseProgram(mProgramHandle);
// capture values from seek bar variables SOP & Sat
// TODO Auto-generated method stub
int mOffsetVariable = GLES20.glGetUniformLocation( mProgramHandle, "myOffsetVariable" );
GLES20.glUniform1f(mOffsetVariable, mOffset);
// Set program handles for cube drawing.
mMVPMatrixHandle = GLES20.glGetUniformLocation(mProgramHandle,
"u_MVPMatrix");
mTextureUniformHandle0 = GLES20.glGetUniformLocation(mProgramHandle,
"u_Texture0");
mTextureUniformHandle1 = GLES20.glGetUniformLocation(mProgramHandle,
"u_Texture1");
mPositionHandle = GLES20.glGetAttribLocation(mProgramHandle,
"a_Position");
mTextureCoordinateHandle = GLES20.glGetAttribLocation(mProgramHandle,
"a_TexCoordinate");
/**
* First texture map
*/
// Set the active texture0 unit to texture unit 0.
GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
// Bind the texture to this unit.
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mTextureDataHandle0);
// Tell the texture uniform sampler to use this texture in the shader by
// binding to texture unit 0.
GLES20.glUniform1i(mTextureUniformHandle0, 0);
/**
* Second texture map
*/
// Set the active texture1 unit to texture unit 1.
GLES20.glActiveTexture(GLES20.GL_TEXTURE1);
// Bind the texture to this unit.
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mTextureDataHandle1);
// Tell the texture uniform sampler to use this texture in the shader by
// binding to texture unit 1.
GLES20.glUniform1i(mTextureUniformHandle1, 1);
// Draw some cubes.
Matrix.setIdentityM(mModelMatrix, 0);
Matrix.translateM(mModelMatrix, 0, 0.0f, 0.0f, -3.2f);
Matrix.rotateM(mModelMatrix, 0, 0.0f, 1.0f, 1.0f, 0.0f);
drawCube();
} ......
ありがとう、さらに情報を提供する必要がある場合はお知らせください。あ