Текстурированные точки в OpenGL ES 2.0? - PullRequest
9 голосов
/ 17 августа 2010

Я пытаюсь реализовать текстурированные точки (например, точечные спрайты) в OpenGL ES 2.0 для системы частиц. У меня проблема в том, что все точки отображаются в виде сплошных черных квадратов, вместо того, чтобы правильно отобразить текстуру.

Я убедился, что gl_PointCoord фактически возвращает значения x / y от 0.0 до 1.0, которые будут отображаться по всей текстуре. Вызов texture2D всегда кажется черным.

Мой вершинный шейдер:

attribute vec4 aPosition;
attribute float aAlpha;
attribute float aSize;
varying float vAlpha;
uniform mat4 uMVPMatrix;

void main() {
  gl_PointSize = aSize;
  vAlpha = aAlpha;
  gl_Position = uMVPMatrix * aPosition;
}

И мой фрагментный шейдер:

precision mediump float;
uniform sampler2D tex;
varying float vAlpha;

void main () {
    vec4 texColor = texture2D(tex, gl_PointCoord);
    gl_FragColor = vec4(texColor.rgb, texColor.a * vAlpha);
}

Текстура, о которой идет речь, имеет размер 16x16. Я могу успешно сопоставить эту текстуру с другой геометрией, но по какой-то причине не с точками.

Моя платформа - Motorola Droid, работающая под управлением Android 2.2.

Ответы [ 2 ]

14 голосов
/ 07 февраля 2011

Вы выбираете свою текстуру как активную и привязываете ее - как обычно.Но вы должны передать свой текстурный блок как единообразный программе шейдеров.Таким образом, вы можете использовать gl_PointCoord в качестве координат текстуры в вашем фрагментном шейдере.

glUniform1i(MY_TEXTURE_UNIFORM_LOCATION, 0);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, yourTextureId);
glEnable(GL_TEXTURE_2D);
glDrawArrays(GL_POINTS, 0, pointCount);
glDisable(GL_TEXTURE_2D);

И ваш фрагментный шейдер должен выглядеть следующим образом:

uniform sampler2D texture;
void main ( )
{
    gl_FragColor = texture2D(texture, gl_PointCoord);
}
0 голосов
/ 11 апреля 2018

У меня также была похожая проблема - мои спрайты просто отображались в виде цветных квадратов, но текстура не появлялась.

Мне нужно было добавить это:

glEnable( GL_POINT_SPRITE );

Текстурирование не должно быть включенопо умолчанию на всех графических процессорах.

...