Я беру курс в WebGL в NTNU. В настоящее время я изучаю, что делают шейдеры и как я могу их использовать.Возможно ли запустить код один раз за призыв на призыв в WebGL?
Пример, который мы имеем, показывает нам, что мы вычисляем матрицу проекции, затем устанавливаем ее в вершинном шейдере, а затем делаем обратный вызов. Я хотел попытаться сделать это вычисление матрицы в шейдере.
Это означает, что я должен поместить код где-то в другом месте, кроме функции main()
в вершинном шейдере, поскольку этот вызов вызывается много раз за призыв на призыв.
Vertex шейдеров:
uniform vec3 camRotation;
attribute vec3 position;
void main() {
// I want this code to run only once per draw call
float rX = camRotation[0];
float rY = camRotation[1];
float rZ = camRotation[2];
mat4 camMatrix = mat4(
cos(rY) * cos(rZ), cos(rZ) * sin(rX) * sin(rY) - cos(rX) * sin(rZ), sin(rX) * sin(rZ) + cos(rX) * cos(rZ) * sin(rY), 0, //
cos(rY) * sin(rZ), cos(rX) * cos(rZ) + sin(rX) * sin(rY) * sin(rZ), cos(rX) * sin(rY) * sin(rZ) - cos(rZ) * sin(rX), 0, //
-sin(rY), cos(rY) * sin(rX), cos(rX) * cos(rY), 0, //
0, 0, 0, 1
);
// End of code in question
gl_Position = camMatrix * vec4(position, 1);
gl_PointSize = 5.0;
}
Возможно ли это? Неужели я дурак для попытки?
Вы можете найти [эти статьи полезны] (http://webglfundamentals.org) – gman