반응형

1.


한번 전반적인 flow를 따라 가면서 텍스처를 익혀보도록 해야겠다.



먼저 텍스처를 불러오는것부터!!

(그림에서 텍스처를 가져오는것을 목표로 함)


1)


 final int[] textureObjectIds = new int[1];

 glGenTextures(1, textureObjectIds, 0);


=> 텍스처를 생성하고! 그것의 아이디를 textureObjectIds에 넣는다.




2)

glBindTexture(GL_TEXTURE_2D,textureObjectIds[0]);


=> GL_TEXTURE_2D 속성을 가진 텍스처를 위에서 생성한 textureObjectIds와 바인딩시킨다.



3)

 //setup MipMap

 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);

 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,GL_LINEAR);

=>텍스처 확대와 축소의 방법으로 Mipmap을 사용하는데, 이를 설정하고!




4)

 texImage2D(GL_TEXTURE_2D, 0 , bitmap, 0);


=> 제일 중요해보이는데, 위에서 만든 텍스쳐에다가 bitmap데이터를 이어주기!!!!!!!!!!

    이때 bitmap데이터는 openGL이 읽을수 있도록 디코딩된 상태여야 한다.




5)

  bitmap.recycle();

  glGenerateMipmap(GL_TEXTURE_2D);



   //바인딩 해제

  glBindTexture(GL_TEXTURE_2D,0);


=> 그림데이터를 바인딩해줬으니, 더이상 필요가 없다. 그래서 recycle로 해제

     그리고 밉맵을 설정하고,  텍스쳐의 바인딩도 해제 시킨다.




여기까지가 전반적인 textureHelper의 역할이다.

다음으로는 렌더링 과정이 필요하다.

여기에서 사용한 텍스쳐도 결국에는 쉐이더와 이어지게 되어있다.

렌더링 과정에서는 이를 쉐이더에 전달하고 그 결과를 받고, 화면에 뿌리는 전반적인 작업을 한다고 보면된다.

쉐이더는 두가지로 나뉘는데, 버텍스쉐이더와 프래그먼트 쉐이더 이다.




uniform mat4 u_Matrix;

attribute vec4 a_Position;
attribute vec2 a_TextureCoordinates;

varying vec2 v_TextureCoordinates;

void main()
{
v_TextureCoordinates = a_TextureCoordinates;
gl_Position = u_Matrix * a_Position;
}


위는 버텍스 쉐이더의 모습인데, 

u_Matrix는 관점매트릭스로 해당 좌표에 관한 것을 설명할때 사용한다. (uniform 형태)

그리고 attribute가 2개인데. 한개는 버텍스데이터를 넣는것과

나머지 한개는 텍스쳐좌표를 넣는거다!


a_TextureCoordinates 속성 -> varying으로 바로 출력해서, 프래그먼트 쉐이더에서 이 버텍스 위치에다 텍스쳐를 그릴수 있게 해주는 역할을 한다.


a_Position은 뭐... 테이블좌표를 나타내는것...!!!




precision mediump float;

uniform sampler2D u_TextureUnit;
varying vec2 v_TextureCoordinates;

void main()
{
gl_FragColor = texture2D(u_TextureUnit, v_TextureCoordinates);
}

위에꺼는 프래그먼트 쉐이더의 내용이다.

varying은 버텍스쉐이더에서의 입력값이고, 텍스쳐의 위치값을 가지고 있음.

그리고 uniform으로 설정된 sampler2D가 진짜 bitmap의 데이터인데,

이를 texture2D에 넣어서. 프래그먼트를 출력을 한다.




그러면 이 쉐이더의 속성과 유니폼을 어떻게 연결시키는지 알아보자.



// Shader program

protected final int program;

protected ShaderProgram(Context context, int vertexShaderResourceId, int fragmentShaderResourceId){


//Compile the shaders and link the program.

program = ShaderHelper.buildProgram(TextResourceReader.readTextFileFromResource(

                context, vertexShaderResourceId),

                TextResourceReader.readTextFileFromResource(

                        context, fragmentShaderResourceId));

}



먼저 쉐이더를 builProgram(->만든 매서드)를 통해서 컴파일과 프로그램 링크시킨다.

이는 쉐이더 항목에서 배운것이다.

그런 다음에 uniform과 attribute 위치를 가져온다.



//Uniform constants

protected static final String U_MATRIX = "u_Matrix";

protected static final String U_TEXTURE_UNIT = "u_TextureUnit";


//Attribute constants

protected static final String A_POSITION = "a_Position";

protected static final String A_COLOR = "a_Color";

protected static final String A_TEXTURE_COORDINATES = "a_TextureCoordinates";


//Retrieve uniform locations for the shader program.

uMatrixLocation = glGetUniformLocation(program, U_MATRIX);

uTextureUnitLocation = glGetUniformLocation(program, U_TEXTURE_UNIT);


//Retrieve attribute locations for the shader program.

aPositionLocation = glGetAttribLocation(program, A_POSITION);

aTextureCoordinatesLocation = glGetAttribLocation(program, A_TEXTURE_COORDINATES);



유니폼과 속성의 위치를 가지고 오면...

이제는 거기다가 데이터를 집어넣는 일을 해야된다.


먼저 유니폼데이터부터 하고,

그다음에 속성데이터를 넣고.

그다음에 그리면 된다.



//Pass the matrix into the shader program.
glUniformMatrix4fv(uMatrixLocation, 1, false, matrix, 0);

// Set the active texture unit to texture unit 0.
//유닛0 텍스처를 활성화해라!!!
glActiveTexture(GL_TEXTURE0);

//Bind the texture to this unit.
//텍스처를 유닛과 연결!!
glBindTexture(GL_TEXTURE_2D, textureId);

//Tell the texture uniform sampler to use this texture in the shader by
//telling it to read from texture unit 0.
//sampler에 0번 유닛을 넣어라!!
glUniform1i(uTextureUnitLocation,0);



위에 정점 쉐이더에서 말하기를  uniform 데이터가 한개인데, 

그게 uMatrixLocation 이다. 

glUniformMatrix4fv 안에 matrix 데이터를 집어넣는다.


그다음부터는 프로그먼트 쉐이더의 텍스처를 입히는것과 관련된 내용이다.


glActiveTexture(GL_TEXTURE0)으로 0번 텍스처를 활성화 시키고.

이를 glBindTexture를 통해서 유닛과 연결을 시킨다.

glUniform1l을 통해서 텍스처 유닛0번을 uTextureUniLocation에 있는 텍스처에다가 넣는다는 의미이다.


그런뒤에 draw를 하게되면 해당 모습이 그려지게 된다.


public void draw(){
glDrawArrays(GL_TRIANGLE_FAN, 0 ,6);
}



텍스쳐에 대한 전반적인 흐름을 쭈욱 살펴보았다.

다시 한번 처음부터 쭈욱 따라가서 해당부분에 대한 감을 익혔으면 한다.




반응형

'CS > OpenGL' 카테고리의 다른 글

[OpenGL] 쓰레드 속도조절  (0) 2017.01.04
[OpenGL] 공부순서  (0) 2016.12.26
[OpenGL] FBO 관련 사이트  (0) 2016.12.21
[OpenGL]glReadPixels로 픽셀값을 읽어 glDrawPixels로 그리기  (0) 2016.12.21
[OpenGL] Frambe buffer object(FBO)  (1) 2016.12.20

+ Recent posts