2016-01-20 3 views
2

у меня SKYBOX показ: enter image description hereOpenGL SKYBOX видимые границы

Но есть границы окна, которые я не хочу. Я уже обыскал интернет, и все сказали, что GL_CLAMP_TO_EDGE должен работать, но я все еще вижу границы.

Это то, что я использовал для загрузки текстур:

glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); 
glGenerateMipmap(GL_TEXTURE_2D); 

Может кто-нибудь сказать мне, что я делаю неправильно?

EDIT: enter image description here

Странно то, что границы показываются только в верхней части скайбокс. поэтому, когда лицо Skybox, касается крыши коробки.

Вот его образ: enter image description here

+0

@WillBriggs Что еще я должен сказать? Это то, что я использовал, это неправильно или нет? Это обычная проблема, но не многие могут ее исправить. –

+0

Зажим к краю влияет на то, что происходит с координатами текстуры, когда они доходят до края текстурной карты; каждое из ваших лиц - отдельная карта или вы помещаете все шесть в одну карту (предположительно с белым фоном)? – Tommy

+0

Вы хотите иметь здесь 1200 строк кода? Я уже читал эту ссылку пару раз, но если я не даю весь свой код, вы, ребята, не знаете, что такое каждая функция и прочее. –

ответ

2

Я наконец нашел решение. Это грязная ошибка в самой текстуре. Существует черная рамка вокруг текстуры, но вы едва можете ее увидеть, если не увеличите масштаб. Поэтому я удалил границы, и это сработало.

1

Его координаты текстуры с плавающей ошибки. Если вы используете шейдеры, вы можете очистить их до строгих [0.0f, 1.0f]. Я не могу сказать, существует ли какое-либо возможное решение для вызовов API OpenGL. Но шейдеры должны поддерживать это. Пример использования HLSL 2.0 (NVIDIA Cg) для постэкранного шейдера.

float g_fInverseViewportWidth: InverseViewportWidth; 
float g_fInverseViewportHeight: InverseViewportHeight; 

struct VS_OUTPUT { 
    float4 Pos: POSITION; 
    float2 texCoord: TEXCOORD0; 
}; 

VS_OUTPUT vs_main(float4 Pos: POSITION){ 
    VS_OUTPUT Out; 

    // Clean up inaccuracies 
    Pos.xy = sign(Pos.xy); 

    Out.Pos = float4(Pos.xy, 0, 1); 
    // Image-space 
    Out.texCoord.x = 0.5 * (1 + Pos.x + g_fInverseViewportWidth); 
    Out.texCoord.y = 0.5 * (1 - Pos.y + g_fInverseViewportHeight); 

    return Out; 
} 

Где sign rutine используется для строгой [0, 1] Технические параметры текстуры коорд. Также есть sign рутин для GLSL, который вы можете использовать. sign возвращает знак вектора или скалярного значения, равный -1 для отрицательного и 1 для положительного значения, поэтому для согласования текстуры для вершинного шейдера он должен быть указан как -1 для 0 и 1 для 1, чем вы можете использовать подобные формулы для фактической текстуры коорд спецификация:

Out.texCoord.x = 0.5 * (1 + Pos.x + g_fInverseViewportWidth); 
    Out.texCoord.y = 0.5 * (1 - Pos.y + g_fInverseViewportHeight); 

Здесь вы можете увидеть текстуры 1 текселя ширина inaccurancy:

enter image description here

Теперь с модифицированным шейдера:

enter image description here

Смежные вопросы