OpenGL ES 1.x смешивает две текстуры в соответствии с растровым изображением в основной памяти - PullRequest
0 голосов
/ 26 января 2011

У меня есть две текстуры (1024x1024, полностью MipMapped, обе PVRTC-4bitsPerPixel сжатые).Текстуры наносятся на трехмерную сетку.

На ЦП я обновляю логический массив 512x512.

Теперь я хочу смешать текстуру 2 с текстурой 1 по отношению к этому логическому массиву (true означает, что соответствующие 4 пикселя texture1 видимы, false означает, что другая текстура видна в этом месте)

На моем оборудовании доступны две текстурные единицы.

Как это сделать?

1 Ответ

0 голосов
/ 04 марта 2011

Вы можете использовать определенный шейдер для этого. Если у вас есть tex1, tex2 и texbool:

# set your textures
glActiveTexture(GL_TEXTURE0)
glBindTexture(GL_TEXTURE_2D, tex1)
glActiveTexture(GL_TEXTURE0+1)
glBindTexture(GL_TEXTURE_2D, tex2)
glActiveTexture(GL_TEXTURE0+2)
glBindTexture(GL_TEXTURE_2D, texbool)

# when you're starting your shader (id is 1 for eg)
glUseProgram(1)
glUniformi(glGetUniformLocation(1, "tex1"), 0)
glUniformi(glGetUniformLocation(1, "tex2"), 1)
glUniformi(glGetUniformLocation(1, "texbool"), 2)

# and now, draw your model as you wish

Фрагмент шейдера может быть что-то вроде:

// i assume that you'll pass tex coords too. Since the tex1 and tex2
// look the same size, i'll assume that for now.
varying vec2 tex1_coords;

// get the binded texture
uniform sample2D tex1;
uniform sample2D tex2;
uniform sample2D texbool;

// draw !
void main(void) {
  vec4 c1 = texture2D(tex1, tex1_coords);
  vec4 c2 = texture2D(tex2, tex1_coords);
  vec4 cbool = texture2D(texbool, tex1_coords / 2.);
  // this will mix c1 to c2, according to cbool.
  // if cbool is 0, c1 will be used, otherwise, it will be c2
  glFragColor = mix(c1, c2, cbool);
}

Я не проверял ваш пример, но вот как я начну находить решение :)

...