Взгляни , по ним думаю можно разобрать как текстуры грузить и налаживать. Правда, как там данные(о текстуре, текстурных координатах) из lib3ds получить надо будет тебе посмотреть. К сожалению с этой либой не работал.=)
Покажи код загрузки и настройки текстуры. =) Попробуй заменить цвет очистки, и посмотреть как будет с текстурами. И попробовать отключить настройки света, оставив Gl::glEnable(Gl::GL_LIGHTING); Gl::glEnable(Gl::GL_LIGHT0);, и тоже глянуть как будет с текстурами.
Проверь правильность загрузки текстурных координат, и задание вектору текстурных координат.
Попробуй загружать текстуру и задавать векторам текстурные координаты. Как в
Просто мне кажется это не совсем оптимальный подход, задание цветов из текстуры параметрами материала на каждый вектор. Материалы задаются вместе с настройкой цвета, если не ошибаюсь конечно.=)
Возник вопрос по текстурам. 1.При запуске программы в режиме отладки всё работает нормально. Однако при обычном запуске программа виснет на загрузке текстуры. 2.Текстура отображается но не полностью, при загрузке картинки с надписью адидас на белом фоне, рисуется только белый фон. Вот код инициализация
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));
С зависанием программы разобрался, нужно было Il::ilBindImage(imageId); убрать. А вот с отображением текстуры с надписью проблемы.ПС: Текстура с сплошным цветом, на пример (розовый или желтый) отображается нормально.
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);
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?
Немного натупил, текстурные координаты хранятся в другом месте. Сделал так 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;
Команды должны следовать вот так: Gl::glTexCoord2fv(...) // устанавливаешь текстурные координаты //они являются свойствами vertex-а Gl::glVertex3fv(...)// потом задаешь vertex
Стоит ли переходить на Windows 10?Windows 10 установлена на каждый 3-й компьютер. Какие плюсы от перехода? DirectX 12 работает только в Windows 10?
Как установить Windows 10?Как бесплатно и легально скачать? Как записать и установить с последними обновлениями?
Сохраните страницу!
Регистрация
Регистрируясь, вы принимаете правила сайта. Если вы не получили код подтв. регистрации - не
забудьте проверить папку спам.
×
Восстановление пароля
Пожалуйста, заполните поля, после чего вы получите код подтверждения на ваш Email. Если код не пришел в течении нескольких минут - проверьте папку спам.
×
Авторизация
Авторизуйтесь с помощью соц. сети или с помощью аккаунта на сайте:
как отобразить текстуры 3d объекта
Ты просто хочешь вывести текстуры отдельно от объекта?) или наложить текстуры на объект?
Вот скрин
ну и код
отображение модели
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]);
Попробуй заменить цвет очистки, и посмотреть как будет с текстурами. И попробовать отключить настройки света, оставив
Gl::glEnable(Gl::GL_LIGHTING);
Gl::glEnable(Gl::GL_LIGHT0);, и тоже глянуть как будет с текстурами.
Проверь правильность загрузки текстурных координат, и задание вектору текстурных координат.
И все таки проверь ошибки OpenGL.)
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);
Просто мне кажется это не совсем оптимальный подход, задание цветов из текстуры параметрами материала на каждый вектор. Материалы задаются вместе с настройкой цвета, если не ошибаюсь конечно.=)
И это у тебя выходить, совсем не загрузка текстуры, а настройка материалов отражения света.=)
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();
}
убрать. А вот с отображением текстуры с надписью проблемы.ПС: Текстура с сплошным цветом, на пример (розовый или желтый) отображается нормально.
Ты устанавливаешь не правильные текстурные координаты. Там не нули, а реальные текстурные координаты. Они сохранены в мэше и должны быть загружены с помощью 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);
Это ты настраиваешь свойства отражения света, делай это до цикла отрисовки, то есть настривай эти свойства для всего мэша.
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?
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());
Изменений не принесло.
mesh->texcos[i][0]// вроде первая текстурная координата
mesh->texcos[i][1]// вторая
Должно получится, что вроде этого:
Gl.glTexCoord2f(mesh->texcos[i][0], mesh->texcos[i][1]);
Сделал так
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;
}
}
а вот что отображает программа
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());
}
Я б все таки посоветовал полистать OpenGL супер книгу или OpenGL Red book. Тогда Вы будете лучше понимать, как использовать OpenGL=)