Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Программирование игр, графики и искусственного интеллекта > Правильное отображение текстуры в OpenGL?


Автор: REPO 13.4.2006, 19:51
Доброго времени суток!

Помогите!!
Проблема с отображением двух треугольников как квадрата.
Загрузив текстуру, прописываю в функции display() слудующее:

Код

    glBegin(GL_TRIANGLES);
        glTexCoord2f(0,0); glVertex3f(0,0,0);
        glTexCoord2f(1,0); glVertex3f(1,0,0);
        glTexCoord2f(1,1); glVertex3f(1,1,0);

        glTexCoord2f(1,1); glVertex3f(1,1,0);
        glTexCoord2f(0,1); glVertex3f(0,1,0);
        glTexCoord2f(0,0); glVertex3f(0,0,0);
    glEnd();


А потом тоже самое повернув камеру. На второй картинке (см. изображение) ровные линии получаются изогнутыми!!? smile
Как это исправить?

Автор: Goliath 14.4.2006, 06:14
Как ты работаешь с камерой? Такие искажения бывают, если камеру пишешь с нуля. Выложи полный код.

Автор: REPO 14.4.2006, 10:10
Так выглядит код для второго изображения:

Код


#include <conio.h>
#include <iostream.h>

#include "glmodelut.h"

#include <GL/glut.h>
#include <GL/glaux.h>




unsigned int photo_tex;
AUX_RGBImageRec* photo_image;





void display (void)
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glEnable(GL_TEXTURE_2D);

    glRotatef(25,0,1,0);
    glRotatef(25,-1,0,0);
    
    glBegin(GL_TRIANGLES);
        glTexCoord2f(0,0); glVertex3f(0,0,0);
        glTexCoord2f(1,0); glVertex3f(1,0,0);
        glTexCoord2f(1,1); glVertex3f(1,1,0);

        glTexCoord2f(1,1); glVertex3f(1,1,0);
        glTexCoord2f(0,1); glVertex3f(0,1,0);
        glTexCoord2f(0,0); glVertex3f(0,0,0);
    glEnd();

    glutSwapBuffers();
}



void init (void)
{
  glClearColor (0.0, 0.0, 0.0, 0.0);
   glShadeModel(GL_FLAT);
   glEnable(GL_DEPTH_TEST);


    GLfloat light_ambient[] = { 1.0, 1.0, 1.0, 1.0 };
    GLfloat light_diffuse[] = { 0.7, 0.7, 0.7, 1.0 };
    GLfloat lmodel_ambient[] = { 1.0, 1.0, 1.0, 1.0 };

    glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
    glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
    glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);

    glEnable(GL_LIGHT0);
    glEnable(GL_LIGHTING);

  glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

  photo_image = auxDIBImageLoad("plitka_strip.bmp");

  glGenTextures(1, &photo_tex);

    glBindTexture(GL_TEXTURE_2D, photo_tex );
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

    glTexImage2D(GL_TEXTURE_2D, 0, 3, 
                 photo_image->sizeX,
                 photo_image->sizeY,
                 0, GL_RGB, GL_UNSIGNED_BYTE,
                 photo_image->data);

}


void reshape(int w, int h)
{
   glViewport(0, 0, (GLsizei) w, (GLsizei) h);
   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();
   gluPerspective(80.0, (GLfloat) w/(GLfloat) h, 0.1, 1000.0);
   glMatrixMode(GL_MODELVIEW);
   glLoadIdentity();
   gluLookAt(    0,0,2,    0,0,0,        0,1,0    );
}


int main(int argc, char **argv)
{
  glutInit(&argc, argv);
  glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
  glutInitWindowSize (500, 500);
  glutCreateWindow("TEST");

  glutReshapeFunc(reshape);
  glutDisplayFunc(display);
  init();
  glutMainLoop();
  return 0;           
}

 :qstn 



Автор: DENNN 14.4.2006, 11:16
А если вот так:

Код

void display (void)
{
glMatrixMode (GL_PROJECTION);

       glFlush();
        glDrawBuffer (GL_BACK);      // draws to both left and right buffers
        glClearColor(0.2f, 0.2f, 0.2f, 0.0f);  
        glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  glEnable(GL_TEXTURE_2D);
 
        glPushMatrix();
glLoadIdentity(); 
gluPerspective(50,1,0,50);
   glRotatef(25,0,1,0);
    glRotatef(-25,1,0,0);
  
 
    
    glBegin(GL_TRIANGLES);
        glTexCoord2f(0,0); glVertex3f(0,0,0);
        glTexCoord2f(1,0); glVertex3f(1,0,0);
        glTexCoord2f(1,1); glVertex3f(1,1,0);
        glTexCoord2f(1,1); glVertex3f(1,1,0);
        glTexCoord2f(0,1); glVertex3f(0,1,0);
        glTexCoord2f(0,0); glVertex3f(0,0,0);
    glEnd();

glPopMatrix();
glFlush();
    glutSwapBuffers();
}

Автор: REPO 14.4.2006, 11:50
Если заменить display(), то сначала не показывает ничего, а если изменить gluPerspective(50, 1, 0.1, 50); , результат тотже smile

Автор: Goliath 14.4.2006, 16:58
Выложи текстуру попробую у себя с твоей текстурой.

Автор: REPO 14.4.2006, 23:06
Вот. Только надо перевести ее в .bmp, а то glaux .jpg не грузит.

Автор: Goliath 15.4.2006, 18:02
К сожалению, у меня под руками нету Си, я на данный момент просто работаю с OpenGL на Java. Я перевел твой код и у меня все работает нормально, единственное, что хочу отметить сама текстура делать оптический обман изогнутости. Попробуй поменять текстуру и посмотреть. Если также будить я возьму си и попробую под Си.

Автор: REPO 16.4.2006, 20:07
Все оказалось проще. Вообщем если ты тоже хочешь чтобы у тебя все работало как у меня, - надо удалить драйвер NVidia (или другой видеокарты...)  smile  Тогда OpenGL, скорей всего, работает на программном ускорении и рисует треугольники не учитывая перспективу.

А как я установил новый драйвер (не тот что дает winXP), эту же текстуру показал нормально.  smile Так что Майкрософт только навредил излишней заботливостью!! (а еслиб я не догадался драйвер проверить..?!!) 

Автор: danie 28.11.2006, 21:16
А коррекция перспективы не может исправлять такой эффект? Есть же режим коррекции перспективы при наложении текстуры.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)