Традиционный метод - передать матрицу шейдеру, будь то вершина или фрагмент. Если вы не знаете, как заполнить матрицу вращения, Google и Wikipedia могут помочь.
Главное, с чем вы столкнетесь, это простой факт, что двухмерного вращения недостаточно. gl_PointCoord
идет от [0, 1]. Чистая матрица вращения вращается вокруг начала координат, которое находится слева внизу в пространстве координат точек. Таким образом, вам нужно больше, чем просто матрица вращения.
Вам нужна матрица 3х3, в которой есть поворот и перемещение детали. Эта матрица должна быть сгенерирована следующим образом (используя GLM для математических операций):
glm::mat4 currMat(1.0f);
currMat = glm::translate(currMat, glm::vec3(0.5f, 0.5f, 0.0f));
currMat = glm::rotate(currMat, angle, glm::vec3(0.0f, 0.0f, 1.0f));
currMat = glm::translate(currMat, glm::vec3(-0.5f, -0.5f, 0.0f));
Затем вы передаете currMat
шейдеру в виде матрицы 4x4. Ваш шейдер делает это:
vec2 texCoord = (rotMatrix * vec4(gl_PointCoord, 0, 1)).xy
gl_FragColor = texture2D(texture, texCoord) * f_color;
Я оставлю это для вас в качестве упражнения о том, как перевести перевод из четвертого столбца в третий и как передать его в виде матрицы 3х3. Конечно, в этом случае вы сделаете vec3(gl_PointCoord, 1)
для умножения матрицы.