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.