2016-06-03 2 views
0

Я нарисовал куб в OpenGl, чтобы использовать его как skybox. Я использую одно изображение текстуры, и я использую UV-координаты, чтобы найти 6 граней в правильных положениях. Я посылаю текстуру со следующим кодом:Края куба в OpenGL

//------------------------------------Luminance-------------------------------------------------------------- 
glPixelStorei(GL_UNPACK_ROW_LENGTH, m_width); 
glBindTexture(GL_TEXTURE_2D, texturePointer[0]); 

glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, m_width, m_height, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, m_uYdata); 

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 


//--------------------------------------U component------------------------------------------------------------ 
glPixelStorei(GL_UNPACK_ROW_LENGTH, m_uvWidth); 
glBindTexture(GL_TEXTURE_2D, texturePointer[1]); 

glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, m_uvWidth, m_uvHeight, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, m_uUdata); 

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 

//------------------------------------- V component------------------------------------------------------------- 
glBindTexture(GL_TEXTURE_2D, texturePointer[2]); 

glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, m_uvWidth, m_uvHeight, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, m_uVdata); 

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 

Я не могу удалить белые ребра между гранями куба, см рисунок ниже:

screenshot

GL_NEAREST снять проблему но качество изображения ниже, как я могу использовать GL_LINEAR и удалять этот эффект?

Edit:

Куб создается с помощью следующей Tutorial: Model loading

Учитывая, что текстура сделана шесть граней прошитых в столбцах. Реальный объект Блендер:

# Blender v2.77 (sub 0) OBJ File: 'demo_cube.blend' 
# www.blender.org 
o Cube 
v 1.000000 -1.000000 -1.000000 
v 1.0000000 -1.000000 1.000000 
v -1.000000 -1.000000 1.000000 
v -1.000000 -1.000000 -1.000000 
v 1.000000 1.000000 -1.000000 
v 1.0000000 1.000000 1.000000 
v -1.000000 1.000000 1.000000 
v -1.000000 1.000000 -1.000000 
vt 0.833333333 0.0000 
vt 0.666666666 1.0000 
vt 0.833333333 1.0000 
vt 0.833333333 0.0000 
vt 1.000000000 1.0000 
vt 1.000000000 0.0000 
vt 0.333333333 1.0000 
vt 0.500000000 0.0000 
vt 0.333333333 0.0000 
vt 0.500000000 1.0000 
vt 0.666666666 0.0000 
vt 0.500000000 0.0000 
vt 0.000000000 0.0000 
vt 0.166666666 1.0000 
vt 0.166666666 0.0000 
vt 0.333333333 0.0000 
vt 0.166666666 1.0000 
vt 0.333333333 1.0000 
vt 0.666666666 0.0000 
vt 0.833333333 1.0000 
vt 0.500000000 1.0000 
vt 0.666666666 1.0000 
vt 0.000000000 1.0000 
vt 0.166666666 0.0000 
s off 
f 2/1 4/2 1/3 
f 8/4 6/5 5/6 
f 5/7 2/8 1/9 
f 6/10 3/11 2/12 
f 3/13 8/14 4/15 
f 1/16 8/17 5/18 
f 2/1 3/19 4/2 
f 8/4 7/20 6/5 
f 5/7 6/21 2/8 
f 6/10 7/22 3/11 
f 3/13 7/23 8/14 
f 1/16 4/24 8/17 
//44 and 47 

фрагмент шейдера:

#version 330 core 

in vec2 oTexCoord; 

uniform sampler2D yChannel; 
uniform sampler2D uChannel; 
uniform sampler2D vChannel; 



out vec4 color; 


const vec3 offset = vec3(0.0625, 0.5, 0.5); 
const mat3 coef = mat3(
     1.164, 0.0,   1.793, 
     1.164, -0.213, -0.533, 
     1.164, 2.112, 0.0 
    ); 

void main() 
{ 
    vec2 nTexCoord = vec2(oTexCoord.x, 1.0 - oTexCoord.y); 

    vec4 Tcolor = vec4(1.0); 

    if(oTexCoord.y <1 && oTexCoord.y > 0.0) { 
     if(oTexCoord.x < 1 && oTexCoord.x > 0.0) { 

      vec3 yuv = vec3(
        texture(yChannel, nTexCoord).r, 
        texture(uChannel, nTexCoord).r, 
        texture(vChannel, nTexCoord).r 
       ) - offset; 
      vec3 rgb = yuv * coef; 

      Tcolor = vec4(rgb, 1.0);    
     } 
    } 

    color = Tcolor; 

} 
+0

Вы проверили, что ваши текстуры не имеют границы 1px с белыми/прозрачными пикселями или что-то в этом роде? –

+0

Эта ошибка рендеринга связана с тем, что геометрия лица не правильно выравнивается по краям. Я не понимаю, что вы подразумеваете под «Я использую одно изображение текстуры, и я использую UV-координаты, чтобы найти 6 лиц в правильных положениях». - если вы имеете в виду, что вы позиционируете вершины с текстурой, это может иметь отношение к точности изображения. –

+0

Так как 'GL_NEAREST' устраняет проблемы, это, скорее всего, не результат неправильно выровненной геометрии. Однако данный подход кажется странным. Я не понимаю, почему вы храните uvs в текстуре. Возможно, вы могли бы объяснить дальнейший подход или добавить свой шейдерный код. –

ответ

1

Я думаю, что вы хотите использовать cubemaps и GL_ARB_seamless_cube_map:

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

Это расширение позволяет реализациям брать образцы со смежных поверхностей карты куба, предоставляя возможность создавать бесшовные карты кубов.

(emph mine).

Чтобы использовать его, сначала проверьте, что вы на самом деле есть, что расширение (это зависит от вашей платформы и на которой инструментарий, в конечном счете помогает вам в обращающегося OpenGL), а затем просто написать

glEnable(GL_TEXTURE_CUBE_MAP_SEAMLESS); 

, чтобы включить его (глобально).

+1

OP не использует кубики, поэтому это не поможет. –

+0

Затем OP также должен использовать кубмапы и включить фильтрацию. – peppe

+0

К сожалению, я не могу использовать куб, потому что функция glTexImage2D (GL_TEXTURE_CUBE_MAP_POSITIVE_X, ......) слишком медленная, и мое приложение меняет текстуру в реальном времени. Использование одной текстуры, сопоставленной с UV-координатами, является хорошим выбором, если цель посылает текстуру на GPU несколько раз в секунду. – Pelux