Модераторы: Rickert, Alexeis, BorisVorontsov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как реализовать изменение текстуры? 
V
    Опции темы
Baton2007
Дата 28.10.2008, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 117
Регистрация: 29.11.2007

Репутация: нет
Всего: нет



Подскажите как сделать чтобы при нажатии клавиши на объект загружалась новая текстура??????
Я пробовал сделать , компиляция ошибок не выдает но и изменений при нажатии на клавишу не происходит!
Код

#include <windows.h>
#include <math.h>

#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>

#pragma comment (lib,"opengl32.lib")
#pragma comment (lib,"glu32.lib")
#pragma comment (lib,"glut32.lib")

#include <GL/loadTGA.h>        // Подключаем модуль для загрузки текстуры.
WPARAM wParam;
TextureImage texture1;
TextureImage texture2;
TextureImage texture3;

float rot =0;

//------------------------------------------------------------------------------------
// Изменение размеров окна.
//------------------------------------------------------------------------------------
void resize(int width,int height)
{
   glViewport(0,0,width,height);
   glMatrixMode( GL_PROJECTION );
   glLoadIdentity();
   glOrtho(-5,5, -5,5, 2,12);   
   gluLookAt( 0,0,5, 0,0,0, 0,1,0 );
   glMatrixMode( GL_MODELVIEW );
}    

//------------------------------------------------------------------------------------
// Построение отображаемого изображения.
//------------------------------------------------------------------------------------
void display(void)
{
 glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
 glLoadIdentity();

 glEnable(GL_TEXTURE_2D);
 
 glBindTexture(GL_TEXTURE_2D, texture1.texID);
 
 glBegin(GL_QUADS);
  glTexCoord2f(1.0f, 0.0f); glVertex3f( 2,  2,  0);    
  glTexCoord2f(0.0f, 0.0f); glVertex3f(-2,  2,  0);    
  glTexCoord2f(0.0f, 1.0f); glVertex3f(-2, -2,  0);    
  glTexCoord2f(1.0f, 1.0f); glVertex3f( 2, -2,  0);    
 glEnd();
 
 glDisable(GL_TEXTURE_2D);
 
   glutSwapBuffers();        // Вывод изображения на экран

switch (wParam)
 {case VK_LEFT:
             
             glEnable(GL_TEXTURE_2D); 
             glBindTexture(GL_TEXTURE_2D, texture2.texID);
 
             glBegin(GL_QUADS);
             glTexCoord2f(1.0f, 0.0f); glVertex3f( 2,  2,  0);    
             glTexCoord2f(0.0f, 0.0f); glVertex3f(-2,  2,  0);    
             glTexCoord2f(0.0f, 1.0f); glVertex3f(-2, -2,  0);    
             glTexCoord2f(1.0f, 1.0f); glVertex3f( 2, -2,  0);    
             glEnd(); 
             glDisable(GL_TEXTURE_2D); 
             glutSwapBuffers();        // Вывод изображения на экран}
}
}
void timf(int value) 
{
 glutPostRedisplay();         // Перерисовываем окно.
 glutTimerFunc(40, timf, 0);  // Устанавливаем новый таймер.
}

//------------------------------------------------------------------------------------
void main(int argc, char *argv[])
{
    glutInit(&argc, argv);                            // Инициализация библиотеки GLUT.
    glutInitWindowSize(800, 800);                    // Создание окна размерами 800 на 800 точек.
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);    // Задание параметров экрана.

    glutCreateWindow("Работа с текстурами");        // Создание графического окна с заголовком.
    


    glutReshapeFunc(resize);    // Устанавливаем функцию для изменения размеров окна.
    glutDisplayFunc(display);   // Устанавливаем функцию для перерисовки окна.
    glutTimerFunc(40, timf, 0); // Устанавливаем таймер на 40миллисекунд, это примерно 25 fps

  glEnable(GL_DEPTH_TEST);            // Включение теста глубины
  glEnable(GL_COLOR_MATERIAL);        // Включение раскрашивания поверхностей.
  glEnable(GL_LIGHT0);                // Включаем один источник света по умолчанию.
//  glEnable(GL_LIGHTING);            // Включаем освещение.
  
    LoadTGA(&texture1, ".\\Images\\animal.tga");
    LoadTGA(&texture2, ".\\Images\\nd.tga");
  
    glutMainLoop();                    // Вызов бесконечного цикла.
}


PM MAIL   Вверх
Rickert
Дата 28.10.2008, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: 2
Всего: 52



А что происходит?
ЗЫ
Генерацию текстур делали? Что за LoadTGA ?


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
Baton2007
Дата 28.10.2008, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 117
Регистрация: 29.11.2007

Репутация: нет
Всего: нет



При нажатии клавиши ничего не происходит !
LoadTGA я выдрал из примеров выглядит он так:
Код

//------------------------------------------------------------------------------------------------
// Модуль для загрузки текстуры из TGA файла.
//------------------------------------------------------------------------------------------------

#ifndef _LOAD_TGA
#define _LOAD_TGA

#include <GL/gl.h>
#include <GL/glu.h>
#include <stdio.h>

typedef struct         // Создаем структуру описывающую TGA изображение.
{
  GLubyte  *imageData; // Данные изображения
  GLuint  bpp;         // Цветность изображения в битах на пиксель.
  GLuint  width;       // Ширина изображения
  GLuint  height;      // Высота изображения
  GLuint  texID;       // ID текстуры используемый для выбора текстуры
} TextureImage;        // Имя структуры



bool LoadTGA(TextureImage *texture, char *filename);   // Загрузка TGA файла в память.



//------------------------------------------------------------------------------------
// Загрузка текстуры из TGA Файла.
// Поддерживает 24 или 32 битные текстуры с альфа каналом.
//------------------------------------------------------------------------------------
bool LoadTGA(TextureImage *texture, char *filename)   // Загрузка TGA файла в память

{    

  GLubyte    TGAheader[12]={0,0,2,0,0,0,0,0,0,0,0,0}; // Заголовок несжатого TGA
  GLubyte    TGAcompare[12]; // Используется для сравнения заголовка TGA
  GLubyte    header[6];      // Первые 6 полезных байт заголовка
  GLuint     bytesPerPixel;  // Число байт на пиксель в файле TGA
  GLuint     imageSize;      // Используется для сохранения размера изображения
  GLuint     temp;           // Временная переменная
  GLuint     type=GL_RGBA;   // Режим GL по-умолчанию RBGA (32 BPP)


  FILE *file = fopen(filename, "rb"); // Открыть TGA файл

 // Если файл существует и 12 байт прочитаны и заголовок совпал и прочитаны
 // следующие 6 байт, то все нормально, иначе не удача

  if( file==NULL ||
    fread(TGAcompare,1,sizeof(TGAcompare),file)!=sizeof(TGAcompare) ||
    memcmp(TGAheader,TGAcompare,sizeof(TGAheader))!=0 ||
    fread(header,1,sizeof(header),file)!=sizeof(header))

  {
    if (file == NULL)          // Файл не существует? *Добавлено Jim Strong*
      return FALSE;            // вернуть FALSE
    else                       // иначе
    {
      fclose(file);            // Закрыть файл
      return FALSE;            // вернуть FALSE
    }
  }

  texture->width  = header[1] * 256 + header[0]; // Определить ширину (highbyte*256+lowbyte)
  texture->height = header[3] * 256 + header[2]; // Определить высоту (highbyte*256+lowbyte)
 
   if( texture->width <=0 ||             // Ширина меньше или равна чем 0
       texture->height <=0 ||            // Высота меньше или равна чем 0
       (header[4]!=24 && header[4]!=32)) // TGA 24 или 32 бита?
  {

    fclose(file);              // Если не так, то закрыть файл
    return FALSE;              // вернуть FALSE
  }

  texture->bpp = header[4];             // Получить число бит на пиксель (24 или 32)
  bytesPerPixel = texture->bpp/8;       // Разделить на 8, чтобы получить байт на пиксель

                                        // Вычислить размер памяти для данных TGA
  imageSize = texture->width*texture->height*bytesPerPixel;
  texture->imageData=(GLubyte *)malloc(imageSize); // Выделить память для данных TGA

  if( texture->imageData==NULL ||       // Память выделена?
       // Прочитано верное число байт?
      fread(texture->imageData, 1, imageSize, file)!=imageSize)
  {
    if(texture->imageData!=NULL) // Если память выделена
       free(texture->imageData); // Освободить память

    fclose(file);                // Закрыть файл
    return FALSE;                // вернуть FALSE
  }

  for(GLuint i=0; i<int(imageSize); i+=bytesPerPixel) // Цикл по данным
  {                  // Смена местами первого и третьего байтов ('R'ed и 'B'lue)
    temp=texture->imageData[i]; // Временно сохраняем значение
    texture->imageData[i] = texture->imageData[i + 2]; // Третий байт на место первого
    texture->imageData[i + 2] = temp; // Первый байт на место третьего
  }

  fclose (file); // Закрыть файл

  // Построить текстуру из данных
  glGenTextures(1, &texture[0].texID); // Генерировать ID текстуры OpenGL

  glBindTexture(GL_TEXTURE_2D, texture[0].texID); // Привязка текстуры
  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);  // Линейная
  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);  // фильтрация

  if (texture[0].bpp==24) // Если TGA 24 бита
  {
    type=GL_RGB;          // Тогда 'type' равен GL_RGB
  }

  glTexImage2D(GL_TEXTURE_2D, 0, type,
               texture[0].width, texture[0].height,
               0, type, GL_UNSIGNED_BYTE, texture[0].imageData);

  return true; // Текстура построена, вернуть True
}


#endif


PM MAIL   Вверх
Rickert
Дата 28.10.2008, 17:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: 2
Всего: 52



Проверьте раз: грузится ли вообще вторая текстура?
Проверьте два: срабатывает ли нажатие клавиши?


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
Baton2007
Дата 29.10.2008, 17:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 117
Регистрация: 29.11.2007

Репутация: нет
Всего: нет



Все исправил не работало нажатие клавиши!
А какими dll`ками надо  снабдить прогу чтобы она работала и на других компах???


Рабочая прога если кому понадобиться!
Код

#include <windows.h>
#include <math.h>

#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>

#pragma comment (lib,"opengl32.lib")
#pragma comment (lib,"glu32.lib")
#pragma comment (lib,"glut32.lib")

#include <GL/loadTGA.h>        // Подключаем модуль для загрузки текстуры.

TextureImage texture1;
TextureImage texture2;
TextureImage texture3;

float rot =0;

//------------------------------------------------------------------------------------
// Изменение размеров окна.
//------------------------------------------------------------------------------------
void resize(int width,int height)
{
   glViewport(0,0,width,height);
   glMatrixMode( GL_PROJECTION );
   glLoadIdentity();
   glOrtho(-5,5, -5,5, 2,12);   
   gluLookAt( 0,0,5, 0,0,0, 0,1,0 );
   glMatrixMode( GL_MODELVIEW );
}    

//------------------------------------------------------------------------------------
// Построение отображаемого изображения.
//------------------------------------------------------------------------------------
void display(void)
{
 glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
 glLoadIdentity();

 glEnable(GL_TEXTURE_2D);
 
 glBindTexture(GL_TEXTURE_2D, texture1.texID);
 
 glBegin(GL_QUADS);
  glTexCoord2f(1.0f, 0.0f); glVertex3f( 2,  2,  0);    
  glTexCoord2f(0.0f, 0.0f); glVertex3f(-2,  2,  0);    
  glTexCoord2f(0.0f, 1.0f); glVertex3f(-2, -2,  0);    
  glTexCoord2f(1.0f, 1.0f); glVertex3f( 2, -2,  0);    
 glEnd();
 
 glDisable(GL_TEXTURE_2D);
 
   glutSwapBuffers();        // Вывод изображения на экран
}
void key_special_listen(int sym, int x, int y)
{
    if(sym == GLUT_KEY_HOME)
 {
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
 glLoadIdentity();
 glEnable(GL_TEXTURE_2D); 
 glBindTexture(GL_TEXTURE_2D, texture2.texID); 
 glBegin(GL_QUADS);
  glTexCoord2f(1.0f, 0.0f); glVertex3f( 2,  2,  0);    
  glTexCoord2f(0.0f, 0.0f); glVertex3f(-2,  2,  0);    
  glTexCoord2f(0.0f, 1.0f); glVertex3f(-2, -2,  0);    
  glTexCoord2f(1.0f, 1.0f); glVertex3f( 2, -2,  0);    
 glEnd(); 
 glDisable(GL_TEXTURE_2D); 
   glutSwapBuffers();        // Вывод изображения на экран
 }
    if(sym == GLUT_KEY_END)
 {
 glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
 glLoadIdentity();
 glEnable(GL_TEXTURE_2D); 
 glBindTexture(GL_TEXTURE_2D, texture3.texID); 
 glBegin(GL_QUADS);
  glTexCoord2f(1.0f, 0.0f); glVertex3f( 2,  2,  0);    
  glTexCoord2f(0.0f, 0.0f); glVertex3f(-2,  2,  0);    
  glTexCoord2f(0.0f, 1.0f); glVertex3f(-2, -2,  0);    
  glTexCoord2f(1.0f, 1.0f); glVertex3f( 2, -2,  0);    
 glEnd(); 
 glDisable(GL_TEXTURE_2D); 
   glutSwapBuffers();        // Вывод изображения на экран 
  
 }
    if(sym == GLUT_KEY_LEFT)
    {
 glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
 glLoadIdentity();

 glEnable(GL_TEXTURE_2D);
 
 glBindTexture(GL_TEXTURE_2D, texture1.texID);
 
 glBegin(GL_QUADS);
  glTexCoord2f(1.0f, 0.0f); glVertex3f( 2,  2,  0);    
  glTexCoord2f(0.0f, 0.0f); glVertex3f(-2,  2,  0);    
  glTexCoord2f(0.0f, 1.0f); glVertex3f(-2, -2,  0);    
  glTexCoord2f(1.0f, 1.0f); glVertex3f( 2, -2,  0);    
 glEnd();
 
 glDisable(GL_TEXTURE_2D);
 
   glutSwapBuffers();        // Вывод изображения на экран
    }
}
//---------------------------------------------------------------------------------------------
// Функция обработки таймера.
// На вход получает номер текущего таймера, который ее вызвал.
//---------------------------------------------------------------------------------------------


//------------------------------------------------------------------------------------
void main(int argc, char *argv[])
{
    glutInit(&argc, argv);                            // Инициализация библиотеки GLUT.
    glutInitWindowSize(800, 800);                    // Создание окна размерами 800 на 800 точек.
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);    // Задание параметров экрана.

    glutCreateWindow("Работа с текстурами");        // Создание графического окна с заголовком.
    
    glutReshapeFunc(resize);    // Устанавливаем функцию для изменения размеров окна.
    glutDisplayFunc(display);   // Устанавливаем функцию для перерисовки окна.
    
glutSpecialFunc(key_special_listen);    // Устанавливаем функцию для обработки специальных клавиш.
  glEnable(GL_DEPTH_TEST);            // Включение теста глубины
  glEnable(GL_COLOR_MATERIAL);        // Включение раскрашивания поверхностей.
  glEnable(GL_LIGHT0);                // Включаем один источник света по умолчанию.
//  glEnable(GL_LIGHTING);            // Включаем освещение.
  
    LoadTGA(&texture1, ".\\Images\\animal.tga");
    LoadTGA(&texture2, ".\\Images\\sposob1.tga");
    LoadTGA(&texture3, ".\\Images\\sposob2.tga");
  
    glutMainLoop();                    // Вызов бесконечного цикла.


PM MAIL   Вверх
Rickert
Дата 30.10.2008, 07:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: 2
Всего: 52





--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
Baton2007
Дата 30.10.2008, 07:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 117
Регистрация: 29.11.2007

Репутация: нет
Всего: нет



Благодарю! 
PM MAIL   Вверх
Gongex
Дата 15.2.2009, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 81
Регистрация: 1.1.2008

Репутация: -1
Всего: 0



Код

if(ddd1==2)    {glBindTexture(GL_TEXTURE_2D, texture[1]);}
if(ddd1==1)    {glBindTexture(GL_TEXTURE_2D, texture[0]);}
if(ddd1==3)    {glBindTexture(GL_TEXTURE_2D, texture[2]);}
if(ddd1==4)    {glBindTexture(GL_TEXTURE_2D, texture[3]);}
if(ddd1==5)    {glBindTexture(GL_TEXTURE_2D, texture[4]);}

glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
 glLoadIdentity();

 glEnable(GL_TEXTURE_2D);
 
 glBegin(GL_QUADS);
  glTexCoord2f(1.0f, 0.0f); glVertex3f( 2,  2,  0);    
  glTexCoord2f(0.0f, 0.0f); glVertex3f(-2,  2,  0);    
  glTexCoord2f(0.0f, 1.0f); glVertex3f(-2, -2,  0);    
  glTexCoord2f(1.0f, 1.0f); glVertex3f( 2, -2,  0);    
 glEnd();
 
 glDisable(GL_TEXTURE_2D);
 
   glutSwapBuffers();



if(sym == GLUT_KEY_LEFT)
    {ddd1=1;}
 if(sym == GLUT_KEY_RIGHT)
    {ddd1=2;}
 if(sym == GLUT_KEY_DOWN)
    {ddd1=3;}
 if(sym == GLUT_KEY_UP)
    {ddd1=4;}



M
Alexeis
Модератор: используйте подсветку кода.

 

Это сообщение отредактировал(а) Alexeis - 15.3.2009, 15:17
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Вы можете найти полезным что...
Alexeis
Rickert
  • Английская документация по DirectX лежит где-то здесь.
  • Английская документация по OpenGL лежит где-то там.
  • Гейм-дев у нас обсуждают где-то тут

Ждём вас! С уважением, Alexeis, Rickert.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Мультимедия, OpenGL/DirectX | Следующая тема »


 




[ Время генерации скрипта: 0.0717 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.