Ich rendere das ganze mit OpenGL. Den wrapper hierfür habe ich selbst geschrieben 
https://github.com/Andy16823/NetGL-2023. Allerdings nutze ich das "ModernGL" also ich nutze glm für matrizen etc.
Code: Alles auswählen
        public void SetCamera(Camera camera)
        {
            if(camera.Type == CameraType.Ortho)
            {
                float x = camera.Location.X - (camera.Size.X / 2);
                float y = camera.Location.Y - (camera.Size.Y / 2);
                float top = y + camera.Size.Y;
                float right = x + camera.Size.X;
                p_mat = mat4.Ortho(x, right, y, top, 0.0f, 100.0f);
                v_mat = mat4.LookAt(new vec3(0f, 0f, 1f), new vec3(0f, 0f, 0f), new vec3(0f, 1f, 0f));
            }
            else
            {
                vec3 cameraPosition = camera.Location.ToGlmVec3();
                Vec3 cameraFront = Utils.CalculateCameraFront2(camera);
                p_mat = mat4.Perspective(Utils.ToRadians(45.0f), camera.Size.X / camera.Size.Y, camera.Near, camera.Far);
                v_mat =  mat4.LookAt(cameraPosition, cameraPosition + cameraFront.ToGlmVec3(), new vec3(0.0f, 1.0f, 0.0f));
            }
            if(this.camera == null)
            {
                this.camera = camera;
            }
        }
so setze ich die kamera und so rendere ich z.b. ein Element
Code: Alles auswählen
public void DrawElement3D(Element3D element)
        {
            int elementShaderID = (int)element.Propertys["ShaderID"];
            mat4 mt_mat = Utils.GetModelTransformation(element);
            mat4 mr_mat = Utils.GetModelRotation(element);
            mat4 ms_mat = Utils.GetModelScale(element);
            mat4 m_mat = mt_mat * mr_mat * ms_mat;
            mat4 mvp = p_mat * v_mat * m_mat;
            gl.Enable(OpenGL.Texture2D);
            foreach (var material in element.Model.Materials) 
            {
                gl.UseProgram(elementShaderID);
                gl.UniformMatrix4fv(gl.GetUniformLocation(elementShaderID, "mvp"), 1, false, mvp.ToArray());
                if(this.lightSource != null)
                {
                    Vec3 ligtDirection = lightSource.GetLightDirection(camera);
                    Vec3 lightColor = lightSource.GetLightColor();
                    gl.Uniform3f(gl.GetUniformLocation(elementShaderID, "lightPos"), lightSource.Location.X, lightSource.Location.Y, lightSource.Location.Z);
                    gl.Uniform1f(gl.GetUniformLocation(elementShaderID, "lightIntensity"), lightSource.Intensity);
                    gl.Uniform3f(gl.GetUniformLocation(elementShaderID, "lightColor"), lightColor.X, lightColor.Y, lightColor.Z);
                }
                gl.ActiveTexture(OpenGL.Texture0);
                gl.BindTexture(OpenGL.Texture2D, (int)material.Propeterys["tex_id"]);
                gl.Uniform1I(gl.GetUniformLocation(elementShaderID, "textureSampler"), 0);
                gl.ActiveTexture(OpenGL.Texture1);
                gl.BindTexture(OpenGL.Texture2D, (int)material.Propeterys["normal_id"]);
                gl.Uniform1I(gl.GetUniformLocation(elementShaderID, "normalMap"), 1);
                gl.EnableVertexAttribArray(0);
                gl.BindBuffer(OpenGL.ArrayBuffer ,(int)material.Propeterys["vbo"]);
                gl.VertexAttribPointer(0, 3, OpenGL.Float, false, 0, 0);
                
                gl.EnableVertexAttribArray(2);
                gl.BindBuffer(OpenGL.ArrayBuffer, (int)material.Propeterys["tbo"]);
                gl.VertexAttribPointer(2, 2, OpenGL.Float, false, 0, 0);
                gl.EnableVertexAttribArray(3);
                gl.BindBuffer(OpenGL.ArrayBuffer, (int)material.Propeterys["nbo"]);
                gl.VertexAttribPointer(3, 3, OpenGL.Float, false, 0, 0);
                gl.DrawArrays(OpenGL.Triangles, 0, (int)material.Propeterys["tris"]);
            }
            gl.Disable(OpenGL.Texture2D);
            //Console.WriteLine(gl.GetError());
        }
Das rendern an sich funktioniert auch. Wie gesagt ich glaube der name LookAt ist von mir nicht so gut gewählt.