Страницы:1

Ответить
Не работает наложение текстуры: попробовал вставить по аналогии в свой проект - получил зеленый квадрат
 
Создал проект с загрузкой текстуры - все работает. Попробовал вставить по аналогии в свой проект - получил зеленый квадрат.)) Не работает. Правда, вместо перспективы использовал gluOrtho2D и glFrustum. Получилось как бы вид в виде. Самому разобраться не хватает знаний и пива (мне столько не выпить)). Посмотрите, что не так, почему текстура не отображается. AnT разместил в MDI-окне (frmFlat2D), а загрузку текстуры делаю из родительского окна - void OpenPictureSubstrate(). Заранее прошу прощения, что вставил код всего модуля, просто не знал, что может понадобиться найти ошибку.
Код
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Tao.FreeGlut;
using Tao.OpenGl;
using Tao.Platform;
using Tao.DevIl;

namespace IndiLineEvac
{
    public partial class frmFlat2D : Form
    {
        //Глобальные переменные модуля==========================================================================
        private int[] globalviewport = new int[4]; //Отображает заданные оконные координаты (winx, winy, winz) в объектные
        private double[] globalmvmatrix = new double[16]; //координаты, используя преобразования, заданные видовой матрицей 
        private double[] globalprojmatrix = new double[16]; //(modelMatrix), проекционной матрицей (projMatrix) и портом просмотра
                                                            //(viewport). Результирующие объектные координаты возвращаются в 
                                                            //параметрах objx, objy и objz.
        private double globalZval;
        private double globalwx, globalwy, globalwz;
        private int globalRealY;                            // позиция OpenGL y - координаты

        private int[] viewport = new int[4]; //Отображает заданные оконные координаты (winx, winy, winz) в объектные
        private double[] mvmatrix = new double[16]; //координаты, используя преобразования, заданные видовой матрицей 
        private double[] projmatrix = new double[16]; //(modelMatrix), проекционной матрицей (projMatrix) и портом просмотра
                                                      //(viewport). Результирующие объектные координаты возвращаются в 
                                                      //параметрах objx, objy и objz.
        private double Zval;
        private double wx, wy, wz;
        private int RealY;                            // позиция OpenGL y - координаты

        // отношения сторон окна визуализации 
        // для корректного перевода координат мыши в координаты
        // принятые в программе
        private float devX;
        private float devY;

        // размеры окна 
        private double ScreenW, ScreenH;

        private float StartDragX, StartDragY; // Переменные для запоминания места щелчка мыши 
                                              // пользователем
        private bool WheelDownUp = false; //разрешает перемещать сцену

        private float curposX, curposY, //Текущее положение системы в осях Х и У
            curpospredX, curpospredY;   //и предыдущее состояние

        // флаг - загружена ли текстура
        static bool textureIsLoad = false;

        // имя текстуры
        public string texture_name = "";
        // идентификатор текстуры
        public int imageId = 0;

        // текстурный объект
        public uint mGlTextureObject = 0;

        public frmFlat2D(frmGlobal parent)
        {
            InitializeComponent();
            this.MdiParent = parent;
            AnT.InitializeContexts();
            WindowState = FormWindowState.Maximized;
        }

        private void IniGlut3D() // инициализация Glut 3D==============================================================
        { 
            Glut.glutInit();
            Glut.glutInitDisplayMode(Glut.GLUT_RGB | Glut.GLUT_DOUBLE | Glut.GLUT_DEPTH);

            // инициализация библиотеки openIL
            Il.ilInit();
            Il.ilEnable(Il.IL_ORIGIN_SET);

            // очистка окна 
            Gl.glClearColor((float)0.764, (float)0.764, (float)0.764, 1); //Серый цвет окна

            // установка порта вывода в соответствии с размерами элемента AnT 
            Gl.glViewport(0, 0, AnT.Width, AnT.Height);


            // настройка проекции 
            Gl.glMatrixMode(Gl.GL_PROJECTION);
            Gl.glLoadIdentity();
            Glu.gluPerspective(45, (float)AnT.Width / (float)AnT.Height, 0.1, 200);
            Gl.glMatrixMode(Gl.GL_MODELVIEW);
            Gl.glLoadIdentity();

            // начальные настройки OpenGL 
            Gl.glEnable(Gl.GL_NORMALIZE);
            Gl.glEnable(Gl.GL_DEPTH_TEST);
            Gl.glEnable(Gl.GL_AUTO_NORMAL);
            Gl.glEnable(Gl.GL_LIGHTING);
            Gl.glEnable(Gl.GL_LIGHT0);
            Gl.glEnable(Gl.GL_COLOR_MATERIAL); //Появляется цвет материала
            Gl.glEnable(Gl.GL_COLOR_MATERIAL_FACE);

            // настройка параметров OpenGL для визуализации 
            Gl.glEnable(Gl.GL_DEPTH_TEST);
        }

        private void IniGlut2D() // инициализация Glut 2D==============================================================
        {
            // инициализация библиотеки glut 
            Glut.glutInit();
            // инициализация режима экрана 
            Glut.glutInitDisplayMode(Glut.GLUT_RGB | Glut.GLUT_DOUBLE);

            // инициализация библиотеки openIL
            Il.ilInit();
            Il.ilEnable(Il.IL_ORIGIN_SET);

            // установка цвета очистки экрана (RGBA) 
            Gl.glClearColor(255, 255, 255, 1);
            // установка порта вывода 
            Gl.glViewport(0, 0, AnT.Width, AnT.Height);

            // активация проекционной матрицы 
            Gl.glMatrixMode(Gl.GL_PROJECTION);
            // очистка матрицы 
            Gl.glLoadIdentity();

            // определение параметров настройки проекции в зависимости от размеров сторон элемента AnT. 
            if ((float)AnT.Width <= (float)AnT.Height)
            {
                ScreenW = 100.0;
                ScreenH = 100.0 * (float)AnT.Height / (float)AnT.Width;
                Glu.gluOrtho2D(0.0, ScreenW, 0.0, ScreenH);
            }
            else
            {
                ScreenW = 100.0 * (float)AnT.Width / (float)AnT.Height;
                ScreenH = 100.0;
                Glu.gluOrtho2D(0.0, 100.0 * (float)AnT.Width / (float)AnT.Height, 0.0, 100.0);
            }

            // сохранение коэффициентов, которые нам необходимы для перевода координат указателя в оконной системе в координаты 
            // принятые в нашей OpenGL сцене 
            devX = (float)ScreenW / (float)AnT.Width;
            devY = (float)ScreenH / (float)AnT.Height;

            // установка объектно-видовой матрицы 
            Gl.glMatrixMode(Gl.GL_MODELVIEW);

            // начальные настройки OpenGL 
            Gl.glEnable(Gl.GL_NORMALIZE);
            Gl.glEnable(Gl.GL_DEPTH_TEST);
            Gl.glEnable(Gl.GL_AUTO_NORMAL);
            Gl.glEnable(Gl.GL_LIGHTING);
            Gl.glEnable(Gl.GL_LIGHT0);
            Gl.glEnable(Gl.GL_COLOR_MATERIAL); //Появляется цвет материала
            Gl.glEnable(Gl.GL_COLOR_MATERIAL_FACE);
        }

        private void AnT_MouseEnter(object sender, EventArgs e) //Мышь заходит на окно
        {
            Cursor.Hide(); //Счетчик показывания курсора минус скрываем курсор
        }

        private void AnT_MouseLeave(object sender, EventArgs e) //Мышь покидает окно
        {
            Cursor.Show(); //Счетчик показывания курсора плюс показываем курсор
        }

        private void AxisPaint() //Функция рисования осей координат
        {
            //Ось Х красная
            Gl.glLineWidth(2);
            Gl.glColor3f(255, 0, 0);
            Gl.glDisable(Gl.GL_LIGHT0);
            Gl.glBegin(Gl.GL_LINES);
            Gl.glVertex2d(0, 0);
            Gl.glVertex2d(0, (float)AnT.Width + (float)wy);
            Gl.glEnd();
            //Ось Y зеленая
            Gl.glLineWidth(2);
            Gl.glColor3f(0, 255, 0);
            Gl.glBegin(Gl.GL_LINES);
            Gl.glVertex2d(0, 0);
            Gl.glVertex2d((float)AnT.Height + (float)wx, 0);
            Gl.glEnd();
            Gl.glEnable(Gl.GL_LIGHT0);
        }

        private void AnT_MouseUp(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Middle)
            {
                curpospredX = curpospredX - (StartDragX - (float)globalwx); //Сохраняем положение
                curpospredY = curpospredY - (StartDragY - (float)globalwy); //системы, где отпустили мышку
                WheelDownUp = false; // Запрещаем смещать сцену
            }
        }

        private void AnT_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Middle) 
            {
                StartDragX = (float)globalwx;     // Запомним позиции щелчка мыши
                StartDragY = (float)globalwy;     // и
                WheelDownUp = true; // Разрешаем смещать сцену
                Draw();             // перерисуем окно
            }
        }

        private void MouseCursorPaint() // Функция рисования курсора мыши как в Автокаде
        {
            Gl.glPushMatrix();
            Gl.glLoadIdentity();
            Gl.glLineWidth((float)0.5);
            Gl.glDisable(Gl.GL_LIGHT0);
            Gl.glColor3f(0, 0, 255);
            //Перекрестие
            Gl.glBegin(Gl.GL_LINES);
            Gl.glVertex2d((float)globalwx, (float)globalwy + 5);
            Gl.glVertex2d((float)globalwx, (float)globalwy - 5);
            Gl.glEnd();
            Gl.glBegin(Gl.GL_LINES);
            Gl.glVertex2d((float)globalwx + 5, (float)globalwy);
            Gl.glVertex2d((float)globalwx - 5, (float)globalwy);
            Gl.glEnd();
            //Квадратик в центре
            Gl.glBegin(Gl.GL_LINES);
            Gl.glVertex2d((float)globalwx + 0.7, (float)globalwy - 0.7);
            Gl.glVertex2d((float)globalwx + 0.7, (float)globalwy + 0.7);
            Gl.glEnd();
            Gl.glBegin(Gl.GL_LINES);
            Gl.glVertex2d((float)globalwx + 0.7, (float)globalwy + 0.7);
            Gl.glVertex2d((float)globalwx - 0.7, (float)globalwy + 0.7);
            Gl.glEnd();
            Gl.glBegin(Gl.GL_LINES);
            Gl.glVertex2d((float)globalwx - 0.7, (float)globalwy + 0.7);
            Gl.glVertex2d((float)globalwx - 0.7, (float)globalwy - 0.7);
            Gl.glEnd();
            Gl.glBegin(Gl.GL_LINES);
            Gl.glVertex2d((float)globalwx - 0.7, (float)globalwy - 0.7);
            Gl.glVertex2d((float)globalwx + 0.7, (float)globalwy - 0.7);
            Gl.glEnd();
            Gl.glEnable(Gl.GL_LIGHT0);
            Gl.glPopMatrix();
        }

        private void Draw() //Функция рисования окна ==============================================================
        {
            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);

            Gl.glGetIntegerv(Gl.GL_VIEWPORT, @globalviewport);
            Gl.glGetDoublev(Gl.GL_MODELVIEW_MATRIX, @globalmvmatrix);
            Gl.glGetDoublev(Gl.GL_PROJECTION_MATRIX, @globalprojmatrix);

            MouseCursorPaint(); // Функция рисования курсора мыши как в Автокаде
            Gl.glLoadIdentity();

            // включаем режим текстурирования
            Gl.glEnable(Gl.GL_TEXTURE_2D);
            Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, Gl.GL_LINEAR);
            Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, Gl.GL_LINEAR_MIPMAP_LINEAR);
            Gl.glTexEnvi(Gl.GL_TEXTURE_ENV, Gl.GL_TEXTURE_ENV_MODE, Gl.GL_DECAL);
            Gl.glHint(Gl.GL_POLYGON_SMOOTH_HINT, Gl.GL_FASTEST);
            // включаем режим текстурирования , указывая идентификатор mGlTextureObject
            Gl.glBindTexture(Gl.GL_TEXTURE_2D, mGlTextureObject);

            Gl.glPushMatrix();

            Gl.glTranslatef(curposX, curposY, 0);
            Gl.glScalef(1, 1, 1);
            Gl.glFrustum(-10, 10, -10, 10, -10, 10);
            Gl.glGetIntegerv(Gl.GL_VIEWPORT, @viewport);
            Gl.glGetDoublev(Gl.GL_MODELVIEW_MATRIX, @mvmatrix);
            Gl.glGetDoublev(Gl.GL_PROJECTION_MATRIX, @projmatrix);

            AxisPaint(); //Рисуем Оси координат
            DrawSubstrate(); //Рисуем подложку

            Gl.glPopMatrix();

            // отключаем режим текстурирования
            Gl.glDisable(Gl.GL_TEXTURE_2D);

            Gl.glFlush();
            AnT.Invalidate();
        }

        private void DrawSubstrate()
        {
            if (textureIsLoad)
            {
                Gl.glDisable(Gl.GL_LIGHT0);
                // отрисовываем полигон
                Gl.glBegin(Gl.GL_QUADS);

                // указываем поочередно вершины и текстурные координаты
                Gl.glVertex3d(1, 1, 0);
                Gl.glTexCoord2f(0, 0);
                Gl.glVertex3d(1, 0, 0);
                Gl.glTexCoord2f(1, 0);
                Gl.glVertex3d(0, 0, 0);
                Gl.glTexCoord2f(1, 1);
                Gl.glVertex3d(0, 1, 0);
                Gl.glTexCoord2f(0, 1);

                // завершаем отрисовку
                Gl.glEnd();
                Gl.glEnable(Gl.GL_LIGHT0);
            }
        }

        public void OpenPictureSubstrate()
        {
            // открываем окно выбора файла
            DialogResult res = openFileDialog1.ShowDialog();

            // если файл выбран - и возвращен результат OK
            if (res == DialogResult.OK)
            {
                // создаем изображение с идентификатором imageId
                Il.ilGenImages(1, out imageId);
                // делаем изображение текущим
                Il.ilBindImage(imageId);

                // адрес изображения полученный с помощью окна выбора файла
                string url = openFileDialog1.FileName;

                // пробуем загрузить изображение
                if (Il.ilLoadImage(url))
                {
                    // если загрузка прошла успешно
                    // сохраняем размеры изображения
                    int width = Il.ilGetInteger(Il.IL_IMAGE_WIDTH);
                    int height = Il.ilGetInteger(Il.IL_IMAGE_HEIGHT);

                    // определяем число бит на пиксель
                    int bitspp = Il.ilGetInteger(Il.IL_IMAGE_BITS_PER_PIXEL);

                    switch (bitspp) // в зависимости оп полученного результата
                    {
                        // создаем текстуру используя режим GL_RGB или GL_RGBA
                        case 24:
                            mGlTextureObject = MakeGlTexture(Gl.GL_RGB, Il.ilGetData(), width, height);
                            break;
                        case 32:
                            mGlTextureObject = MakeGlTexture(Gl.GL_RGBA, Il.ilGetData(), width, height);
                            break;
                    }

                    // активируем флаг, сигнализирующий загрузку текстуры
                    textureIsLoad = true;
                    // очищаем память
                    Il.ilDeleteImages(1, ref imageId);


                }
            }

        }

        // создание текстуры
        private static uint MakeGlTexture(int Format, IntPtr pixels, int w, int h)
        {
            // идентификатор текстурного объекта
            uint texObject;

            // генерируем текстурный объект
            Gl.glGenTextures(1, out texObject);

            // устанавливаем режим упаковки пикселей
            Gl.glPixelStorei(Gl.GL_UNPACK_ALIGNMENT, 1);

            // создаем привязку к только что созданной текстуре
            Gl.glBindTexture(Gl.GL_TEXTURE_2D, texObject);

            // устанавливаем режим фильтрации и повторения текстуры
            Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_S, Gl.GL_REPEAT);
            Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_T, Gl.GL_REPEAT);
            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);
            Gl.glTexEnvf(Gl.GL_TEXTURE_ENV, Gl.GL_TEXTURE_ENV_MODE, Gl.GL_REPLACE);

            // создаем RGB или RGBA текстуру
            switch (Format)
            {
                case Gl.GL_RGB:
                    Gl.glTexImage2D(Gl.GL_TEXTURE_2D, 0, Gl.GL_RGB, w, h, 0, Gl.GL_RGB, Gl.GL_UNSIGNED_BYTE, pixels);
                    break;

                case Gl.GL_RGBA:
                    Gl.glTexImage2D(Gl.GL_TEXTURE_2D, 0, Gl.GL_RGBA, w, h, 0, Gl.GL_RGBA, Gl.GL_UNSIGNED_BYTE, pixels);
                    break;
            }

            // возвращаем индетефекатор текстурного объекта

            return texObject;
        }

        private void frmFlat2D_Load(object sender, EventArgs e)
        {
            IniGlut2D();          
        }

        private void AnT_MouseMove(object sender, MouseEventArgs e)
        {
            int X, Y;

            X = e.X;
            Y = e.Y;
            //Определяем глобальные координаты системы glOrto2D
            globalRealY = globalviewport[3] - Y - 1;
            Gl.glReadPixels(X, globalRealY, 1, 1, Gl.GL_DEPTH_COMPONENT, Gl.GL_FLOAT, @globalZval);
            Glu.gluUnProject(X, globalRealY, globalZval, @globalmvmatrix, @globalprojmatrix,
                @globalviewport, out globalwx, out globalwy, out globalwz);
            // Определяем местные координаты glFrusatum
            RealY = viewport[3] - Y - 1;
            Gl.glReadPixels(X, RealY, 1, 1, Gl.GL_DEPTH_COMPONENT, Gl.GL_FLOAT, @Zval);
            Glu.gluUnProject(X, RealY, Zval, @mvmatrix, @projmatrix, @viewport, out wx, out wy, out wz);

            SLX.Text = Convert.ToString(wx); //Покажем в StripStatusLabel
            SLY.Text = Convert.ToString(wy);
            SLZ.Text = Convert.ToString(wz);

            StatClass.staticlineX = (float)globalwx; //проба статического класса для передачи значения переменных между модулями

            if (WheelDownUp) // Перемещаем систему по осям Х и У
            {
                curposX = curpospredX - (StartDragX - (float)globalwx);
                curposY = curpospredY - (StartDragY - (float)globalwy);
            }

            Draw(); // перерисуем окно
        }
    }
}
 
 
Привет.

Ваше сообщение вынесено в отдельную тему.
Если на основе вашего кода собрать небольшое окно в windows form, и поправить координаты, то подложка отрисовывается

В блоке с подложкой текстуры DrawSubstrate() координаты вершин измените так, чтобы они накрывали весь блок simpleOpenGLControl:
Код
Gl.glVertex3d(100, 100, 0);Gl.glTexCoord2f(0, 0);
Gl.glVertex3d(100, 0, 0);
Gl.glTexCoord2f(1, 0);
Gl.glVertex3d(0, 0, 0);
Gl.glTexCoord2f(1, 1);
Gl.glVertex3d(0, 100, 0);
Gl.glTexCoord2f(0, 1);

На выходе подложка отрисовалась, поверх нее ваш курсор:

 
information must be free for all
 
Что-то я в прострации - ничего не могу сделать с текстурой. Вот весь проект, может посмотрите?
https://drive.google.com/file/d/0BxSuWjzbtFnxVUZwUnotdmJMem8/view?usp=sharing
 
Цитата
constX7 написал:
Что-то я в прострации - ничего не могу сделать с текстурой. Вот весь проект, может посмотрите?
https://drive.google.com/file/d/0BxSuWjzbtFnxVUZwUnotdmJMem8/view?usp=sharing
вы просто были не внимательны:

Если вы поставите брекпоинт на строке кода
Код
// включаем режим текстурирования , указывая идентификатор mGlTextureObject
Gl.glBindTexture(Gl.GL_TEXTURE_2D, mGlTextureObject);

то увидите, что mGlTextureObject = 0 даже после того, как в него записалось значение в функции
Код
mGlTextureObject = MakeGlTexture(Gl.GL_RGB, Il.ilGetData(), width, height);

Это говорит о том, что переменные разные и находятся в разных областях памяти. А значит переменные относятся к разным объектам. Отсюда приходим к коду:

Код
public frmGlobal()
{
    InitializeComponent();
    frmFlat2D child = new frmFlat2D(this);
    child.Show();
}

private void LoadSubstrateMenu_Click(object sender, EventArgs e) //Загрузка подложки
{
    frmFlat2D child = new frmFlat2D(this);
    child.OpenPictureSubstrate();
}

в функции LoadSubstrateMenu_Click это уже новый child (новый объект), а старый не затерся сборщиком мусора (в пятницу под пиво уже не хочется искать, почему его не прибивает сборщик мусора).

Вам нужно, чтобы child выходил за область видимости конструктора (а он у вас локальный). И с этим же child работать из LoadSubstrateMenu_Click
 
Ёх! Заработало!)))  Anvi, персональное спасибо! С меня ящик пива, то, которое любите. Сообщите адрес и марку пива, куда выслать.)
Изменено:constX7 - 6 Февраля 2016 09:14:31
 
:drink:
 
Цитата
constX7 написал:
С меня ящик пива, то, которое любите. Сообщите адрес и марку пива, куда выслать.)
Был рад помочь!

alita, на чужое пиво не засматрииваемся  :D
Страницы:1

Ответить
Читают тему (гостей: 1)
Форма ответов
Текст сообщения*
Загрузить файл или картинкуПеретащить с помощью Drag'n'drop
Перетащите файлы
Ничего не найдено
Загрузить картинки
ОтправитьОтменить
 
^
Регистрация
Регистрируясь, вы принимаете правила сайта. Если вы не получили код подтв. регистрации - не забудьте проверить папку спам.
Логин*
Email*
Пароль*
Подтверждение пароля*
 
Логин*
Код*
 
×
Восстановление пароля
Пожалуйста, заполните поля, после чего вы получите код подтверждения на ваш Email. Если код не пришел в течении нескольких минут - проверьте папку спам.
Логин

или Email
Логин*
Код подтверждения*
Новый пароль*
Подтверждение пароля*
×
Авторизация
  • Используйте вашу учетную запись на Facebook.com для входа на сайт.
  • Используйте вашу учетную запись VKontakte для входа на сайт.
  • Используйте вашу учетную запись Google для входа на сайт.
Авторизуйтесь с помощью соц. сети или с помощью аккаунта на сайте:
×