Этого невозможно достичь только одним вызовом функции. При использовании фрагментных шейдеров (ES 2) вы можете запросить входную переменную встроенного фрагментного шейдера gl_FrontFacing
, чтобы определить, принадлежит ли текущий фрагмент передней или задней части его треугольника. Итак, вы бы написали что-то вроде этого:
uniform sampler2D frontTexture;
uniform sampler2D backTexture;
varying vec2 texCoord;
void main()
{
if(gl_FrontFacing)
gl_FragColor = texture2D(frontTexture, texCoord);
else
gl_FragColor = texture2D(backTexture, texCoord);
}
При использовании конвейера с фиксированными функциями (ES 1) вы не сможете обойтись без рендеринга двух версий вашего объекта, одна с лицевой текстурой, а другая с задней текстурой. Вы можете облегчить отбраковку, чтобы избежать проблем с глубинным боем. Так было бы что-то вроде этого:
glEnable(GL_CULL_FACE);
glCullFace(GL_BACK); //render only front faces
glBindTexture(GL_TEXTURE_2D, frontTexture);
<draw object>
glCullFace(GL_FRONT); //render only back faces
glBindTexture(GL_TEXTURE_2D, backTexture);
<draw object>
Поскольку я не уверен, насколько хорошо современные ES-устройства справляются с ветвлением в шейдере (хотя в этом случае все фрагменты должны проходить по одному и тому же пути), может случиться так, что второй подход вместе с простым шейдером фрагментов с одной текстурой также может быть предпочтительным решением для ES 2 с точки зрения производительности.