OpenGL试图绘制多个2d纹理,只出现第一个

我有一个问题,我正在尝试使用纹理绘制太阳系(每个行星一个纹理),当我绘制纹理时,只显示第一个。 其余的都没有。

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

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; } 

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

  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(); } } 

只是不得不处理这个问题,所以我认为我也会陷入困境。
我看到了接受的答案,在我的情况下,我确实在管道中正确地重置了所有内容。 在我的管道中,我需要渲染3D和2D对象。 对于3D对象,我将切换到3D投影/模型视图,对于2D对象,将切换到正交投影。

但是,当我想渲染几个文本块(使用四边形和纹理)时,只渲染了第一个纹理。 深度测试是我的问题的根源。 所以我修改了上面的代码以适应我的情况。

 void DrawFrame() { foreach object { drawObject(); // Is an abstract method } } void _3DObject::drawObject() { switchTo3D(); // Camera transform glPushMatrix(); . . // Draw . .glPopMatrix(); } void _2DObject::drawObject() { switchTo2D(); // Having depth testing enabled was causing // problems when rendering textured quads. glDisable(GL_DEPTH_TEST); // Camera transform glPushMatrix(); . . // Draw . .glPopMatrix(); glEnable(GL_DEPTH_TEST); } 

PS:“Just”指的是1个月前! 不知道为什么我忘了尽快发布这个答案:(