Отображение текстуры openGL + lib3ds

Всем доброго времени суток, подскажите как отобразить текстуры 3d объекта, в окне SimpleOpenglControl
0      2266        26.07.2012        26

0 
26.07.2012 00:00:00
Посмотри глава 12 и 13.

как отобразить текстуры 3d объекта
Ты просто хочешь вывести текстуры отдельно от объекта?) или наложить текстуры на объект?
0 
26.07.2012 00:00:00
У меня есть объект с наложенными на него текстурами, мне нужно вывести этот объект в таком же виде, чтобы текстуры остались на нём.
0 
26.07.2012 00:00:00
Сейчас у меня просто объект выводится.
0 
26.07.2012 00:00:00
Взгляни , по ним думаю можно разобрать как текстуры грузить и налаживать. Правда, как там данные(о текстуре, текстурных координатах) из lib3ds получить надо будет тебе посмотреть. К сожалению с этой либой не работал.=)
0 
26.07.2012 00:00:00
Прошу прощения. Не могли бы вы помочь с отображением текстуры. Вроде сделал, однако как-то плохо модель стала отображатся.
Вот скрин

ну и код
отображение модели

Gl::glMaterialfv(Gl::GL_FRONT,Gl::GL_DIFFUSE,material[face[i]->material]->diffuse);
Gl::glMaterialfv(Gl::GL_FRONT,Gl::GL_AMBIENT,material[face[i]->material]->ambient);
Gl::glMaterialfv(Gl::GL_FRONT,Gl::GL_SPECULAR,material[face[i]->material]->specular);

свет

Gl::glShadeModel(Gl::GL_SMOOTH);
Gl::glEnable(Gl::GL_DEPTH_TEST);
Gl::glEnable(Gl::GL_CULL_FACE);
Gl::glFrontFace(Gl::GL_CCW);
float gambient[]={0.2,0.2,0.2,1.0};
float lightpos[]={1.0,1.0,1.0,1.0};
float lambient[]={1.0,1.0,1.0,1.0};
float ldiffuse[]={1.0,1.0,1.0,1.0};
float lspecular[]={0.3,0.3,0.3,1.0};
Gl::glLightfv(Gl::GL_LIGHT0,Gl::GL_DIFFUSE,*ldiffuse);
Gl::glLightfv(Gl::GL_LIGHT0,Gl::GL_AMBIENT,*lambient);
Gl::glLightfv(Gl::GL_LIGHT0,Gl::GL_SPECULAR,*lspecular);
Gl::glLightfv(Gl::GL_LIGHT0,Gl::GL_POSITION,*lightpos);
Gl::glLightModelfv(Gl::GL_LIGHT_MODEL_AMBIENT,*gambient);
Gl::glEnable(Gl::GL_LIGHTING);
Gl::glEnable(Gl::GL_LIGHT0);

ну и выгрузка материала из модели

for(int i=0;i<model->materials->Count;i++)
material.Add(model->materials[i]);
0 
26.07.2012 00:00:00
так выглядит модель если не включаю загрузку текстур
0 
26.07.2012 00:00:00
0 
26.07.2012 00:00:00
Покажи код загрузки и настройки текстуры. =)
Попробуй заменить цвет очистки, и посмотреть как будет с текстурами. И попробовать отключить настройки света, оставив
Gl::glEnable(Gl::GL_LIGHTING);
Gl::glEnable(Gl::GL_LIGHT0);, и тоже глянуть как будет с текстурами.

Проверь правильность загрузки текстурных координат, и задание вектору текстурных координат.

И все таки проверь ошибки OpenGL.)
0 
26.07.2012 00:00:00
Вот отрисовка текстуры
for(long i=0;i<mesh[meshcount]->nfaces;i++)
{
Gl::glMaterialfv(Gl::GL_FRONT,Gl::GL_DIFFUSE,material[face[i]->material]->diffuse);
Gl::glMaterialfv(Gl::GL_FRONT,Gl::GL_AMBIENT,material[face[i]->material]->ambient);
Gl::glMaterialfv(Gl::GL_FRONT,Gl::GL_SPECULAR,material[face[i]->material]->specular);
0 
26.07.2012 00:00:00
Поменял цвет отчистки, оказывается что нижняя часть модели просто становилась белой. Однако текстура так и не отобразилась.
0 
26.07.2012 00:00:00
У тебя свет довольно не хилый по силе=)
0 
26.07.2012 00:00:00
по читай про текстурирование 379стр. OpenGL супер книги. вот
0 
26.07.2012 00:00:00
Попробуй загружать текстуру и задавать векторам текстурные координаты. Как в

Просто мне кажется это не совсем оптимальный подход, задание цветов из текстуры параметрами материала на каждый вектор. Материалы задаются вместе с настройкой цвета, если не ошибаюсь конечно.=)
0 
27.07.2012 00:00:00
ой не цвета, а света)))

И это у тебя выходить, совсем не загрузка текстуры, а настройка материалов отражения света.=)
0 
30.07.2012 00:00:00
Возник вопрос по текстурам.
1.При запуске программы в режиме отладки всё работает нормально. Однако при обычном запуске программа виснет на загрузке текстуры.
2.Текстура отображается но не полностью, при загрузке картинки с надписью адидас на белом фоне, рисуется только белый фон.
Вот код
инициализация

Il::ilInit();
Il::ilEnable(Il::IL_ORIGIN_SET);

код при нажатии на кнопку открыть модель

previev();
if(model)
LIB3DS::lib3ds_file_free(model);
model=LIB3DS::lib3ds_file_open(WndThread::directory_name);
for(int i=0;i<model->meshes->Count;i++)
mesh.Add(model->meshes[i]);
for(int i=0;i<model->materials->Count;i++)
material.Add(model->materials[i]);
int imageId;
Il::ilGenImages(1,Convert::ToInt32(imageId));
Il::ilBindImage(imageId);
String ^ url=material[0]->texture1_map->name;
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)
{
case 24:mGlTextureObject=MakeGlTexture(Gl::GL_RGB,Il::ilGetData(),width,height);
break;
case 32:mGlTextureObject=MakeGlTexture(Gl::GL_RGBA,Il::ilGetData(),width,height);
break;
}
//Il::ilDeleteImage(Convert::ToInt32(imageId));

AnT->Visible=true;
// очитка окна
Gl::glClearColor(0, 0, 0, 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, 1.0, 10000);
Gl::glMatrixMode(Gl::GL_MODELVIEW);
Gl::glLoadIdentity();
// настройка параметров OpenGL для визуализации
Gl::glEnable(Gl::GL_DEPTH_TEST);
Gl::glClear(Gl::GL_COLOR_BUFFER_BIT | Gl::GL_DEPTH_BUFFER_BIT);
Gl::glClearColor(0, 0, 0, 1);
// инициализация Glut
Gl::glClearDepth(1.0);
Gl::glShadeModel(Gl::GL_FLAT);
AnT->BackColor=Color::AliceBlue;
//Glut::glutTimerFunc(33, gcnew Glut::TimerCallback(this,&mainForm::Timer), 1);
Gl::glClear(Gl::GL_COLOR_BUFFER_BIT | Gl::GL_DEPTH_BUFFER_BIT);
Gl::glClearColor(0, 0, 0, 1);
Gl::glLoadIdentity();
Gl::glPushMatrix();
display();
Gl::glPopMatrix();
AnT->Invalidate();

Функция обработки текстуры

private: static unsigned int MakeGlTexture( int Format, IntPtr pixels, int w, int h)
{
unsigned int texObject=0;


Gl::glGenTextures(1,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);

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;
}

Ну и отрисовка текстуры

Gl::glEnable(Gl::GL_DEPTH_TEST);
Gl::glEnable(Gl::GL_TEXTURE_2D);
Gl::glBindTexture(Gl::GL_TEXTURE_2D,mGlTextureObject);
Gl::glDepthFunc(Gl::GL_LEQUAL);
Gl::glClear(Gl::GL_COLOR_BUFFER_BIT|Gl::GL_DEPTH_BITS);
Gl::glClearColor(0, 0, 0, 1);
Gl::glLoadIdentity();
lightup();
Gl::glScalef(0.5,0.5,0.5);
Gl::glTranslatef(0.0,-1200.0,-1500.0);
Gl::glRotatef(280, 1, 0, 0);
Gl::glRotatef(rotat, 0, 0, 1);
Gl::glColor3f(50.0,100.0,0.0);

long meshcount;
for(meshcount=0;meshcount<model->meshes->Count;meshcount++)
{
for(int fd=0;fd<mesh[meshcount]->faces->Count;fd++)
face.Add(mesh[meshcount]->faces[fd]);
for(long i=0;i<mesh[meshcount]->nfaces;i++)
{
Gl::glMaterialfv(Gl::GL_FRONT,Gl::GL_DIFFUSE,material[face[i]->material]->diffuse);
Gl::glMaterialfv(Gl::GL_FRONT,Gl::GL_AMBIENT,material[face[i]->material]->ambient);
Gl::glMaterialfv(Gl::GL_FRONT,Gl::GL_SPECULAR,material[face[i]->material]->specular);
Gl::glBegin(Gl::GL_TRIANGLES);
Gl::glColor3f(50.0,100.0,0.0);
Gl::glTexCoord2f(0, 0);
Gl::glVertex3fv(mesh[meshcount]->vertices[face[i]->index[0]]->ToArray());
Gl::glTexCoord2f(0, 0);
Gl::glVertex3fv(mesh[meshcount]->vertices[face[i]->index[1]]->ToArray());
Gl::glTexCoord2f(0, 0);
Gl::glVertex3fv(mesh[meshcount]->vertices[face[i]->index[2]]->ToArray());
Gl::glEnd();
Gl::glFlush();

}

face.Clear();
}
0 
30.07.2012 00:00:00
С зависанием программы разобрался, нужно было Il::ilBindImage(imageId);
убрать. А вот с отображением текстуры с надписью проблемы.ПС: Текстура с сплошным цветом, на пример (розовый или желтый) отображается нормально.
0 
30.07.2012 00:00:00
Gl::glTexCoord2f(0, 0);// здесь не нули, а текстурные координаты из 3ds файла
Ты устанавливаешь не правильные текстурные координаты. Там не нули, а реальные текстурные координаты. Они сохранены в мэше и должны быть загружены с помощью lib3ds. Посмотри пример или

Во втором примере:
// устанавливаем текстурные координаты для каждой вершины, ну и сами вершины
Gl.glTexCoord2f(limbs[l].t_vert[0, limbs[l].t_face[0, i]], limbs[l].t_vert[1, limbs[l].t_face[0, i]]);
Gl.glVertex3f(x1, y1, z1);

Gl.glTexCoord2f(limbs[l].t_vert[0, limbs[l].t_face[1, i]], limbs[l].t_vert[1, limbs[l].t_face[1, i]]);
Gl.glVertex3f(x2, y2, z2);

Gl.glTexCoord2f(limbs[l].t_vert[0, limbs[l].t_face[2, i]], limbs[l].t_vert[1, limbs[l].t_face[2, i]]);
Gl.glVertex3f(x3, y3, z3);


Gl::glMaterialfv(Gl::GL_FRONT,Gl::GL_DIFFUSE,material[face[i]->material]->diffuse);
Gl::glMaterialfv(Gl::GL_FRONT,Gl::GL_AMBIENT,material[face[i]->material]->ambient);
Gl::glMaterialfv(Gl::GL_FRONT,Gl::GL_SPECULAR,material[face[i]->material]->specular);

Это ты настраиваешь свойства отражения света, делай это до цикла отрисовки, то есть настривай эти свойства для всего мэша.
0 
30.07.2012 00:00:00
класс TextureMap имеет такие поля

public class Lib3dsTextureMap
{
//public uint user_id;
//public object user_ptr;
public string name = "";
public Lib3dsTextureMapFlags flags;
public float percent;
public float blur;
public float[] scale = new float[2];
public float[] offset = new float[2];
public float rotation;
public float[] tint_1 = new float[3];
public float[] tint_2 = new float[3];
public float[] tint_r = new float[3];
public float[] tint_g = new float[3];
public float[] tint_b = new float[3];
}

то есть в текстурные координаты мне нужно передавать tint_1 и tint_2?
0 
30.07.2012 00:00:00

Gl::glTexCoord2f(material[face[i]->material]->texture1_map->tint_1[0],material[face[i]->material]->texture1_map->tint_2[0]);
Gl::glVertex3fv(mesh[meshcount]->vertices[face[i]->index[0]]->ToArray());
Gl::glTexCoord2f(material[face[i]->material]->texture1_map->tint_1[1],material[face[i]->material]->texture1_map->tint_2[1]);
Gl::glVertex3fv(mesh[meshcount]->vertices[face[i]->index[1]]->ToArray());
Gl::glTexCoord2f(material[face[i]->material]->texture1_map->tint_1[2],material[face[i]->material]->texture1_map->tint_2[2]);
Gl::glVertex3fv(mesh[meshcount]->vertices[face[i]->index[2]]->ToArray());

Изменений не принесло.
0 
30.07.2012 00:00:00
Немного погуглив нашел:

mesh->texcos[i][0]// вроде первая текстурная координата
mesh->texcos[i][1]// вторая


Должно получится, что вроде этого:
Gl.glTexCoord2f(mesh->texcos[i][0], mesh->texcos[i][1]);
0 
30.07.2012 00:00:00
Немного натупил, текстурные координаты хранятся в другом месте.
Сделал так
for(long i=0;i<mesh[meshcount]->texcos->Count;i++)
{
Gl::glTexCoord2fv(mesh[meshcount]->texcos[i]->s,mesh[meshcount]->texcos[i]->t);
}
стало отображатся хоть что-то однако всё равно не корректно.
вот что содержит класс текстурных координат
public class Lib3dsTexturecoordinate
{
public float s, t;

public Lib3dsTexturecoordinate() { }

public Lib3dsTexturecoordinate(double s, double t)
{
this.s = (float)s;
this.t = (float)t;
}
}
0 
30.07.2012 00:00:00
Вот как выглядит текстура
0 
30.07.2012 00:00:00


а вот что отображает программа
0 
30.07.2012 00:00:00
Это не правильный цикл, здесь не устанавливаются текстурные координаты векторам.

for(long i=0;i<mesh[meshcount]->texcos->Count;i++)
{
Gl::glTexCoord2fv(mesh[meshcount]->texcos[i]->s,mesh[meshcount]->texcos[i]->t);
}


Команды должны следовать вот так:
Gl::glTexCoord2fv(...) // устанавливаешь текстурные координаты
//они являются свойствами vertex-а
Gl::glVertex3fv(...)// потом задаешь vertex


Должно выйти, что вроде этого:

for(long i=0;i<mesh[meshcount]->nfaces;i++)
{
Gl::glTexCoord2fv(mesh[meshcount]->texcos[face[i]->index[0]]->s, mesh[meshcount]->texcos[face[i]->index[0]]->t);
Gl::glVertex3fv(mesh[meshcount]->vertices[face[i]->index[0]]->ToArray());
Gl::glTexCoord2fv(mesh[meshcount]->texcos[face[i]->index[1]]->s, mesh[meshcount]->texcos[face[i]->index[1]]->t);
Gl::glVertex3fv(mesh[meshcount]->vertices[face[i]->index[1]]->ToArray());
Gl::glTexCoord2fv(mesh[meshcount]->texcos[face[i]->index[2]]->s, mesh[meshcount]->texcos[face[i]->index[2]]->t);
Gl::glVertex3fv(mesh[meshcount]->vertices[face[i]->index[2]]->ToArray());
}
0 
30.07.2012 00:00:00
оГРОМНОЕ СПАСИБО… ДАЖЕ НЕ ДУМАЛ ЧТО ТАК РАБОТАТЬ БУДЕТ…
0 
30.07.2012 00:00:00
Не за что.+)

Я б все таки посоветовал полистать OpenGL супер книгу или OpenGL Red book. Тогда Вы будете лучше понимать, как использовать OpenGL=)
^
Регистрация
Регистрируясь, вы принимаете правила сайта. Если вы не получили код подтв. регистрации - не забудьте проверить папку спам.
Логин*
Email*
Пароль*
Подтверждение пароля*
 
Логин*
Код*
 
×
Восстановление пароля
Пожалуйста, заполните поля, после чего вы получите код подтверждения на ваш Email. Если код не пришел в течении нескольких минут - проверьте папку спам.
Логин

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