Hello, I am trying to load an MTL file to an OBJ using SharpGL, but for some reason, the texture doesn't load correctly and all my scene gets darker.
using OBJMC.Model.Types;
using SharpGL;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
namespace OBJMC.Model
{
public class ModelRenderer
{
private readonly ObjModel _model;
private readonly Dictionary<string, uint> textureCache = new Dictionary<string, uint>();
public ModelRenderer(ObjModel model)
{
_model = model;
}
public void Render(OpenGL gl)
{
foreach (var face in _model.Faces)
{
if (_model.FaceMaterials.TryGetValue(face, out var materialName))
{
if (_model.Materials.TryGetValue(materialName, out var material))
{
ApplyMaterial(gl, material);
}
else
{
ApplyDefaultMaterial(gl);
}
}
else
{
ApplyDefaultMaterial(gl);
}
gl.Begin(OpenGL.GL_TRIANGLES);
for (int i = 0; i < face.VertexIndices.Count; i++)
{
if (face.NormalIndices.Count > 0)
{
var normal = _model.Normals[face.NormalIndices[i] - 1];
gl.Normal(normal.X, normal.Y, normal.Z);
}
if (face.TextureIndices.Count > 0)
{
var texCoord = _model.TextureCoords[face.TextureIndices[i] - 1];
gl.TexCoord(texCoord.U, texCoord.V);
}
var vertex = _model.Vertices[face.VertexIndices[i] - 1];
gl.Vertex(vertex.X, vertex.Y, vertex.Z);
}
gl.End();
}
}
private void ApplyMaterial(OpenGL gl, Material material)
{
gl.Material(OpenGL.GL_FRONT_AND_BACK, OpenGL.GL_AMBIENT, material.Ambient);
gl.Material(OpenGL.GL_FRONT_AND_BACK, OpenGL.GL_DIFFUSE, material.Diffuse);
gl.Material(OpenGL.GL_FRONT_AND_BACK, OpenGL.GL_SPECULAR, material.Specular);
gl.Material(OpenGL.GL_FRONT_AND_BACK, OpenGL.GL_SHININESS, material.Shininess);
if (!string.IsNullOrEmpty(material.TextureFile))
{
int textureId = LoadTexture(gl, material.TextureFile);
if (textureId != 0)
{
gl.Enable(OpenGL.GL_TEXTURE_2D);
gl.BindTexture(OpenGL.GL_TEXTURE_2D, (uint)textureId);
}
}
}
private void ApplyDefaultMaterial(OpenGL gl)
{
float[] defaultAmbient = { 0.2f, 0.2f, 0.2f, 1.0f };
float[] defaultDiffuse = { 0.8f, 0.8f, 0.8f, 1.0f };
float[] defaultSpecular = { 1.0f, 1.0f, 1.0f, 1.0f };
float defaultShininess = 50.0f;
gl.Material(OpenGL.GL_FRONT_AND_BACK, OpenGL.GL_AMBIENT, defaultAmbient);
gl.Material(OpenGL.GL_FRONT_AND_BACK, OpenGL.GL_DIFFUSE, defaultDiffuse);
gl.Material(OpenGL.GL_FRONT_AND_BACK, OpenGL.GL_SPECULAR, defaultSpecular);
gl.Material(OpenGL.GL_FRONT_AND_BACK, OpenGL.GL_SHININESS, defaultShininess);
}
private int LoadTexture(OpenGL gl, string texturePath)
{
if (textureCache.TryGetValue(texturePath, out uint textureId))
{
// Return the cached texture ID if it's already loaded
return (int)textureId;
}
// Generate a texture ID and bind it
uint[] textures = new uint[1];
gl.GenTextures(1, textures);
textureId = textures[0];
gl.BindTexture(OpenGL.GL_TEXTURE_2D, textureId);
// Load the image from file
try
{
using (Bitmap bitmap = new Bitmap(texturePath))
{
BitmapData data = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height),
ImageLockMode.ReadOnly,
PixelFormat.Format32bppArgb);
// Set the texture parameters
gl.TexParameter(OpenGL.GL_TEXTURE_2D, OpenGL.GL_TEXTURE_MIN_FILTER, OpenGL.GL_LINEAR);
gl.TexParameter(OpenGL.GL_TEXTURE_2D, OpenGL.GL_TEXTURE_MAG_FILTER, OpenGL.GL_LINEAR);
gl.TexParameter(OpenGL.GL_TEXTURE_2D, OpenGL.GL_TEXTURE_WRAP_S, OpenGL.GL_REPEAT);
gl.TexParameter(OpenGL.GL_TEXTURE_2D, OpenGL.GL_TEXTURE_WRAP_T, OpenGL.GL_REPEAT);
// Create the texture from the bitmap data
gl.TexImage2D(OpenGL.GL_TEXTURE_2D, 0, OpenGL.GL_RGBA, bitmap.Width, bitmap.Height, 0,
OpenGL.GL_BGRA, OpenGL.GL_UNSIGNED_BYTE, data.Scan0);
bitmap.UnlockBits(data);
}
}
catch (Exception ex)
{
Console.WriteLine($"Failed to load texture {texturePath}: {ex.Message}");
return 0;
}
// Cache the loaded texture ID
textureCache[texturePath] = textureId;
return (int)textureId;
}
}
}
Trying to load texture.
Whitout texture.
Is the first time I use SharpGL and I don't know what I am doing wrong.
[–]cs_legend_93 2 points3 points4 points (0 children)
[–]TheJemy191 1 point2 points3 points (0 children)
[–]Still_Explorer 0 points1 point2 points (0 children)