마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

openGL es 2.0 텍스쳐 관련한 질문 입니다.

0 추천

일단 사각형에 텍스쳐를 입히는 것을 테스트하고 있는데요.

기본적으로 터치 입력을 받아서 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() 메소드에서 텍스쳐와 관련된 부분 입니다.

rhaps20 (6,010 포인트) 님이 2013년 7월 8일 질문

답변 달기

· 글에 소스 코드 보기 좋게 넣는 법
· 질문에 대해 추가적인 질문이나 의견이 있으면 답변이 아니라 댓글로 달아주시기 바랍니다.
표시할 이름 (옵션):
개인정보: 당신의 이메일은 이 알림을 보내는데만 사용됩니다.
스팸 차단 검사:
스팸 검사를 다시 받지 않으려면 로그인하거나 혹은 가입 하세요.
...