Как правильно применять текстуры в SharpGL?C#

Место общения программистов C#
Ответить
Anonymous
 Как правильно применять текстуры в SharpGL?

Сообщение Anonymous »

Это мое тестовое приложение проекта 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»