У меня есть мой скайбокс, показывающий:
Но есть границы коробки, которые я не хочу. Я уже искал в интернете, и все они сказали, что 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);
Может кто-нибудь сказать мне, что я делаю не так?
Странно то, что границы отображаются только в верхней части скайбокса. поэтому, когда лицо скайбокса, касается крыши коробки.
Я наконец нашел решение. Это грязная ошибка в самой текстуре. Вокруг текстуры есть черная рамка, но вы едва сможете ее увидеть, если не увеличите масштаб. Поэтому я удалил границы, и это сработало.
Его текстура координирует плавающую ошибку. Если вы используете шейдеры, вы можете очистить их до строгого [0.0f, 1.0f]. Я не могу сказать, есть ли какое-либо возможное решение для вызовов OpenGL API. Но шейдеры должны это поддерживать. Пример использования 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
Рутина используется для строгой [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 текселя:
Теперь с модифицированным шейдером: