일단 사각형에 텍스쳐를 입히는 것을 테스트하고 있는데요.
기본적으로 터치 입력을 받아서 Y축을 기준으로 회전을 하도록 만들었습니다.
이게 색상만 출력할 때는 잘 돌아가는데,
텍스쳐를 입히면 제대로 돌아가질 않네요...
회전은 하는데 스마트폰 액정 중심을 기준으로 좌우 끝으로 넓게 회전을 합니다.
그리고 그림이 중심부에 도달했을 때는 반토막 나네요.
private final static String vertexShaderCode_texture =
// This matrix member variable provides a hook to manipulate
// the coordinates of the objects that use this vertex shader
"uniform mat4 uMVPMatrix;" +
"attribute vec4 vPosition;" +
"attribute vec2 texCoord;" +
"varying vec2 texCoordOut;" +
"void main() {" +
" texCoordOut = texCoord; \n" +
" gl_Position = uMVPMatrix * vPosition; \n" +
"}";
private final static String fragmentShaderCode_texture =
"precision mediump float;" +
"varying vec2 texCoordOut;" +
"uniform sampler2D u_texture;" +
"void main() {" +
" vec4 texColor = texture2D(u_texture, texCoordOut);\n" +
" gl_FragColor = texColor;" +
"}";
일단 텍스쳐 입힐때 사용하는 Shader는 위와 같이 정의하였습니다.
protected float[] texture = {
//x, y, z(depth)
0.0f, 1.0f, 0.0f,
0.0f, 0.0f, 0.0f,
1.0f, 0.0f, 0.0f,
1.0f, 1.0f, 0.0f,
};
텍스쳐 Coord는 다음과 같이 정의하였구요. (웹에서 본 예제들은 x, y좌표만을 갖던데, 그렇게 해서는 안 돌아가더라구요)
public void attach_Shader_Texture(int mProgram, FloatBuffer textureBuffer){
if(Texture){
mTexHandle = GLES20.glGetUniformLocation(mProgram, "u_texture");
GraphicRenderer.checkGlError("glGetUniformLocation");
mTexCoord_Handle = GLES20.glGetAttribLocation(mProgram, "texCoord");
GraphicRenderer.checkGlError("glGetAttribLocation");
if(textureBuffer == null){
Log.d("textureBuffer is............","null!!!!!");
}
GLES20.glVertexAttribPointer(mTexCoord_Handle,
TEX_COORDS_PER_VERTEX, GLES20.GL_FLOAT, false, vertex_Stribe, textureBuffer);
//glVertexAttribPointer(texture, 2, GL_FLOAT, GL_FALSE, stride, offset);
// Set the active texture unit to texture unit 0.
GLES20.glEnableVertexAttribArray(mTexCoord_Handle);
GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mTextureData_Handle);
//if Texture
GLES20.glUniform1i(mTexHandle, 0);
}
}
해당 부분은 draw() 메소드에서 텍스쳐와 관련된 부분 입니다.