我有一个位图,想在应用了着色器的GLSurfaceView上进行渲染。 我是OpenGL(ES)的新手,所以我只是从教程中复制了一些代码片段。但是它们在不同的OpenGLES版本上。有人可以解释一下我如何将这段代码从GLES10转换为GLES20吗?
private int[] textures;
public Bitmap textureData;
private static final float[] VERTEX_COORDINATES = new float[] {
-1.0f, +1.0f, 0.0f,
+1.0f, +1.0f, 0.0f,
-1.0f, -1.0f, 0.0f,
+1.0f, -1.0f, 0.0f
};
private static final float[] TEXTURE_COORDINATES = new float[] {
0.0f, 0.0f,
1.0f, 0.0f,
0.0f, 1.0f,
1.0f, 1.0f
};
private static final Buffer TEXCOORD_BUFFER = ByteBuffer.allocateDirect(TEXTURE_COORDINATES.length * 4)
.order(ByteOrder.nativeOrder()).asFloatBuffer().put(TEXTURE_COORDINATES).rewind();
private static final Buffer VERTEX_BUFFER = ByteBuffer.allocateDirect(VERTEX_COORDINATES.length * 4)
.order(ByteOrder.nativeOrder()).asFloatBuffer().put(VERTEX_COORDINATES).rewind();
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
textures = new int[1];
gl.glEnable(GL10.GL_TEXTURE_2D);
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
gl.glGenTextures(1, textures, 0);
gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S, GL10.GL_CLAMP_TO_EDGE);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, GL10.GL_CLAMP_TO_EDGE);
//--------------------------Shader-------------------------
// Create the shaders
//int vertexShader = ShaderSetup.loadShader(GLES20.GL_VERTEX_SHADER, ShaderSetup.vertexShaderCode);
int fragmentShader = ShaderSetup.loadShader(GLES20.GL_FRAGMENT_SHADER, ShaderSetup.fragmentShaderCode);
ShaderSetup.shader = GLES20.glCreateProgram(); // create empty OpenGL ES Program
// GLES20.glAttachShader(ShaderSetup.shader, vertexShader); // add the vertex shader to program
GLES20.glAttachShader(ShaderSetup.shader, fragmentShader); // add the fragment shader to program
GLES20.glLinkProgram(ShaderSetup.shader); // creates OpenGL ES program executables
// Set our shader programm
GLES20.glUseProgram(ShaderSetup.shader);
}
@Override
public void onDrawFrame(GL10 gl) {
if(textureData!=null) {
GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, textureData, 0);
}
gl.glActiveTexture(GL10.GL_TEXTURE0);
gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]);
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, VERTEX_BUFFER);
gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, TEXCOORD_BUFFER);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);
}
如果有人想知道为什么我要使用位图并在每次绘制时更改纹理:位图是来自cameraSDK的预览(目前我将输出byte []转换为位图,因为我不知道如何加载byte []作为纹理)。 提前非常感谢您的帮助。