Допустим, моя текстура имеет размер 256x256 пикселей.Он содержит 16 субтекстур размером 64x64 пикселей.Субтекстуры должны быть визуализированы в квадраторы.Чтобы повысить производительность, я хочу передать дискретные значения шейдеру, который кодирует координаты текстуры каждой вершины.Например, значения 0, 1, 2, 3 должны соответствовать (0,64), (64,64), (64,0), (0,0) на координаты текстуры вершины и т. Д.
Здесьэто то, что у меня есть.
Я загружаю и связываю текстуру mipmap:
glGenTextures(1, &texture[0]);
glBindTexture(GL_TEXTURE_2D, texture[0]);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST);
gluBuild2DMipmaps(GL_TEXTURE_2D,3,TextureImage[0]->w,TextureImage[0]->h,GL_RGB,GL_UNSIGNED_BYTE,TextureImage[0]->pixels);
Затем я загружаю свои данные:
glGenVertexArrays(1, &VecArrObj);
glBindVertexArray(VecArrObj);
glGenBuffers(1, &VertexBO);
glBindBuffer(GL_ARRAY_BUFFER, VertexBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(VertAndTex), VertAndTex, GL_STREAM_DRAW);
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
glVertexAttribPointer(0, 3, GL_SHORT, GL_FALSE, 0, 0);
glVertexAttribPointer(1, 1, GL_SHORT, GL_FALSE, 0, (void*)TexOffset);
glGenBuffers(1, &IndexBO);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IndexBO);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(Indx), Indx, GL_STREAM_DRAW);
Здесь атрибуты ранееправильно назначен myProgram с помощью glBindAttribLocation.Вот как я отображаю свои четырехугольники:
glUseProgram(myProgram);
glBindVertexArray(VecArrObj);
glDrawElements(GL_QUADS, 4, GL_UNSIGNED_SHORT, 0);
glBindVertexArray(0);
glUseProgram(0);
Теперь, когда текстура mipmap постоянно связана, она должна быть доступна из шейдеров.До сих пор мои шейдеры выглядели следующим образом.
Вершинный шейдер:
#version 130
in vec4 posit; //attr=0
in short textu; //attr=1
uniform mat4 trafoMat;
void main()
{
gl_Position = trafoMat * posit;
gl_TexCoord[0] = gl_MultiTexCoord0;
}
Фрагментный шейдер:
#version 130
uniform sampler2D tex;
out vec4 outColor;
void main()
{
outColor = texture2D(tex,gl_TexCoord[0].st);
}
Где текс равен нулю.Эти шейдеры даже не получают всю текстуру, а устанавливают только один квадрат на один цвет из текстуры (я думаю, это пиксель в верхнем левом углу).Очевидно, у меня нет большого опыта работы с шейдерами.По сути, мой вопрос: как мне изменить мои шейдеры для целей, описанных в начале?(Я способен выполнить математику для текстурных координат для каждой вершины - мне прежде всего нужен совет, как обрабатывать текстуры в шейдерах. Обратите внимание: мое оборудование не поддерживает glGenSamplers ()).