В Android OpenGL ES 1.1, как нарисовать текстуру по обе стороны треугольника? - PullRequest
3 голосов
/ 13 октября 2011

Я пытаюсь нарисовать текстуру по обе стороны треугольника в Android.У меня есть следующий код

float textureCoordinates[] = { 0.0f, 0.0f, //

              0.0f, 1.0f, //
            1.0f, 0.0f
    };
    short[] indices = new short[] { 0, 1, 2 };
    float[] vertices = new float[] { -0.5f, 0.5f, 0.0f, // p0
            -0.5f, -0.5f, 0.0f, // p1
            0.5f, 0.5f, 0.0f, // p2
    };

Теперь с этим я могу получить треугольник с текстурой.Но когда я поворачиваю его вдоль оси y после поворота на 180 градусов, я вижу то же изображение на другой стороне треугольника.Я хотел бы изменить текстуру треугольника на другой стороне.Пожалуйста, дайте мне знать, как это сделать.

1 Ответ

3 голосов
/ 13 октября 2011

Этого невозможно достичь только одним вызовом функции. При использовании фрагментных шейдеров (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 с точки зрения производительности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...