【问题标题】:C# SFML OpenGl Multiple Texture problemC# SFML OpenGL 多重纹理问题
【发布时间】:2011-07-22 04:36:45
【问题描述】:

编辑:好的,这段代码仍然不允许我在程序中使用两种不同的纹理。它看起来应该可以工作,但是当我告诉它使用第一个纹理时,它与第二个纹理相同,即最后一个加载的纹理。

        private int[] iTextures = new int[3];

        public void main()
        {
            Initialize();
            LoadContent();

            float Time = 0.0F;

            // Start game loop
            while (App.IsOpened())
            {
                // Process events
                App.DispatchEvents();

                // Clear the window
                App.Clear();

                App.Draw(Background);

                Gl.glClear(Gl.GL_DEPTH_BUFFER_BIT);

                // Transformations
                Time += App.GetFrameTime();
                Gl.glMatrixMode(Gl.GL_MODELVIEW);
                Gl.glLoadIdentity();
                Gl.glTranslatef(0.0F, 0.0F, -200.0F);


                Gl.glPushMatrix();

                Gl.glScalef(10.0f, 50.0f, 10.0f);
                DrawCube(50.0f, 50.0f, 50.0f, 0);

                Gl.glPopMatrix();

                //Gl.glRotatef(Time * 50, 1.0F, 0.0F, 0.0F);
                //Gl.glRotatef(Time * 30, 0.0F, 1.0F, 0.0F);
                //Gl.glRotatef(Time * 90, 0.0F, 0.0F, 1.0F);


                /*Gl.glTexCoord2f(0, 0); Gl.glVertex3f(-50.0F, -50.0F, -50.0F);
                Gl.glTexCoord2f(0, 1); Gl.glVertex3f(-50.0F, 50.0F, -50.0F);
                Gl.glTexCoord2f(1, 1); Gl.glVertex3f(50.0F, 50.0F, -50.0F);
                Gl.glTexCoord2f(1, 0); Gl.glVertex3f(50.0F, -50.0F, -50.0F);

                Gl.glTexCoord2f(0, 0); Gl.glVertex3f(-50.0F, -50.0F, 50.0F);
                Gl.glTexCoord2f(0, 1); Gl.glVertex3f(-50.0F, 50.0F, 50.0F);
                Gl.glTexCoord2f(1, 1); Gl.glVertex3f(50.0F, 50.0F, 50.0F);
                Gl.glTexCoord2f(1, 0); Gl.glVertex3f(50.0F, -50.0F, 50.0F);

                Gl.glTexCoord2f(0, 0); Gl.glVertex3f(-50.0F, -50.0F, -50.0F);
                Gl.glTexCoord2f(0, 1); Gl.glVertex3f(-50.0F, 50.0F, -50.0F);
                Gl.glTexCoord2f(1, 1); Gl.glVertex3f(-50.0F, 50.0F, 50.0F);
                Gl.glTexCoord2f(1, 0); Gl.glVertex3f(-50.0F, -50.0F, 50.0F);

                Gl.glTexCoord2f(0, 0); Gl.glVertex3f(50.0F, -50.0F, -50.0F);
                Gl.glTexCoord2f(0, 1); Gl.glVertex3f(50.0F, 50.0F, -50.0F);
                Gl.glTexCoord2f(1, 1); Gl.glVertex3f(50.0F, 50.0F, 50.0F);
                Gl.glTexCoord2f(1, 0); Gl.glVertex3f(50.0F, -50.0F, 50.0F);

                Gl.glTexCoord2f(0, 1); Gl.glVertex3f(-50.0F, -50.0F, 50.0F);
                Gl.glTexCoord2f(0, 0); Gl.glVertex3f(-50.0F, -50.0F, -50.0F);
                Gl.glTexCoord2f(1, 0); Gl.glVertex3f(50.0F, -50.0F, -50.0F);
                Gl.glTexCoord2f(1, 1); Gl.glVertex3f(50.0F, -50.0F, 50.0F);

                Gl.glTexCoord2f(0, 1); Gl.glVertex3f(-50.0F, 50.0F, 50.0F);
                Gl.glTexCoord2f(0, 0); Gl.glVertex3f(-50.0F, 50.0F, -50.0F);
                Gl.glTexCoord2f(1, 0); Gl.glVertex3f(50.0F, 50.0F, -50.0F);
                Gl.glTexCoord2f(1, 1); Gl.glVertex3f(50.0F, 50.0F, 50.0F);


                Gl.glVertex3f(50.0f, 50.0f, 50.0f);
                Gl.glVertex3f(50.0f, 0.0f, 50.0f);
                Gl.glVertex3f(0.0f, 0.0f, 50.0f);
                Gl.glVertex3f(0.0f, 50.0f, 50.0f);

                Gl.glTexCoord2f(0, 1); Gl.glVertex3f(-50.0F, 10.0F, 50.0F);
                Gl.glTexCoord2f(0, 0); Gl.glVertex3f(-50.0F, 10.0F, -50.0F);
                Gl.glTexCoord2f(1, 0); Gl.glVertex3f(50.0F, 10.0F, -50.0F);
                Gl.glTexCoord2f(1, 1); Gl.glVertex3f(50.0F, 10.0F, 50.0F);

                Gl.glEnd();*/



                Draw();

                // Finally, display the rendered frame on screen
                App.Display();

            }
            // Don't forget to destroy our texture
            int tex = 0;
            Gl.glDeleteTextures(1, ref tex);
        }

        public void Initialize()
        {
            // Create main window

            App.PreserveOpenGLStates(true);

            // Setup event handlers
            App.Closed += new EventHandler(OnClosed);
            App.KeyPressed += new EventHandler<KeyEventArgs>(OnKeyPressed);
            App.Resized += new EventHandler<SizeEventArgs>(OnResized);
        }

        private void LoadContent()
        {
            BackgroundImage = new Image("background.jpg");
            Background = new Sprite(BackgroundImage);

            Text = new String2D("This is a cube");
            Text.Position = new Vector2(0, 0);
            Text.Color = Color.Black;

            // Enable Z-buffer read and write
            Gl.glEnable(Gl.GL_DEPTH_TEST);
            Gl.glDepthMask(Gl.GL_TRUE);
            Gl.glClearDepth(1.0F);

            // Setup a perspective projection

            Gl.glMatrixMode(Gl.GL_PROJECTION);
            Gl.glLoadIdentity();
            Glu.gluPerspective(90.0F, 1.0F, 1.0F, 500.0F); // I assume this is setting up the camera

            LoadTexture(new Image("texture.jpg"), 0);

            LoadTexture(new Image("Otexture.jpg"), 1);


        }

        private void Draw()
        {
            App.Draw(Text);
        }

        private void LoadTexture(Image Texture, int texNum)
        {

            using (Image TempImage = Texture)
            {

                Gl.glGenTextures(1, out iTextures[texNum]); // Texture name, which is a number

                Gl.glBindTexture(Gl.GL_TEXTURE_2D, iTextures[texNum]); // Start using the texture


                Console.WriteLine(texNum + "");
                // Texture options and filters and stuff
                Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, Gl.GL_LINEAR);
                Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MIN_FILTER, Gl.GL_LINEAR_MIPMAP_LINEAR);

                Glu.gluBuild2DMipmaps(Gl.GL_TEXTURE_2D, Gl.GL_RGBA, (int)TempImage.Width, (int)TempImage.Height, Gl.GL_RGBA, Gl.GL_UNSIGNED_BYTE, TempImage.Pixels);
                //Gl.glTexImage2D(Gl.GL_TEXTURE_2D, 0, Gl.GL_RGBA, (int)TempImage.Width, (int)TempImage.Height, 0, Gl.GL_RGBA, Gl.GL_UNSIGNED_BYTE, TempImage.Pixels);

            }
            Gl.glEnable(Gl.GL_TEXTURE_2D);
        }
        private void UseTexture(int iTexture)
        {


            // Bind our texture for use
            //Gl.glEnable(Gl.GL_TEXTURE_2D); // Start using the 2D texture
            Gl.glBindTexture(Gl.GL_TEXTURE_2D, iTexture); // Bind our texture for current use
            Gl.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); // Set color to..white, I think.
        }



        void DrawCube(float xPos, float yPos, float zPos, int texture)
        {

            Gl.glPushMatrix();

            //UseTexture(1);
            Gl.glBegin(Gl.GL_QUADS);
            UseTexture(iTextures[0]);
            //Gl.glEnable(Gl.GL_TEXTURE_2D);



            /*      This is the top face*/
            Gl.glVertex3f(0.0f, 0.0f, 0.0f);
            Gl.glVertex3f(0.0f, 0.0f, -1.0f);
            Gl.glVertex3f(-1.0f, 0.0f, -1.0f);
            Gl.glVertex3f(-1.0f, 0.0f, 0.0f);

            /*      This is the front face*/
            Gl.glTexCoord2f(0, 1); Gl.glVertex3f(0.0f, 0.0f, 0.0f);
            Gl.glTexCoord2f(0, 0); Gl.glVertex3f(-1.0f, 0.0f, 0.0f);
            Gl.glTexCoord2f(1, 0); Gl.glVertex3f(-1.0f, -1.0f, 0.0f);
            Gl.glTexCoord2f(1, 1); Gl.glVertex3f(0.0f, -1.0f, 0.0f);

            /*      This is the right face*/
            Gl.glVertex3f(0.0f, 0.0f, 0.0f);
            Gl.glVertex3f(0.0f, -1.0f, 0.0f);
            Gl.glVertex3f(0.0f, -1.0f, -1.0f);
            Gl.glVertex3f(0.0f, 0.0f, -1.0f);

            /*      This is the left face*/
            Gl.glVertex3f(-1.0f, 0.0f, 0.0f);
            Gl.glVertex3f(-1.0f, 0.0f, -1.0f);
            Gl.glVertex3f(-1.0f, -1.0f, -1.0f);
            Gl.glVertex3f(-1.0f, -1.0f, 0.0f);

            /*      This is the bottom face*/
            Gl.glVertex3f(0.0f, 0.0f, 0.0f);
            Gl.glVertex3f(0.0f, -1.0f, -1.0f);
            Gl.glVertex3f(-1.0f, -1.0f, -1.0f);
            Gl.glVertex3f(-1.0f, -1.0f, 0.0f);

            /*      This is the back face*/
            Gl.glVertex3f(0.0f, 0.0f, 0.0f);
            Gl.glVertex3f(-1.0f, 0.0f, -1.0f);
            Gl.glVertex3f(-1.0f, -1.0f, -1.0f);
            Gl.glVertex3f(0.0f, -1.0f, -1.0f);

            Gl.glEnd();
            Gl.glPopMatrix();
        }

任何帮助都会很棒。

【问题讨论】:

    标签: c# opengl loading textures sfml


    【解决方案1】:

    你不是在谈论多重纹理;你说的是在同一个应用程序中使用多个纹理。

    嗯,我看到了几个问题。

    Gl.glGenTextures(2, out iTexture); // Texture name, which is a number
    

    我承认我不是 100% 熟悉 C# 的语法,所以我假设 out 的工作原理就像在 C/C++ 中传递指针一样。所以你期望glGenTextures 将纹理对象编号写入iTexture

    这里有两个问题。首先,iTexture 是一个整数。但是你告诉glGenTextures,你在这个函数调用中生成了两个纹理,而不是一个。这将需要传递一个整数数组以供glGenTextures 写入。所以你冒着破坏......堆栈的风险?我不知道你是如何将这些调用编组到 C++ 的,但是无论你在做什么,glGenTextures 很可能会写入随机内存。你很幸运没有撞车。

    LoadTexture 的每次调用都应该创建一个单一的OpenGL 纹理对象。因此,您不应尝试从单个 LoadTexture 调用创建两个。

    另一个问题是iTexture 没有从您的LoadTexture 函数中返回。您不会将其存储在任何地方。事实上,当你调用LoadTexture 时,你甚至没有给它一个输出变量;你给它一个数字文字。同样,我不是 C# 专家,但我很确定您需要一些特殊的语法才能将参数用作函数输出,特别是对于像 int 这样的基本类型。

    您的 LoadTexture 函数应该返回 OpenGL 纹理名称(或将它们存储在某处),并且匹配的 UseTexture 调用应该从它们中获取这些特定名称。


    新代码问题:

    // Don't forget to destroy our texture
    int tex = 0;
    Gl.glDeleteTextures(1, ref tex);
    

    您不能删除纹理 0。这通常是人们不使用纹理 0 来存储实际纹理的原因;它通常被视为“不存在的纹理”,如 NULL。

    至于你的实际绘图代码:

    Gl.glBegin(Gl.GL_QUADS);
    UseTexture(iTextures[0]);
    

    您不能在 glBegin/glEnd 调用之间调用 glBindTexture(或大多数 OpenGL 函数)。 UseTexture 应该在开始四边形之前调用。此外,UseTexture 应该启用GL_TEXTURE_2D。我知道您在其他地方使用它,但最好将命令放在它们真正重要的地方。如果要进行无纹理渲染,则必须禁用 GL_TEXTURE_2D

    另外,当你只给出一个四边形纹理坐标时,你期望会发生什么?您希望其他四边形看起来像什么?因为如果您认为这些四边形将是无纹理的,那您就错了。

    【讨论】:

    • 啊,确实有道理。老实说,我认为 OpenGl 在创建名称时会存储名称,显然我错了。我会按照你的建议试一试,非常感谢。
    • @Elec0:当然,OpenGL 存储了纹理名称——因为它是内部管理的。但它没有内置某种水晶球,也无法读懂你的想法来知道你想使用哪种纹理。您必须告诉 OpenGL 使用哪个纹理,纹理名称是它的句柄。
    • @Nicol Bolas:假设 OpenGL-1.x 操作,如果 Elec0 省略了对 glGenTextures 的调用,这实际上会起作用,因为 OpenGL-1 允许使用未显式生成的隐式对象名称(它然后默默地生成一个具有请求名称的新纹理对象)。名称 0 是保留的,因此 LoadTexture iTexture 参数将以 1 开头。
    • 好的,谢谢。我用我的新代码更新了我的帖子,但仍然无法正常工作。
    • @Elec0:定义“不起作用”。更改您的问题以解释您现在看到的问题。
    猜你喜欢
    • 1970-01-01
    • 2022-08-14
    • 2011-09-28
    • 1970-01-01
    • 1970-01-01
    • 2012-06-26
    • 2012-07-24
    相关资源
    最近更新 更多