Может кто-нибудь объяснить, почему здесь используется vTexCoord = (a_position.xy+1)/2;
?
Координаты вершины в вашем примере находятся в диапазоне [-1, 1] для x и компонента.Это соответствует нормализованному пространству устройства.Нормализованное пространство устройства - это куб от левого нижнего переднего (-1, -1, -1) до правого верхнего правого заднего (1, 1, 1), это область, которая является «видимой».Эта область отображается в окне просмотра.
Это приводит к тому, что координаты вершины, в вашем примере, образуют прямоугольник, который охватывает весь видовой экран.
Если координаты текстуры должны обернуть всю текстуру в квадтогда координаты текстуры (u, v) должны находиться в диапазоне [0, 1].(0, 0) - левый нижний угол текстуры, а (1, 1) - верхний правый.
См. Также Как работают координаты текстуры OpenGL?
Итак, x иy компонент a_position
должен отображаться из диапазона [-1, 1] в диапазон [0, 1], чтобы использоваться в качестве ультрафиолетовых координат для поиска текстуры:
u = (a_position.x + 1) / 2
v = (a_position.y + 1) / 2
Какое изменение я должен сделать, чтобы работать с vTexCoord = a_position.xy
?
Это невозможно, но вы можете сгенерировать отдельный атрибут координат текстуры, который является общим:
attribute vec3 a_position;
attribute vec2 a_texture;
varying vec2 vTexCoord;
void main() {
vTexCoord = a_texture;
gl_Position = vec4(a_position, 1);
}
float[] vertices = {
// x y z u v
// Left bottom triangle
-1f, -1f, 0f, 0f, 0f
1f, -1f, 0f, 1f, 0f
1f, 1f, 0f, 1f, 1f
// Right top triangle
1f, 1f, 0f, 1f, 1f
-1f, 1f, 0f, 0f, 1f
-1f, -1f, 0f 0f, 0f
};
buffer = GL.GenBuffer();
GL.BindBuffer(BufferTarget.ArrayBuffer, buffer);
GL.BufferData(BufferTarget.ArrayBuffer, (IntPtr)(vertices.Length * sizeof(float)), vertices, BufferUsageHint.StaticDraw);
positionLocation = GL.GetAttribLocation(program, "a_position");
tetureLocation = GL.GetAttribLocation(program, "a_texture");
GL.EnableVertexAttribArray(positionLocation);
GL.EnableVertexAttribArray(tetureLocation);
int stride = sizeof(float) * 5; // 5 because of (x, y, z, u, v)
int offsetUV = sizeof(float) * 3; // 3 because the u and v coordinates are the 4th and 5th coordinate
GL.VertexAttribPointer(positionLocation, 3, VertexAttribPointerType.Float, false, stride, 0);
GL.VertexAttribPointer(tetureLocation, 2, VertexAttribPointerType.Float, false, stride, (IntPtr)(offsetUV));