С Новым годом! Форум программистов, компьютерный форум, киберфорум
OpenGL
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/25: Рейтинг темы: голосов - 25, средняя оценка - 4.56
26 / 26 / 15
Регистрация: 17.02.2014
Сообщений: 310

Как рисовать текстуру и квадрат (GLUT и OpenGL)

01.02.2017, 11:33. Показов 5132. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Я хочу нарисовать текстуру и квадрат, но цвета не корректно отображаются.

Если я удаляю Таймер, цвет отображается правильно.
C++
1
glutTimerFunc(150, Timer, 0);
Но когда Таймер работает, цвета отображаются не правильно

вот текстуры, которые я рисую http"://"hkar"."ru"/"NtGe (без кавычек)
(к сожалению форум запрещает загрузить *.bmp)
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#include <GL\glut.h>
#include <stdio.h>
#include <cstdlib>
 
#define WIDTH 80
#define HEIGHT 45
 
GLuint  textura_id;
 
struct textura_struct
{
    int W;
    int H;
    unsigned char *Image;
}get_textura;
 
int LoadTexture(char *FileName)
{
    FILE *F;
    /* Open file */
    if ((F = fopen(FileName, "rb")) == NULL)
        return 0;
    fseek(F, 18, SEEK_SET);
    fread(&(get_textura.W), 2, 1, F);
    fseek(F, 2, SEEK_CUR);
    fread(&(get_textura.H), 2, 1, F);
 
    printf("%d x %d\n", get_textura.W, get_textura.H);
 
    /*allocate memory for image*/
    if ((get_textura.Image = (unsigned char *)malloc(sizeof(unsigned char) * 3 * get_textura.W * get_textura.H)) == NULL)
    {
        fclose(F);
        return 0;
    }
    /*read file*/
    fseek(F, 30, SEEK_CUR);
    fread(get_textura.Image, 3, get_textura.W * get_textura.H, F);
 
 
    glGenTextures(1, &textura_id);
    glBindTexture(GL_TEXTURE_2D, textura_id);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    gluBuild2DMipmaps(GL_TEXTURE_2D, 3, get_textura.W, get_textura.H, GL_BGR_EXT, GL_UNSIGNED_BYTE, get_textura.Image);
    free(get_textura.Image);
    fclose(F);
 
    return 1;
}
 
void draw() {   
    glClear(GL_COLOR_BUFFER_BIT);   
 
    glPushMatrix();
    glEnable(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, textura_id);
    glRotatef(0.0f, 0.0f, 0.0f, 1.0f);
    glBegin(GL_QUADS);
    glTexCoord2d(0, 0); glVertex2d(0, 0);
    glTexCoord2d(0, 1); glVertex2d(0, 30);
    glTexCoord2d(1, 1); glVertex2d(80, 30);
    glTexCoord2d(1, 0); glVertex2d(80, 0);
    glEnd();
    glDisable(GL_TEXTURE_2D);
    glPopMatrix();
 
    glBegin(GL_QUADS);
    glColor3f(1, 1, 0); glVertex2d(0, 30);
    glColor3f(1, 0, 1); glVertex2d(0, 45);
    glColor3f(1, 1, 0); glVertex2d(80, 45);
    glColor3f(0, 1, 0); glVertex2d(80, 30);
    glEnd();
 
    glutSwapBuffers();
}
 
void Timer(int) 
{
    draw();
    glutTimerFunc(150, Timer, 0);
}
 
int main(int argc, char ** argv) {
 
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
    glutInitWindowPosition(100, 50);
    glutCreateWindow("My simple texture");
    glutDisplayFunc(draw);
    glutTimerFunc(150, Timer, 0);
 
    glMatrixMode(GL_PROJECTION);    
    glOrtho(0, WIDTH, 0, HEIGHT, -1, 1);
 
    if (LoadTexture("s1.bmp") != 1) { printf("Error! Cannot open file\n"); }
    glutMainLoop();
    return(0);
}
Как рисовать текстуру и квадрат ?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
01.02.2017, 11:33
Ответы с готовыми решениями:

[OpenGL] Наложить текстуру на квадрат
Здравствуйте, нужна помощь) Нужно наложить текстура на квадрат, размеры которого можно регулировать кнопками. Код сказали написать на...

Как загрузить текстуру для определенной плоскости? Delph+Openg+Glut
Есть фигура в каркасном виде, и внутри его плоскости(сечение), как задать штриховку либо загрузить тукстуру. glPolygonStipple работает...

Как наложить не всю текстуру на квадрат?
Здравствуйте. Скажите пожалуйста можно ли наложить не всю текстуру на квадрат размер наложения меньше текстуры, с помощью шейдеров...

6
 Аватар для snake32
3504 / 1687 / 236
Регистрация: 26.02.2009
Сообщений: 8,404
Записей в блоге: 6
01.02.2017, 12:15
Цитата Сообщение от user-men Посмотреть сообщение
к сожалению форум запрещает загрузить *.bmp
Можно пережать в png/jpg и выложить. Или выложить в архиве 7z/rar.

user-men, скорее всего у вас разрешение строки текстуры(3*get_textura.W) не кратно 4 байтам. А в этом случае размер текстуры НЕ равен 3*get_textura.W*get_textura.H.
C++
1
2
3
const int align = 4;
int w = (get_textura.W*3+align-1)/align*align; //реальный размер строки в байтах (align 4);
get_textura.Image = (unsigned char *)malloc(w * get_textura.H);
1
26 / 26 / 15
Регистрация: 17.02.2014
Сообщений: 310
01.02.2017, 12:59  [ТС]
Изображение имеет расширение 64 * 64
sizeof(unsigned char) * 3 * get_textura.W * get_textura.H = 1 * 3 * 64 * 64 = 12 288

Почему-то всеравно не работает.
0
 Аватар для snake32
3504 / 1687 / 236
Регистрация: 26.02.2009
Сообщений: 8,404
Записей в блоге: 6
01.02.2017, 13:09
Скидывайте оригинал и результат работы(картинки)
1
26 / 26 / 15
Регистрация: 17.02.2014
Сообщений: 310
01.02.2017, 17:43  [ТС]
Спасибо
https://www.cyberforum.ru/atta... 1485960008
В проекте есть скриншот проблемы
Текстура лежит Project.rar\GLUT and OpenGL Textur\GLUT and OpenGL Textur\s1.bmp
Вложения
Тип файла: rar Project.rar (4.88 Мб, 34 просмотров)
0
 Аватар для snake32
3504 / 1687 / 236
Регистрация: 26.02.2009
Сообщений: 8,404
Записей в блоге: 6
01.02.2017, 18:10
Лучший ответ Сообщение было отмечено user-men как решение

Решение

user-men, проблема была в том что текстура по дефолту смешивается с цветом полигона( GL_DECAL). Так как после отрисовки второго полигона OpenGL запомнил зелёный цвет полигона с ним и смешивал на втором проходе.
Варианты решения:
1) Перед отрисовкой полигона с текстурой явно задавать белый цвет glColor3f(1,1,1);
2) Или сказать OpenGL чтобы он не смешивал текстуру с полигоном (в ф-ии загрузки текстуры)
glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_ MODE,GL_REPLACE);
1
26 / 26 / 15
Регистрация: 17.02.2014
Сообщений: 310
01.02.2017, 18:14  [ТС]
Спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
01.02.2017, 18:14
Помогаю со студенческими работами здесь

Как создать текстуру из данных для OpenGL?
Есть файлы с объектами для проекта под OpenGL, хочется использовать их в проекте для DirectX. С координами и нормалями проблемм нет. А...

Как скопировать созданную в OpenGL текстуру в обычный Bitmap
В соседней ветке задавал вопрос о копирования графики OpenGL сначала в текстуру, а потом - в Bitmap. Программку такую сделал, при...

Как подключить к проекту OpenGL и GLUT ?
В С++ я новичок, перехожу на него с С#, так что многого еще не понимаю. Необходимо подключить к моему классу GameWindow OpenGL и GLUT....

OpenGL - как разобраться с версиями glut
В заголовке темы нельзя оказывается совмещать русские и английские буквы, да еще и не все слова можно применять - позабавило :D С...

Как поставить OpenGL(glut) на Dev-C++?
Как поставить, вернее как правильно поставить OpenGL(glut) на Dev-C++? На MS Visual C++ Ставил норм, на деве не могу объясните, пожалуйста!


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru