2012-01-06 2 views
2

1 조각 쉐이더에서 2 개의 텍스처에 액세스하려고합니다. 이를 위해 Android OpenGL-ES 2.0 조각 쉐이더에서 사용할 수있는 텍스처를 어떻게 설정해야합니까?

은 내가 다음 코드를 사용하여 설정이 질감이 있습니다

glEnableClientState(GL_VERTEX_ARRAY); 
glEnableClientState(GL_TEXTURE_COORD_ARRAY); 

glVertexPointer(2, GL_FLOAT, 0, vbuff); 
glTexCoordPointer(2, GL_FLOAT, 0, tbuff); 

glActiveTextureARB(GL_TEXTURE0_ARB); 
glBindTexture(GL_TEXTURE_2D, texture0); 
glEnable(GL_TEXTURE_2D); 

glActiveTextureARB(GL_TEXTURE1_ARB); 
glBindTexture(GL_TEXTURE_2D, texture1); 
glEnable(GL_TEXTURE_2D); 

을 그리고 조각 쉐이더 다음과 같이 그들을 결합하려고하면 어떻게 든이 작동하지 않습니다

uniform sampler2D tex0; 
uniform sampler2D tex1; 
void main() 
{ 
    vec4 texval1 = texture2D(tex0, TextureCoordOut); 
    vec4 texval2 = texture2D(tex1, TextureCoordOut); 
    gl_FragColor = 0.5*(texval1 + texval2) 
} 

을 두 번째 텍스처 만 표시합니다.

추신 : 저는 Windows7에서 쉐이더를 개발하고 있지만 Android 디바이스에서는 C++ 코드와 쉐이더를 Android NDK와 함께 사용하려고합니다.

편집 : 나는 그것이 작동했고, 다른 사람들이 혜택을 누릴 수 있도록 나는 여기에 코드를 게시 :

버텍스 쉐이더

varying vec2 TextureCoordOut; 
void main() 
{ 
    gl_Position = ftransform(); 
    TextureCoordOut = vec2(gl_MultiTexCoord0); 
} 

조각 쉐이더

varying mediump vec2 TextureCoordOut; 
uniform sampler2D tex0; 
uniform sampler2D tex1; 
void main() 
{ 
    gl_FragColor = texture2D(tex0, TextureCoordOut) * texture2D(tex1, TextureCoordOut); 
} 

하는 렌더링

glEnableClientState(GL_VERTEX_ARRAY); 
glEnableClientState(GL_TEXTURE_COORD_ARRAY); 

glVertexPointer(2, GL_FLOAT, 0, vbuff); //2 dimensional vertex buffer 
glTexCoordPointer(2, GL_FLOAT, 0, tbuff); // 2 dimensional textures 
glColor4f(1, 1, 1, 1); 

glActiveTexture(GL_TEXTURE0);  glBindTexture(GL_TEXTURE_2D, mapid1); 
glActiveTexture(GL_TEXTURE1);  glBindTexture(GL_TEXTURE_2D, mapid2); 

glUseProgram(shader); 

glUniform1i(glGetUniformLocation(gfx.prog, "tex0"), 0); //GL_TEXTURE0 
glUniform1i(glGetUniformLocation(gfx.prog, "tex1"), 1); //GL_TEXTURE1 

render.... 

glDisableClientState(GL_VERTEX_ARRAY); 
glDisableClientState(GL_TEXTURE_COORD_ARRAY); 

답변

7

이러한 텍스처를 각 단위에 바인딩하는 것만으로는 충분하지 않습니다. 또한 셰이더에게 텍스처를 가져올 곳을 알려주려면 sampler2D 유니폼이 있어야합니다. 이것은 사용할 텍스처 유닛에 대응하는 정수 균일 한 값을 설정하면됩니다 : 물론

//get uniform locations (either init code or render code) 
int locTex0 = glGetUniformLocation(program, "tex0"); 
int locTex1 = glGetUniformLocation(program, "tex1"); 

...  

//bind textures to texture units 
glActiveTexture(GL_TEXTURE1); 
glBindTexture(GL_TEXTURE_2D, texture1); 
glActiveTexture(GL_TEXTURE0); 
glBindTexture(GL_TEXTURE_2D, texture0); 

//bind program and specify texture units for each sampler2D uniform 
glUseProgram(program); 
glUniform1i(locTex0, 0); //use texture bound to GL_TEXTURE0 
glUniform1i(locTex1, 1); //use texture bound to GL_TEXTURE1 

... 
draw 

이것은 당신이 쉐이더를 사용하고 균일 한 값을 지정하는 방법을 알고 있다고 가정합니다.

일부 추가 발언 :

  • 이 텍스처를 사용하거나하지 않을 경우 쉐이더 자체를 결정하기 때문에 당신이 glEnable(GL_TEXTURE_2D)를 호출 할 필요는 없습니다 프레 그먼트 쉐이더를 사용하여.
  • GL 1.2 또는 1.3 (~ 15 년) 이후로 핵심 인 멀티 텍스쳐링과 같은 기존의 기존 작업에는 해당 기능 및 상수의 ARB 버전을 사용하지 마십시오.
  • 기존 내장 속성 (예 : glVertexPointer 또는 glTexCoordPointer)에 대해 알지 못하는 OpenGL ES 2.0에 대해 1 대 1로 이식 가능한 코드는 기대하지 말고 다른 질문입니다.
+0

감사합니다. 정말 도움이되었습니다. – HardCoder