- 14
- 0
Добрый день, я пытаюсь реализовать кастомный рендеринг с OpenGL внедряясь в основной граф. поток игры без конфликтов для добавления граф. плюшек к своему моду за счет вычислительных шейдеров, но у меня возникла проблема с правильной настройкой матриц проекции, модели, и самого болючего, матрицы вида. С двумя первыми все должно работать правильно, но я не могу правильно настроить матрицу вида, поскольку игра не дает напрямую методы получения матрицы вида, смею предположить, тому есть причина. Я полагаю, что проблема в ней, поскольку при повороте камеры, рендериемый обьект имеет очень странные перемещения по экрану. Вот метод построения матрицы вида:
; А вот код, где происходит обработка рендеринга:
; Вот код вертексного шейдера треугольника, я тестирую матрицы сейчас на треугольнике, важно еще заметить, что вершины расположены на 0 0 0 координатах мира:
; Я убрал умножение на uModel в конце uView , поскольку из-за треугольника вообще нету. Я лишь надеюсь на то, что кто-то знаком с такой ситуацией как у меня, и сможет поделиться опытом решения, если оно есть.
buildViewMatrix метод:
private static void buildViewMatrix(Camera camera, Matrix4f viewMatrix) {
viewMatrix.identity();
float pitch = -camera.getXRot();
float yaw = -camera.getYRot();
Vector3f pos = camera.getPosition().toVector3f();
viewMatrix.translate(pos.x, -pos.y, pos.z);
viewMatrix.rotateY((float) Math.toRadians(yaw));
viewMatrix.rotateX((float) Math.toRadians(pitch));
}
onRenderLevel метод:
@SubscribeEvent
public static void onRenderLevel(RenderLevelStageEvent event) {
if (event.getStage() != RenderLevelStageEvent.Stage.AFTER_PARTICLES) {
return;
}
long currentTime = System.nanoTime();
float deltaTime = (currentTime - lastFrameTime) / 1_000_000_000.0f;
lastFrameTime = currentTime;
particleEngine.update(deltaTime);
// Получение матриц
Matrix4f modelMatrix = event.getPoseStack().last().pose();
Matrix4f viewMatrix = new Matrix4f();
buildViewMatrix(event.getCamera(), viewMatrix);
Matrix4f projMatrix = event.getProjectionMatrix();
//particleEngine.render(viewMatrix, projMatrix);
particleEngine.renderDebugTriangle(modelMatrix, viewMatrix, projMatrix);
}
Код:
#version 430 core
layout(location = 0) in vec3 aPos;
uniform mat4 uModel;
uniform mat4 uView;
uniform mat4 uProj;
out vec3 color;
void main() {
gl_Position = uProj * uView * vec4(aPos, 1.0);
color = vec3(0.0);
if (gl_VertexID == 0) color = vec3(1, 0, 0);
if (gl_VertexID == 1) color = vec3(0, 1, 0);
if (gl_VertexID == 2) color = vec3(0, 0, 1);
}