gpt4 book ai didi

c# - OpenGL 尝试绘制多个 2d 纹理,只出现第一个

转载 作者:行者123 更新时间:2023-11-30 17:06:25 25 4
gpt4 key购买 nike

我遇到了一个问题,因为我正在尝试使用纹理(每个行星一个纹理)绘制一个太阳系,并且当我绘制我的纹理时,只有第一个出现。其余的都没有。

我的 init 函数遍历我的文件,将纹理保存到一个对象中,然后遍历这些对象。在迭代时,它会生成纹理并使用 OpenGL 调用将它们绑定(bind)到一个名称。

        SharpGL.OpenGL gl = args.OpenGL;
gl.Enable(SharpGL.OpenGL.GL_BLEND);
gl.Enable(SharpGL.OpenGL.GL_TEXTURE_2D);
gl.BlendFunc(SharpGL.Enumerations.BlendingSourceFactor.SourceAlpha, SharpGL.Enumerations.BlendingDestinationFactor.OneMinusSourceAlpha);
gl.ClearColor(0, 0, 0, 1);

foreach (ImageWrapper iw in m_images)
{
uint[] texNames = new uint[1];

gl.GenTextures(1, texNames);
gl.BindTexture(SharpGL.OpenGL.GL_TEXTURE_2D, texNames[0]);

gl.TexParameter(SharpGL.OpenGL.GL_TEXTURE_2D, SharpGL.OpenGL.GL_TEXTURE_WRAP_S, SharpGL.OpenGL.GL_REPEAT);
gl.TexParameter(SharpGL.OpenGL.GL_TEXTURE_2D, SharpGL.OpenGL.GL_TEXTURE_WRAP_T, SharpGL.OpenGL.GL_REPEAT);
gl.TexParameter(SharpGL.OpenGL.GL_TEXTURE_2D, SharpGL.OpenGL.GL_TEXTURE_MAG_FILTER, SharpGL.OpenGL.GL_LINEAR);
gl.TexParameter(SharpGL.OpenGL.GL_TEXTURE_2D, SharpGL.OpenGL.GL_TEXTURE_MIN_FILTER, SharpGL.OpenGL.GL_LINEAR);

gl.TexImage2D(SharpGL.OpenGL.GL_TEXTURE_2D,
0,
3,
iw.BitmapSource.PixelWidth,
iw.BitmapSource.PixelHeight,
0,
SharpGL.OpenGL.GL_BGRA,
SharpGL.OpenGL.GL_UNSIGNED_BYTE,
iw.Pixels);

iw.TextureHandle = texNames;

}

这是我绘制所有内容的函数。我遍历所有具有纹理数据的对象,并尝试一次绘制一个。我还想执行一些旋转和变换以使我的太阳系旋转。该部分适用于出现的纹理。

        SharpGL.OpenGL gl = args.OpenGL;
gl.Clear(SharpGL.OpenGL.GL_COLOR_BUFFER_BIT | SharpGL.OpenGL.GL_DEPTH_BUFFER_BIT );
gl.LoadIdentity();

float[] data = new float[4];
foreach (ImageWrapper iw in m_images)
{
//gl.MatrixMode(SharpGL.Enumerations.MatrixMode.Modelview);

gl.Ortho2D(0, this.Width, 0, this.Height);
gl.Enable(OpenGL.GL_TEXTURE_2D);
gl.BindTexture(OpenGL.GL_TEXTURE_2D, iw.TextureHandle[0]);
gl.TexParameter(SharpGL.OpenGL.GL_TEXTURE_2D, SharpGL.OpenGL.GL_TEXTURE_WRAP_S, SharpGL.OpenGL.GL_REPEAT);
gl.TexParameter(SharpGL.OpenGL.GL_TEXTURE_2D, SharpGL.OpenGL.GL_TEXTURE_WRAP_T, SharpGL.OpenGL.GL_REPEAT);
gl.TexParameter(SharpGL.OpenGL.GL_TEXTURE_2D, SharpGL.OpenGL.GL_TEXTURE_MAG_FILTER, SharpGL.OpenGL.GL_LINEAR);
gl.TexParameter(SharpGL.OpenGL.GL_TEXTURE_2D, SharpGL.OpenGL.GL_TEXTURE_MIN_FILTER, SharpGL.OpenGL.GL_LINEAR);


gl.PushMatrix();
//gl.Translate(this.Width / 2, this.Height / 2, 0);

//gl.Rotate(iw.RotationAboutSun, 0, 0, 1);
//gl.Translate(iw.X + 1 * this.Width / 2, iw.Y + 1 * this.Height / 2, 0);
gl.Translate(32,32, 0);
//gl.Rotate(iw.RotationAboutAxis, 0, 0, 1);
//

gl.Begin(SharpGL.Enumerations.BeginMode.Quads);
gl.Color(new float[] { 1f,1f,1f});
gl.TexCoord(0,0);
gl.Vertex(new double[] { 0 - iw.PixelWidth / 2, 0 - iw.PixelHeight / 2});
gl.TexCoord(0,1);
gl.Vertex(new double[] { 32 - iw.PixelWidth / 2, 0 - iw.PixelHeight / 2 });
gl.TexCoord(1,1);
gl.Vertex(new double[] { 32 - iw.PixelWidth / 2, 32 - iw.PixelHeight / 2 });
gl.TexCoord(1,0);
gl.Vertex(new double[] { 0 - iw.PixelWidth / 2, 32 - iw.PixelHeight / 2 });
gl.End();

gl.PopMatrix();

gl.Disable(OpenGL.GL_TEXTURE_2D);

}

我正在使用 C# 中的 SharpGL 库来执行此操作。

最佳答案

gluOrtho2D() 不会像您预期的那样发出 glLoadIdentity()

通常你每帧只设置你的投影矩阵一次

尝试这样的事情:

void DrawFrame()
{
...

glMatrixMode( GL_PROJECTION );
glLoadIdentity();
gluOrtho2D(0, this.Width, 0, this.Height);

glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
// "camera" transform(s)

foreach object
{
glPushMatrix();
// per-object matrix transform(s)

// draw object

glPopMatrix();
}
}

关于c# - OpenGL 尝试绘制多个 2d 纹理,只出现第一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15386821/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com