2014-11-03 8 views
-1

Итак, я просто пытаюсь нарисовать текстуру на два треугольника, размер которых равен размеру видового экрана, но он разбивает изображение и искажает его, я попытался изменить размер файла изображения и всего , но ничего не работает. Ниже приведен код, который отображает текстуру и рисует треугольники.OpenGL Texture Mapping искажает изображение

public void Render() 
    { 
     Texture texture = _textureManager.Get("splash"); 
     Gl.glEnable(Gl.GL_TEXTURE_2D); 
     Gl.glBindTexture(Gl.GL_TEXTURE_2D, texture.Id); 

     double height = 720; 
     double width = 1280; 

     double x = 0; 
     double y = 0; 
     double z = 0; 

     float topUV = 0; 
     float bottomUV = 1; 
     float leftUV = 0; 
     float rightUV = 1; 

     Gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f); 
     Gl.glClear(Gl.GL_COLOR_BUFFER_BIT); 
     Gl.glBegin(Gl.GL_TRIANGLES); 
     { 
      Gl.glTexCoord2d(leftUV, topUV); 
      Gl.glVertex3d(x - width, y + height, z); 
      Gl.glTexCoord2d(rightUV, topUV); 
      Gl.glVertex3d(x + width, y + height, z); 
      Gl.glTexCoord2d(leftUV, bottomUV); 
      Gl.glVertex3d(x - width, y - height, z); 

      Gl.glTexCoord2d(rightUV, topUV); 
      Gl.glVertex3d(x + width, y + height, z); 
      Gl.glTexCoord2d(rightUV, bottomUV); 
      Gl.glVertex3d(x + width, y - height, z); 
      Gl.glTexCoord2d(leftUV, bottomUV); 
      Gl.glVertex3d(x - width, y - height, z); 
     } 
     Gl.glEnd(); 

    } 

Вот оригинальное изображение: enter image description here

И вот результат: enter image description here

Изображение 1920 х 1080, а окна просмотра 1280 х 720, но я не слишком уверен, что это важно, потому что я попытался изменить размер изображения и ничего не работает.

+0

Просто из любопытства, как это квадратная текстура? Если изображение 1920x1080, это далеко от квадрата. И прежде чем вы соблазняетесь изменить это на «прямоугольную» текстуру, вы должны знать, что в GL уже есть что-то, что называется текстурой прямоугольника, отличной от 2D-текстуры (текстуры прямоугольника используют ненормированные координаты текстуры). –

+1

Тем не менее, я подозреваю, что часть вашей проблемы может быть связана с тем, что размеры не являются силовыми. Кроме того, чтобы не использовать нормализованные координаты текстуры, текстура прямоугольника также будет преодолевать проблемы с этим. * Можете ли вы попробовать изменить размер текстуры на две части (скажем, 1024x1024) в качестве теста? * –

+0

Изменение размера изображения до 1024 x 1024 устраняет проблему. Итак, чтобы нарисовать изображение в его первоначальном разрешении, я немного смущен тем, что мне нужно изменить? – Debasertron

ответ

0

Хорошо, поэтому я закончил резюмировать изображение пополам по центру и просто загрузил два изображения, а затем использовал четыре треугольника. Это может быть не самое изящное решение, но оно работает отлично. Я предполагаю, что это связано с размерами изображения. (Я также изменил параметры для координат текстуры и всех вершин, чтобы он был более прямым в контексте переполнения стека).

public void Render() 
    { 
     //Draw Left Half 
     Texture texture = _textureManager.Get("splash1"); 
     Gl.glEnable(Gl.GL_TEXTURE_2D); 
     Gl.glBindTexture(Gl.GL_TEXTURE_2D, texture.Id); 


     Gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f); 
     Gl.glClear(Gl.GL_COLOR_BUFFER_BIT); 
     Gl.glBegin(Gl.GL_TRIANGLES); 
     { 
      Gl.glTexCoord2d(0, 0);//top left 
      Gl.glVertex2f(-1280 , 720); 

      Gl.glTexCoord2d(1, 0);//middle top 
      Gl.glVertex2f(0, 720); 

      Gl.glTexCoord2d(0, 1);//bottom left 
      Gl.glVertex2f(-1280, -720); 


      Gl.glTexCoord2d(0, 1);//bottom left 
      Gl.glVertex2f(-1280, -720); 

      Gl.glTexCoord2d(1, 0);//middle right top 
      Gl.glVertex2f(0, 720); 

      Gl.glTexCoord2d(1, 1);//bottom middle 
      Gl.glVertex2f(0, -720); 
     } 
     Gl.glEnd(); 

     //Draw Right Half 
     texture = _textureManager.Get("splash2"); 
     Gl.glBindTexture(Gl.GL_TEXTURE_2D, texture.Id); 

     Gl.glBegin(Gl.GL_TRIANGLES); 
     { 
      Gl.glTexCoord2d(0, 0);//middle top 
      Gl.glVertex2f(0, 720); 

      Gl.glTexCoord2d(1, 0);//top right 
      Gl.glVertex2f(1280, 720); 

      Gl.glTexCoord2d(0, 1);//bottom middle 
      Gl.glVertex2f(0, -720); 

      Gl.glTexCoord2d(1, 0);//top right 
      Gl.glVertex2f(1280, 720); 

      Gl.glTexCoord2d(0, 1);//bottom middle 
      Gl.glVertex2f(0, -720); 

      Gl.glTexCoord2d(1, 1);//bottom right 
      Gl.glVertex2f(1280, -720); 
     } 
     Gl.glEnd(); 
    }