Ответы:
OpenGL ES 2.0 поддерживает точечные спрайты; Я использую их для частиц. Просто используйте glDrawElements
с GL_POINTS
.
В вершинном шейдере вы устанавливаете размер с gl_PointSize
помощью gl_PointCoord
фрагментного шейдера и используете его для наложения текстуры.
Мой вершинный шейдер:
uniform mat4 uMvp;
uniform float uThickness;
attribute vec3 aPosition;
attribute vec2 aTexCoord;
attribute vec4 aColor;
varying vec4 vColor;
void main() {
vec4 position = uMvp * vec4(aPosition.xyz, 1.);
vColor = aColor;
gl_PointSize = uThickness;
gl_Position = position;
}
Мой фрагмент шейдера:
uniform sampler2D tex0;
varying vec4 vColor;
void main()
{
gl_FragColor = texture2D(tex0, gl_PointCoord) * vColor;
}
Если вы на Android, вы можете посмотреть мой французский учебник . Есть полный проект с точечными спрайтами.
Удивительно, но glLineWidth () также увеличивает размеры точек:
GLES20.glLineWidth(8); // Make the edges (and points!) thicker
GLES20.glDrawArrays(GLES20.GL_POINTS, 0, 38);// 38 is number of my vertexes
OpenGLES 2.0 напрямую не поддерживает точечные спрайты. Вы можете либо текстурировать свои glPoints, либо вручную создать ориентированный на камеру и выровненный по камере квад по центру точки.
float
точность в фрагментных шейдерах - они не имеютfloat
точности по умолчанию, и в некоторых драйверах такие шейдеры могут не скомпилироваться.