Anonymous
Как правильно применять текстуры в SharpGL?
Сообщение
Anonymous » 04 дек 2024, 19:03
Это мое тестовое приложение проекта SHARPGL, в котором я узнаю, как применять текстуру к сетке. Я создал вращающийся куб, к каждому квадрату которого предполагается применить деревянную текстуру. Текстура привязана правильно, но коробка по-прежнему белая. ChatGPT помог мне с кодом, но я не смог заставить его решить проблему без отображения текстуры. Кто-нибудь может помочь? Это мой код:
https://pastebin.com/XDaLX6sA
и файл моего проекта:
https://www.dropbox.com/scl/fi/yr9t1jm2 ... n10i6&dl=0
`
private void DrawScene(отправитель объекта, аргументы SharpGL.WPF.OpenGLRoutedEventArgs)
{
Код: Выделить всё
// Clear the color and depth buffer.
gl.Clear(OpenGL.GL_COLOR_BUFFER_BIT | OpenGL.GL_DEPTH_BUFFER_BIT);
// Load the identity matrix.
gl.LoadIdentity();
// gl.Enable(OpenGL.GL_BLEND);
// gl.BlendFunc(OpenGL.GL_SRC_ALPHA, OpenGL.GL_ONE_MINUS_SRC_ALPHA);
// gl.Disable(OpenGL.GL_LIGHTING);
// Move the cube slightly back so it’s visible.
gl.Translate(0.0f, 0.0f, -6.0f);
// Rotate the cube.
gl.Rotate(rotationAngle, 1.0f, 1.0f, 0.0f);
// Bind the texture.
// Draw a textured cube.
DrawCube(gl);
gl.End();
// Flush OpenGL commands.
gl.Flush();
// Update rotation angle.
rotationAngle += 1.0f;
if (rotationAngle >= 360.0f)
rotationAngle -= 360.0f;
}
private void DrawCube(OpenGL gl)
{
gl.Begin(OpenGL.GL_QUADS);
gl.Enable(OpenGL.GL_TEXTURE_2D);
gl.BindTexture(OpenGL.GL_TEXTURE_2D, textureId);
// Front face
gl.TexCoord(0.0f, 0.0f); gl.Vertex(-1.0f, -1.0f, 1.0f);
gl.TexCoord(1.0f, 0.0f); gl.Vertex(1.0f, -1.0f, 1.0f);
gl.TexCoord(1.0f, 1.0f); gl.Vertex(1.0f, 1.0f, 1.0f);
gl.TexCoord(0.0f, 1.0f); gl.Vertex(-1.0f, 1.0f, 1.0f);
// Back face
gl.TexCoord(0.0f, 0.0f); gl.Vertex(-1.0f, -1.0f, -1.0f);
gl.TexCoord(1.0f, 0.0f); gl.Vertex(1.0f, -1.0f, -1.0f);
gl.TexCoord(1.0f, 1.0f); gl.Vertex(1.0f, 1.0f, -1.0f);
gl.TexCoord(0.0f, 1.0f); gl.Vertex(-1.0f, 1.0f, -1.0f);
// Left face
gl.TexCoord(0.0f, 0.0f); gl.Vertex(-1.0f, -1.0f, -1.0f);
gl.TexCoord(1.0f, 0.0f); gl.Vertex(-1.0f, -1.0f, 1.0f);
gl.TexCoord(1.0f, 1.0f); gl.Vertex(-1.0f, 1.0f, 1.0f);
gl.TexCoord(0.0f, 1.0f); gl.Vertex(-1.0f, 1.0f, -1.0f);
// Right face
gl.TexCoord(0.0f, 0.0f); gl.Vertex(1.0f, -1.0f, -1.0f);
gl.TexCoord(1.0f, 0.0f); gl.Vertex(1.0f, -1.0f, 1.0f);
gl.TexCoord(1.0f, 1.0f); gl.Vertex(1.0f, 1.0f, 1.0f);
gl.TexCoord(0.0f, 1.0f); gl.Vertex(1.0f, 1.0f, -1.0f);
// Top face
gl.TexCoord(0.0f, 0.0f); gl.Vertex(-1.0f, 1.0f, -1.0f);
gl.TexCoord(1.0f, 0.0f); gl.Vertex(-1.0f, 1.0f, 1.0f);
gl.TexCoord(1.0f, 1.0f); gl.Vertex(1.0f, 1.0f, 1.0f);
gl.TexCoord(0.0f, 1.0f); gl.Vertex(1.0f, 1.0f, -1.0f);
// Bottom face
gl.TexCoord(0.0f, 0.0f); gl.Vertex(-1.0f, -1.0f, -1.0f);
gl.TexCoord(1.0f, 0.0f); gl.Vertex(1.0f, -1.0f, -1.0f);
gl.TexCoord(1.0f, 1.0f); gl.Vertex(1.0f, -1.0f, 1.0f);
gl.TexCoord(0.0f, 1.0f); gl.Vertex(-1.0f, -1.0f, 1.0f);
gl.End();
}
private uint LoadTexture(OpenGL gl, Bitmap bitmap)
{
if (bitmap == null)
throw new ArgumentNullException(nameof(bitmap), "Bitmap cannot be null.");
// Generate a texture ID.
uint[] textureIds = new uint[1];
gl.GenTextures(1, textureIds);
var error = gl.GetError();
if (error != OpenGL.GL_NO_ERROR)
{
MessageBox.Show($"OpenGL Error: {error}");
}
uint id = textureIds[0];
// Set texture parameters.
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);
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);
// Bind the texture to apply settings.
gl.BindTexture(OpenGL.GL_TEXTURE_2D, id);
// Lock the bitmap bits for OpenGL.
BitmapData data = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height),
ImageLockMode.ReadOnly,
System.Drawing.Imaging.PixelFormat.Format32bppArgb);
// Create the texture from the bitmap data.
gl.TexImage2D(OpenGL.GL_TEXTURE_2D, 0, (int)OpenGL.GL_RGBA, data.Width, data.Height, 0,
OpenGL.GL_BGRA, OpenGL.GL_UNSIGNED_BYTE, data.Scan0);
// Unlock the bitmap bits.
bitmap.UnlockBits(data);
return id;
}
`
Подробнее здесь:
https://stackoverflow.com/questions/792 ... l-properly
1733328228
Anonymous
Это мое тестовое приложение проекта SHARPGL, в котором я узнаю, как применять текстуру к сетке. Я создал вращающийся куб, к каждому квадрату которого предполагается применить деревянную текстуру. Текстура привязана правильно, но коробка по-прежнему белая. ChatGPT помог мне с кодом, но я не смог заставить его решить проблему без отображения текстуры. Кто-нибудь может помочь? Это мой код: https://pastebin.com/XDaLX6sA [code]my code[/code] и файл моего проекта: https://www.dropbox.com/scl/fi/yr9t1jm2ehl8zlc7ijk63/TEST_SHARPGL_TEXTURE.zip?rlkey=x1ddf3svun9h7xkd3ahmk7cvb&st=ikhn10i6&dl=0 ` private void DrawScene(отправитель объекта, аргументы SharpGL.WPF.OpenGLRoutedEventArgs) { [code] // Clear the color and depth buffer. gl.Clear(OpenGL.GL_COLOR_BUFFER_BIT | OpenGL.GL_DEPTH_BUFFER_BIT); // Load the identity matrix. gl.LoadIdentity(); // gl.Enable(OpenGL.GL_BLEND); // gl.BlendFunc(OpenGL.GL_SRC_ALPHA, OpenGL.GL_ONE_MINUS_SRC_ALPHA); // gl.Disable(OpenGL.GL_LIGHTING); // Move the cube slightly back so it’s visible. gl.Translate(0.0f, 0.0f, -6.0f); // Rotate the cube. gl.Rotate(rotationAngle, 1.0f, 1.0f, 0.0f); // Bind the texture. // Draw a textured cube. DrawCube(gl); gl.End(); // Flush OpenGL commands. gl.Flush(); // Update rotation angle. rotationAngle += 1.0f; if (rotationAngle >= 360.0f) rotationAngle -= 360.0f; } private void DrawCube(OpenGL gl) { gl.Begin(OpenGL.GL_QUADS); gl.Enable(OpenGL.GL_TEXTURE_2D); gl.BindTexture(OpenGL.GL_TEXTURE_2D, textureId); // Front face gl.TexCoord(0.0f, 0.0f); gl.Vertex(-1.0f, -1.0f, 1.0f); gl.TexCoord(1.0f, 0.0f); gl.Vertex(1.0f, -1.0f, 1.0f); gl.TexCoord(1.0f, 1.0f); gl.Vertex(1.0f, 1.0f, 1.0f); gl.TexCoord(0.0f, 1.0f); gl.Vertex(-1.0f, 1.0f, 1.0f); // Back face gl.TexCoord(0.0f, 0.0f); gl.Vertex(-1.0f, -1.0f, -1.0f); gl.TexCoord(1.0f, 0.0f); gl.Vertex(1.0f, -1.0f, -1.0f); gl.TexCoord(1.0f, 1.0f); gl.Vertex(1.0f, 1.0f, -1.0f); gl.TexCoord(0.0f, 1.0f); gl.Vertex(-1.0f, 1.0f, -1.0f); // Left face gl.TexCoord(0.0f, 0.0f); gl.Vertex(-1.0f, -1.0f, -1.0f); gl.TexCoord(1.0f, 0.0f); gl.Vertex(-1.0f, -1.0f, 1.0f); gl.TexCoord(1.0f, 1.0f); gl.Vertex(-1.0f, 1.0f, 1.0f); gl.TexCoord(0.0f, 1.0f); gl.Vertex(-1.0f, 1.0f, -1.0f); // Right face gl.TexCoord(0.0f, 0.0f); gl.Vertex(1.0f, -1.0f, -1.0f); gl.TexCoord(1.0f, 0.0f); gl.Vertex(1.0f, -1.0f, 1.0f); gl.TexCoord(1.0f, 1.0f); gl.Vertex(1.0f, 1.0f, 1.0f); gl.TexCoord(0.0f, 1.0f); gl.Vertex(1.0f, 1.0f, -1.0f); // Top face gl.TexCoord(0.0f, 0.0f); gl.Vertex(-1.0f, 1.0f, -1.0f); gl.TexCoord(1.0f, 0.0f); gl.Vertex(-1.0f, 1.0f, 1.0f); gl.TexCoord(1.0f, 1.0f); gl.Vertex(1.0f, 1.0f, 1.0f); gl.TexCoord(0.0f, 1.0f); gl.Vertex(1.0f, 1.0f, -1.0f); // Bottom face gl.TexCoord(0.0f, 0.0f); gl.Vertex(-1.0f, -1.0f, -1.0f); gl.TexCoord(1.0f, 0.0f); gl.Vertex(1.0f, -1.0f, -1.0f); gl.TexCoord(1.0f, 1.0f); gl.Vertex(1.0f, -1.0f, 1.0f); gl.TexCoord(0.0f, 1.0f); gl.Vertex(-1.0f, -1.0f, 1.0f); gl.End(); } private uint LoadTexture(OpenGL gl, Bitmap bitmap) { if (bitmap == null) throw new ArgumentNullException(nameof(bitmap), "Bitmap cannot be null."); // Generate a texture ID. uint[] textureIds = new uint[1]; gl.GenTextures(1, textureIds); var error = gl.GetError(); if (error != OpenGL.GL_NO_ERROR) { MessageBox.Show($"OpenGL Error: {error}"); } uint id = textureIds[0]; // Set texture parameters. 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); 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); // Bind the texture to apply settings. gl.BindTexture(OpenGL.GL_TEXTURE_2D, id); // Lock the bitmap bits for OpenGL. BitmapData data = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb); // Create the texture from the bitmap data. gl.TexImage2D(OpenGL.GL_TEXTURE_2D, 0, (int)OpenGL.GL_RGBA, data.Width, data.Height, 0, OpenGL.GL_BGRA, OpenGL.GL_UNSIGNED_BYTE, data.Scan0); // Unlock the bitmap bits. bitmap.UnlockBits(data); return id; } [/code] ` Подробнее здесь: [url]https://stackoverflow.com/questions/79251664/how-to-apply-textures-in-sharpgl-properly[/url]