382 / 181 / 47
Регистрация: 11.07.2013
Сообщений: 984
1

Почему при наложении текстуры изменяется цвет фигур без текстуры

27.11.2019, 11:29. Показов 3094. Ответов 12
Метки нет (Все метки)

Исходный вид, когда текстура не накладывалась (рис-1).
После наложения текстуры на одну из фигур изменился цвет второй фигуры (рис-2).
Причём, если текстура содержит больше красного, зелёного и т.п., то цвет нетекстурированной фигуры приобретает этот оттенок (красный, зелёный и т.п.)
Delphi
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
//---------------------Настройки для работы с текстурами----------------------
  //glMatrixMode (GL_TEXTURE); // Подключение текстурной матрицы.
  glEnable(GL_TEXTURE_2D); // Включить режим отображения текстуры.
  glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST); 
  glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST)
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
  glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, Tex1.Width, Tex1.Height,
              0, GL_RGB, GL_UNSIGNED_BYTE, @Tex1.Data[0]);
 //-----------------------Управление цветом------------------------------------
  glEnable(GL_COLOR_MATERIAL); 
  glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE); 
   . . . . . . . . . . .
   . . . . . . . . . . .
// Инициализация VBO-буффера в видеопамяти.
procedure TForm1.VBOInit;
begin
  if not flagIniGL then exit;
  VBOFree; // Очистить буферы видеопамяти, если он занят.
  glGenBuffers(1, @vID);
  glGenBuffers(1, @cID);
  glGenBuffers(1, @nID);
  glGenBuffers(1, @tID);
  //--------------------------
  glBindBuffer(GL_ARRAY_BUFFER, vID);
  glBufferData(GL_ARRAY_BUFFER, Length(vM)*3*sizeof(GLFLoat), @vM[0], GL_DYNAMIC_DRAW);
  glBindBuffer(GL_ARRAY_BUFFER, cID);
  glBufferData(GL_ARRAY_BUFFER, Length(cM)*4*sizeof(GLFLoat), @cM[0], GL_STATIC_DRAW);
  glBindBuffer(GL_ARRAY_BUFFER, nID);
  glBufferData(GL_ARRAY_BUFFER, Length(nM)*3*sizeof(GLFLoat), @nM[0], GL_DYNAMIC_DRAW);
  glBindBuffer(GL_ARRAY_BUFFER, tID);
  glBufferData(GL_ARRAY_BUFFER, Length(tM)*2*sizeof(GLFLoat), @tM[0], GL_DYNAMIC_DRAW);
  //--------------------------
  glBindBuffer(GL_ARRAY_BUFFER,0);
  //--------------------------
  Setlength(vM,30); // На всякий случай (взято из учебника).
  Setlength(cM,0);  
  Setlength(nM,30); 
  Setlength(nM,30); 
  flagVBO:=true;
end;
   . . . . . . . . . . .
   . . . . . . . . . . .
// Отрисовка BVO-буффера.
procedure TForm1.DrawBVO();
var
  n: Integer;
  D: GLuint;
begin
  if not flagVBO then exit;
  glEnableClientState(GL_VERTEX_ARRAY); 
  glEnableClientState(GL_NORMAL_ARRAY);
  glEnableClientState(GL_COLOR_ARRAY);
  glBindBuffer( GL_ARRAY_BUFFER, cID );
  glColorPointer(4, GL_FLOAT, 0, nil); 
  glBindBuffer(GL_ARRAY_BUFFER, nID );
  glNormalPointer(GL_FLOAT, 0, nil);
  glBindBuffer(GL_ARRAY_BUFFER, vID );
  glVertexPointer(3, GL_FLOAT, 0, nil);
  D:=0;
  for n:=0 to StripM1-1 do begin  // Фигура без текстуры.
    glDrawArrays(GL_QUAD_STRIP, D, CountM1);
    D:=D+CountM1
  end;
 
  glEnableClientState(GL_TEXTURE_COORD_ARRAY); // Подключаю текстуру здесь. 
  glBindBuffer(GL_TEXTURE_BUFFER, tID );
  glTexCoordPointer(2, GL_FLOAT, 0, nil);
 
  glBindBuffer(GL_ARRAY_BUFFER, 0);    // Прбовал здесь отключать цвет.
  glDisableClientState(GL_COLOR_ARRAY);
 
  glDrawArrays(GL_TRIANGLES, D, CountM2); // Фигура с текстурой.
 
  glBindBuffer(GL_ARRAY_BUFFER, 0);
  glDisableClientState(GL_VERTEX_ARRAY);
  glDisableClientState(GL_NORMAL_ARRAY);
//  glDisableClientState(GL_COLOR_ARRAY); // Пробовал здесь.
  glDisableClientState(GL_TEXTURE_COORD_ARRAY);
end;
В чём может быть причина?
Миниатюры
Почему при наложении текстуры изменяется цвет фигур без текстуры   Почему при наложении текстуры изменяется цвет фигур без текстуры  
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.11.2019, 11:29
Ответы с готовыми решениями:

Затемнение при наложении текстуры (glaux)
Здравствуйте! Подскажите пожалуйста, в чем может быть проблема? Создаю 2д текстуру (просто как...

Почему измененяется цвет текстуры?
Пожайлуста посоветуйте. ris_1 - загрузил из ресурсов как фон. Потом надо нарисовать что то, в...

Ошибка при наложении текстуры в OGL
Помогите пожалуйста! При наложении текстуры в строчке texture1 = auxDIBImageLoad("tex.bmp"); ...

Как побитово скопировать с текстуры на текстуры разных форматов, не прибегая к обращениям в CPU?
Если ли способ в opengl скопировать бит в бит текстуры любого формата в uint8 одноканальный, но с...

12
с++
1282 / 523 / 225
Регистрация: 15.07.2015
Сообщений: 2,562
27.11.2019, 12:55 2
Цитата Сообщение от shyub Посмотреть сообщение
Почему при наложении текстуры изменяется цвет фигур без текстуры
а если после цыкла
C++
1
2
glDisableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);
0
382 / 181 / 47
Регистрация: 11.07.2013
Сообщений: 984
27.11.2019, 13:15  [ТС] 3
Проверил. Цвет не текстурированной фигуры не стал нормальным, а текстурированная фигура вообще пропала.
Миниатюры
Почему при наложении текстуры изменяется цвет фигур без текстуры  
0
1471 / 826 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
27.11.2019, 20:49 4
Может сфера не из треугольников.
glDrawArrays(GL_QUAD_STRIP, D, CountM1);
glDrawArrays(GL_TRIANGLES, D, CountM2);
0
с++
1282 / 523 / 225
Регистрация: 15.07.2015
Сообщений: 2,562
27.11.2019, 20:59 5
Цитата Сообщение от shyub Посмотреть сообщение
Проверил
а если убрать 2-ю фигуру с текстурами и всем оставить только первую или вторую фигуру с текстурой, конечно предварительно сохранить старый код, а glColor3f нельзя использовать?
0
382 / 181 / 47
Регистрация: 11.07.2013
Сообщений: 984
27.11.2019, 21:39  [ТС] 6
Сфера не из треугольников:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
or iy:=0 to ny-1 do begin
    for ix:=0 to nx do begin
      vM[n].X:=R*sin (iy*pi/ny)*cos(2*ix*pi/nx);
      vM[n].Y:=R*sin (iy*pi/ny)*sin(2*ix*pi/nx);
      vM[n].Z:=R*cos(iy*pi/ny);
      nM[n].X:=vM[n].X;
      nM[n].Y:=vM[n].Y;
      nM[n].Z:=vM[n].Z;
      n:=n+1;
      vM[n].X:= R*sin ((iy+1)*pi/ny)*cos(2*ix*pi/nx);
      vM[n].Y:= R*sin ((iy+1)*pi/ny)*sin(2*ix*pi/nx);
      vM[n].Z:= R*cos((iy+1)*pi/ny);
      nM[n].X:=vM[n].X;
      nM[n].Y:=vM[n].Y;
      nM[n].Z:=vM[n].Z;
      n:=n+1;
    end;
  end;
Цитата Сообщение от Antikl Посмотреть сообщение
а если убрать 2-ю фигуру с текстурами и всем оставить...
Вот я отключил загрузку текстуры и всё стало но свои места.
Миниатюры
Почему при наложении текстуры изменяется цвет фигур без текстуры  
0
382 / 181 / 47
Регистрация: 11.07.2013
Сообщений: 984
27.11.2019, 21:40  [ТС] 7
Может что-т при загрузки текстуры у меня не правильно:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// Загрузка текстур из файла.
procedure TForm1.LoadTextureFromBMP(const AFileName: String; var ATexture: TGLTexture);
var
  i, j: Integer;
  bmp: TBitmap;
begin
  bmp := TBitmap.Create;
  try
    bmp.LoadFromFile(AFileName); // Загрузка рисунка в битовую матрицу.
    ATexture.Height:= bmp.Height; // Размер текстуры.
    ATexture.Width := bmp.Width;
    SetLength(ATexture.Data, bmp.Width* bmp.Height*3); // Установить размер массива.
    for i:=0 to bmp.Height-1 do // Заполнение динамического массива.
      for j:=0 to bmp.Width-1 do begin
        ATexture.Data[(i*bmp.Width+j)*3+0]:=GetRValue(bmp.Canvas.Pixels[j, i]);
        ATexture.Data[(i*bmp.Width+j)*3+1]:=GetGValue(bmp.Canvas.Pixels[j, i]);
        ATexture.Data[(i*bmp.Width+j)*3+2]:=GetBValue(bmp.Canvas.Pixels[j, i]);
      end;
  finally
    bmp.Free; // По окончанию не забыть удалить битовую матрицу.
  end;
end;
0
647 / 229 / 45
Регистрация: 24.01.2013
Сообщений: 694
27.11.2019, 22:32 8
Это же безшейдерный рендер?
Надеюсь вы вызываете glDisable(GL_TEXTURE_2D) перед отрисовкой сферы?

Покажите код рисования кадра.
0
382 / 181 / 47
Регистрация: 11.07.2013
Сообщений: 984
27.11.2019, 22:41  [ТС] 9
Цитата Сообщение от _Develop Посмотреть сообщение
Покажите код рисования кадра.
В начале темы.
0
647 / 229 / 45
Регистрация: 24.01.2013
Сообщений: 694
27.11.2019, 22:48 10
Цитата Сообщение от shyub Посмотреть сообщение
В начале темы.
что там в начале?

покажите код где вызывается ваш DrawBVO
0
382 / 181 / 47
Регистрация: 11.07.2013
Сообщений: 984
27.11.2019, 23:52  [ТС] 11
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// Отрисовка в OpenGLControl.
procedure TForm1.OpenGLControl1Paint(Sender: TObject);
begin
  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();
  gluPerspective(30.0, OpenGLControl1.Width/OpenGLControl1.Height, 0.1, 15);
  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity();
  glTranslatef(Xsm, Ysm, -(5+Gkam));
  glRotatef(Xkam, 1,0,0);
  glRotatef(Ykam*5, 0,1,0);
  glRotatef(Zkam*5, 0,0,1);
  DrawBVO;
  OpenGLControl1.SwapBuffers;
end;
0
647 / 229 / 45
Регистрация: 24.01.2013
Сообщений: 694
28.11.2019, 02:13 12
Лучший ответ Сообщение было отмечено shyub как решение

Решение

Цитата Сообщение от shyub Посмотреть сообщение
glEnableClientState(GL_TEXTURE_COORD_ARRAY); // Подключаю текстуру здесь.
Вот этой строкой вы не "подключаете текстуру", а всего лишь задаете текстурные координаты в вершинах модели.
Для подключения/отключения режима текстурирования есть функции - glEnable(GL_TEXTURE_2D) и glDisable(GL_TEXTURE_2D) (есть еще glBindTexture() для переключения между текстурами).

У вас сейчас оба объекта рисуются с текстурой, но так как для сферы ТК не заданы, то они берутся для всех вершин одни и теже значения заданные по дефолту (какие именно, можно глянуть в доках, но это не важно). Поэтому сфера меняет цвет (ТК попадают в коричневый тексель текстуры).

Не по теме:

Вообще глядя на ваш код, слов нет кроме - "El sueño de la razón produce monstruos" (с)
Сделайте отдельный VBO для каждого объекта и рисуйте их по отдельности, устанавливая при этом нужные режимы.
Или в одном VBO, но хотя бы две функции draw(). А то все в одной куче, где черт ногу сломит.
Потом сна ровном месте ищите ошибки... Одним словом - кодестайл жжот напалмом.))

1
382 / 181 / 47
Регистрация: 11.07.2013
Сообщений: 984
28.11.2019, 11:29  [ТС] 13
Да, моя ошибка была в том, что glEnable(GL_TEXTURE_2D) я включал при инициализации OpenGL, а не на время отрисовки.
Миниатюры
Почему при наложении текстуры изменяется цвет фигур без текстуры  
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.11.2019, 11:29
Помогаю со студенческими работами здесь

Поворот Текстуры (не вращая полигон текстуры)
Возник такой вопрос? Как повернуть текстуру на какой то определенный градус не вращая при этом...

Не получается вырезание фигур по маске из текстуры в 2D игре
Здравствуйте! Возникла проблема с вырезанием фигур в текстуре по маске, не могу понять как это...

Цвет динамичного объекта на фоне статичной текстуры
Здравствуйте, я работаю над OpenGL и Box2D проектом. Вид сбоку, можно управлять машинкой, влево,...

Посчитать средний цвет текстуры и вернуть некоторую переменную из шейдера
В общем возникла пара новых вопросов по OpenGl. 1) Есть привязанная к фреймбуферу текстура, как...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru