C # SFML OpenGl Проблема с несколькими текстурами - PullRequest
0 голосов
/ 22 июля 2011

Edit: Хорошо, этот код все еще не позволяет мне использовать две разные текстуры в программе. Он действует так, как будто он должен работать, но когда я говорю ему использовать первую текстуру, она совпадает со второй текстурой, которая является последней загруженной текстурой.

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

Любая помощь будет потрясающей.

1 Ответ

0 голосов
/ 22 июля 2011

Вы не говорите о мультитекстурировании;вы говорите об использовании нескольких текстур в одном приложении.

Ну, я вижу несколько проблем.

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.

Your 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]);

Вы не можете вызвать glBindTexture (или большинство OpenGLфункции) между glBegin / glEnd вызовами.UseTexture должен быть вызван перед началом квадра.Кроме того, UseTexture должно включить GL_TEXTURE_2D.Я знаю, что вы используете его в другом месте, но лучше всего размещать команды там, где они действительно важны.И вам нужно отключить GL_TEXTURE_2D, если вы хотите выполнять рендеринг без текстур.

Кроме того, что вы ожидаете, если вы дадите только одну четырехугольную текстуру координат?Как вы ожидаете, как будут выглядеть другие четверки?Потому что, если вы думаете, что эти четырехугольники будут неприкрепленными, вы ошибаетесь.

...