Форум программистов, компьютерный форум, киберфорум
OpenGL
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/35: Рейтинг темы: голосов - 35, средняя оценка - 4.77
Пробующий
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
1

OpenGl под C#. Текстура отображается неверно

20.06.2009, 15:18. Показов 6895. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Недавно разобрался как использовать Tao для взаимодействия OpenGL и C#, и вот возникла проблемка.
Написал прогу для привязки текстуры к квадрату. Все бы хорошо, проект рабочий, можете попробовать запустить (файл избражения текстуры копируйте в папку Наименование диска с проектом:\...\Название папки, содержащей проект(обычно совпадает с наименованием проекта)\bin\Debug\"Texture.bmp"(например)).
Пример: E:\projectsWS2008\Texture_begin\bin\Debug\"Texture.bmp"
Но 2 проблемы:
1) отображаются 4 одинаковых текстуры вместо одной:
HTML5
1
2
Вот результат программы: <img src="http://************.com/files/kvgmlewjb">
 А вот сама текстура: <img src="http://************.com/files/8radss0gx">
2) На изображениях заметно, что текстуры перевернуты, и красный цвет отображается синим, а синий - красным.
Вот код программы:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
 private void Draw()
        {
  const int FC_TextureCount = 1;  
  int[] Textures = new int[FC_TextureCount];
  Gl.glEnable(Gl.GL_TEXTURE_2D);
  Gl.glGenTextures(FC_TextureCount, Textures);
  Gl.glBindTexture(Gl.GL_TEXTURE_2D, Textures[0]);
 
  Bitmap bitmap = new Bitmap("Texture.bmp");
  System.Drawing.Imaging.BitmapData data;
  Rectangle Rect = new Rectangle(0, 0, bitmap.Width, bitmap.Height);
  data = bitmap.LockBits(Rect, System.Drawing.Imaging.ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppRgb);
  Gl.glTexImage2D(Gl.GL_TEXTURE_2D, 0,
                  Gl.GL_RGBA, data.Width, data.Height, 0,
                  Gl.GL_RGBA, Gl.GL_UNSIGNED_BYTE, data.Scan0);
  bitmap.UnlockBits(data);
  Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MIN_FILTER, Gl.GL_LINEAR);
  Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, Gl.GL_LINEAR);
 
  Gl.glClearColor(1.0f, 1.0f, 1.0f, 1.0f); // белый фон не влияет на изображение
  Gl.glClear(Gl.GL_COLOR_BUFFER_BIT); // очистка буфера
 
  Gl.glBegin(Gl.GL_QUADS);
  Gl.glTexCoord2d(-1.0, -1.0);
  Gl.glVertex2f(-1.0f, -1.0f);
 
  Gl.glTexCoord2d(-1.0f, 1.0f);
  Gl.glVertex2f(-1.0f, 1.0f);
 
  Gl.glTexCoord2d(1.0, 1.0f);
  Gl.glVertex2f(1.0f, 1.0f);
 
  Gl.glTexCoord2d(1.0f, -1.0f);
  Gl.glVertex2f(1.0f, -1.0f);
  Gl.glEnd();
        }
    }
Помогите исправить ошибку. Жду ответов с нетерпением. Заранее благодарен.

Добавлено через 1 минуту 39 секунд
Еще раз кину ссылки на текстуру:
Результат программы:
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.06.2009, 15:18
Ответы с готовыми решениями:

Текстура отображается неверно
На объекте текстура отображается неверно, вместо одной, наложилось 4. Получилось 4 текстуры на...

OpenGL + Win8, не отображается текстура
Столкнулся с такой проблемой у меня не отображается текстура, не выдаёт ошибку, просто белый...

Не отображается текстура SDL + OpenGL
Вот код SDL_Window *window = NULL; SDL_Surface *surf = NULL; SDL_GLContext glContext;...

Не загружается текстура в OpenGL (OpenGL + Классы)
Здравствуйте! Пишу движок для игры. Первый прототип я сделал процедурно. Все работает как надо. ...

8
12 / 12 / 3
Регистрация: 26.12.2009
Сообщений: 34
26.12.2009, 19:25 2
Gl.glTexImage2D(Gl.GL_TEXTURE_2D, 0, Gl.GL_RGBA, data.Width, data.Height, 0, Gl.GL_BGRA, Gl.GL_UNSIGNED_BYTE, data.Scan0);
от так вроде работает.
1
Пробующий
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
28.12.2009, 18:20  [ТС] 3
А полный код можно? У меня так не работает И если есть, то проект прикрепите пожалуйста. Я пробовал, не помогло.
0
3419 / 1606 / 236
Регистрация: 26.02.2009
Сообщений: 7,854
Записей в блоге: 5
28.12.2009, 18:47 4
1. Формат файла BMP - это не RGB, а BGR. Есть 2 варианта: первое, обменять байты отвечающие R и B вручную перед вызовом glTexImage2D. Второе, более простое, но не везде прописана константа, использовать константу GL_BGR или GL_BGR_EXT как показал skif3d. Только без Альфы, тк в данной текстуре такого канала нет.
2. Текстурные координаты неверно заданы, если хотите чтобы была 1 картинка а не 4. На сколько я помню....хотя сейчас гляну как правильно.

Добавлено через 2 минуты
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
Gl.glBegin(Gl.GL_QUADS);
  Gl.glTexCoord2d(0.0, 0.0);
  Gl.glVertex2f(-1.0f, -1.0f);
 
  Gl.glTexCoord2d(0.0f, 1.0f);
  Gl.glVertex2f(-1.0f, 1.0f);
 
  Gl.glTexCoord2d(1.0, 1.0f);
  Gl.glVertex2f(1.0f, 1.0f);
 
  Gl.glTexCoord2d(1.0f, 0.0f);
  Gl.glVertex2f(1.0f, -1.0f);
  Gl.glEnd();
Вроде должно так работать.
1
12 / 12 / 3
Регистрация: 26.12.2009
Сообщений: 34
28.12.2009, 20:51 5
ну вообще-то я твой код подчистую содрал :)
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
            const int FC_TextureCount = 1;  
            int[] Textures = new int[FC_TextureCount];
            Gl.glEnable(Gl.GL_TEXTURE_2D);
            Gl.glGenTextures(FC_TextureCount, Textures);
            Gl.glBindTexture(Gl.GL_TEXTURE_2D, Textures[0]);
            Bitmap bitmap = new Bitmap("D:\\asd.jpg");
            System.Drawing.Imaging.BitmapData data;
            Rectangle Rect = new Rectangle(0, 0, bitmap.Width, bitmap.Height);
            data = bitmap.LockBits(Rect, System.Drawing.Imaging.ImageLockMode.ReadOnly,
                System.Drawing.Imaging.PixelFormat.Format32bppRgb);
            Gl.glTexImage2D(Gl.GL_TEXTURE_2D, 0,
                Gl.GL_RGBA,
                /*Gl.GL_RGBA,*/ data.Width, data.Height, 0,
                Gl.GL_BGRA, Gl.GL_UNSIGNED_BYTE, data.Scan0);
            bitmap.UnlockBits(data);
            Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MIN_FILTER, Gl.GL_LINEAR);
            Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, Gl.GL_LINEAR);
 
            int xx = 200;
            int yy = 200;            
            Gl.glBegin(Gl.GL_QUADS);
            Gl.glTexCoord2i(0, 0); Gl.glVertex3i(xx + 1, yy + 1, 0);
            Gl.glTexCoord2i(0, 1); Gl.glVertex3i(xx + 1, yy + CS - 1, 0);
            Gl.glTexCoord2i(1, 1); Gl.glVertex3i(xx + CS - 1, yy + CS - 1, 0);
            Gl.glTexCoord2i(1, 0); Gl.glVertex3i(xx - 1 + CS, yy + 1, 0);
            Gl.glEnd();
вот как-то так
только у меня текстура рисуется вверх тормашками :)
проект прикрепить не могу (не из вредности - там до фига лишнего идет)
1
Пробующий
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
28.12.2009, 21:19  [ТС] 6
Да дело в том, что это как раз главный баг: текстура постоянно инциализируется перевернутой. Это так по умолчанию. А как это обойти я не знаю. Т. е. я знаю! Но это не эффективный метод. Там ручками можно по байту инициализировать текстуру. Но хочется проще.

Добавлено через 1 минуту
Ладно. я понял почти. Только почему их 4 все равно не пойму((

Добавлено через 33 секунды
А ргб - рбг это я знал. Просто забыл. Ну все равно спасибо
0
3419 / 1606 / 236
Регистрация: 26.02.2009
Сообщений: 7,854
Записей в блоге: 5
28.12.2009, 22:51 7
Цитата Сообщение от galileopro Посмотреть сообщение
Там ручками можно по байту инициализировать текстуру. Но хочется проще.
Есть ещё один очень простой способ. Задать на самом примитиве перевёрнутые текстурные координаты. Только это подойдёт если все текстуры будут bmp тк только в нём строки растра сохранены в обратном порядке, на сколько я помню. С TGA форматом всё ровно будет работать без лишних переворотов. Кстати, проверь это. Пересохрани в тга формат и загрузи его, если в C# есть стандартные ф-ии для работы с тарга файлами.(я в С# не кую)

Цитата Сообщение от galileopro Посмотреть сообщение
Только почему их 4 все равно не пойму
Лучше попробуй почитать док-цию или любую книгу по ОГЛу. Там всё прекрасно написано. Попробуй разобратся сам. Пойми каким образом текстура привязывается к примитиву. Если что конкретно не понятно, то попробую объяснить.

Добавлено через 9 минут
Наводящий вопрос:
Сколько текстур разместится на интервале [-1, 1](текстурные коодинаты)?
1
Пробующий
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,101
28.12.2009, 23:11  [ТС] 8
А ну да. От 0 до 1. Я понял. Спасибо. Я просто давно в OpenGL не сидел. У нас как-бы предмет закончился, ну а по собственным нуждам пока не было.
Цитата Сообщение от snake32 Посмотреть сообщение
ф-ии для работы с тарга файлами.(я в С# не кую)
Не уверен, но роде Image.Load() это делает.
И потом можно этот тга на битмапку натянуть и пересохранить в бмп.
Хотя радует тот факт, что скоро будут новые версии tao. Так что всем, кто шарпит) это полезно.
1
12 / 12 / 3
Регистрация: 26.12.2009
Сообщений: 34
28.12.2009, 23:57 9
Хотя радует тот факт, что скоро будут новые версии tao. Так что всем, кто шарпит) это полезно
откуда такая информация?
там даже форум давненько не обновлялся
даже собираюсь на OpenTl переползать.
0
28.12.2009, 23:57
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.12.2009, 23:57
Помогаю со студенческими работами здесь

2d текстура в openGL
3 дня дерзаю интернет, так и не наткнулся ни на 1 полностью реализованный рабочий пример по вставки...

Opengl, текстура
Добрый день. Помогите разобраться почему текстура не прорисовывается. Что я делаю неправильно?...

Текстура OpenGL es 2
Доброго времени суток. Возникла такая проблема. Пишу 3D гоночки(eclipse+android sdk+openGL es 2) ,...

Текстура и OpenGL
Собрал например шар, ниже часть кода от него. Можно ли в OpenGL одеть текстуру на этот шар? ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru