2015-02-25 5 views
2

У меня проблема с текстурным отображением с Open-GL.Open-GL Изменение координат текстуры путем изменения размера треугольника

example
(1) - это текстура. Я хочу использовать треугольник из этого
(2) только для описания текстуры расщепляется в треугольниках
(3) отображаются текстуры треугольников 16x16 (высота х ширины)
(4) НЕПРАВИЛЬНЫХ отображений для деформированных треугольников (в случае размера треугольника не 16х16)

для (4) только переменных H1, H2, H3, H4 установлены (см второй кодовой коробки)

Setup

//- setup cam/OpenGL 
int width = 1024; 
int height = 800; 

glViewport(0, 0, width, height); 
glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
glOrtho(0.f, width, 0.f, height, 1.f, -1.f); 

glMatrixMode(GL_MODELVIEW); 
glEnable(GL_TEXTURE_2D); 

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

... 

//- texture position in texture [Value range: 0..1] 
float textX1 = 0.f; 
float textY1 = 0.f; 

//- size of texture triangle 
const float textSizeWidth = 16.0f/getTextureWidth(); //- getTextureWidth()=2^N ! 
const float textSizeHeight = 16.0f/getTextureHeight();//- getTextureHeight()=2^M ! 
const float textSizeWidthHalf = textSizeWidth * 0.5f; 

//- output screen coordinates [Value range: 0.. N !!] 
int outX = 0; 
int outY = 0; 


//- the heigh of one "line" 
static const int YSTEP = 9; 

нарисовать треугольники

//-> cal: outX, outY, textX1, textY1, textX2, textY2 

//- deformation values 
unsigned int H1 = l->AraeHeight1; 
unsigned int H2 = l->AraeHeight2; 
unsigned int H3 = l->AraeHeight3; 
unsigned int H4 = l->AraeHeight4; 

//- disable the Height/deformation 
if (!m_useHeight) H1 = H2 = H3 = H4 = 0; 


//--  1 --- 4^
//-- /\ B/ | 
//-- /A \/ |YSTEP 
//-- 2 --- 3  v 

////// A ///// 
//-- ->1 
glTexCoord2f(textX1 + textSizeWidthHalf, textY1 + textSizeHeight); 
glVertex3i(outX + 8, outY + YSTEP + H1, 0); 

//-- ->2 
glTexCoord2f(textX1, textY1); 
glVertex3i(outX, outY + H2, 0); 


//-- ->3 
glTexCoord2f(textX1 + textSizeWidth, textY1); 
glVertex3i(outX + 16, outY + H3, 0); 


////// B ///// 
//-- ->1 
glTexCoord2f(textX2, textY2 + textSizeHeight); 
glVertex3i(outX + 8, outY + YSTEP + H1, 0); 

//-- ->3 
glTexCoord2f(textX2 + textSizeWidthHalf, textY2); 
glVertex3i(outX + 16, outY + H3, 0); 

//-- ->4 
glTexCoord2f(textX2 + textSizeWidth, textY2 + textSizeHeight); 
glVertex3i(outX + 8 + 16, outY + YSTEP + H4, 0); 

Если Н1 = Н2 = Н3 = Н4 = 0; то все выглядит нормально (изображение (3)). Если нет, то я получил проблемы с рендерингом (изображение (4)), как проблема «округления», но я не знаю, где/почему. Или проблема в том, что текстура смещается на один пиксель вправо, но почему? Или мне нужно установить еще один параметр Open-Gl. Спасибо за подсказку.

+0

В чем проблема? Появляются синие линии? В противном случае отображение текстур выглядит хорошо для меня. Или как вы хотите, чтобы это выглядело? – vesan

+0

yes ... синие линии (это пиксели за пределами текстуры) на краю треугольников появляются только когда я деформирую треугольники. – Thomas

ответ

2

Вы не можете этого избежать, это правило растеризации, а затем правило фильтрации (округление UV-координат от координат фрагмента), что люди обычно делают в этих случаях, применяют расширение на текстуре только для синих пикселей, что означает копирование ближайшего цветного пикселя для каждого синего пикселя, который стоит достаточно близко к цветной зоне.