Я пытаюсь сгенерировать некоторые матрицы для размещения деревьев на PL anet на GPU. Положение каждого дерева предопределено - на основе карты биома и различных данных карты высот - но эти данные являются резидентными для GPU, поэтому я не могу сделать это на CPU. В настоящий момент я использую геометрический шейдер для создания экземпляров - это изменится на традиционное создание экземпляров, если производительность плохая, и я бы затем вычислял матрицы моделей для каждого дерева вычислительного шейдера.
Я дошел до попытки использовать модифицированную версию lookAt (), но я не могу заставить ее работать, и даже если бы я это сделал, деревья были бы перпендикулярны pl anet вместо вставать. Я знаю, что могу определить ось использования 3, то есть нормаль сферы, тангенс и битангенс, но, учитывая, что мне все равно, в каком направлении находятся эти тангенс и битангенс, какой бы быстрый способ вычислить эта матрица в GLSL? Спасибо!
void drawInstance(vec3 offset)
{
//Grab the model's position from the model matrix
vec3 modelPos = vec3(modelMatrix[3][0],modelMatrix[3][1],modelMatrix[3][2]);
//Add the offset
modelPos +=offset;
//Eye = where the new pos is, look in x direction for now, planet is at origin so up is just the modelPos normalized
mat4 m = lookAt(modelPos, modelPos + vec3(1,0,0), normalize(modelPos));
//Lookat is intended as a camera matrix, fix this
m = inverse(m);
vec3 pos = gl_in[0].gl_Position.xyz;
gl_Position = vp * m *vec4(pos, 1.0);
EmitVertex();
pos = gl_in[1].gl_Position.xyz ;
gl_Position = vp * m *vec4(pos, 1.0);
EmitVertex();
pos = gl_in[2].gl_Position.xyz;
gl_Position = vp * m * vec4(pos, 1.0);
EmitVertex();
EndPrimitive();
}
void main()
{
vp = proj * view;
mvp = proj * view * modelMatrix;
drawInstance(vec3(0,20,0));
// drawInstance(vec3(0,20,0));
// drawInstance(vec3(0,20,-40));
// drawInstance(vec3(40,40,0));
// drawInstance(vec3(-40,0,0));
}