Я пытаюсь сделать скайбокс с кубическим отображением, используя 6 текстур. Из всех текстур кубической карты, которые я использовал, только 1 набор из 6 текстур работает нормально. Я не уверен, что является причиной проблемы.
Вот как я это делаю:
-Создание идентификатора текстуры CubeMap
glGenTextures(1, &m_texHandle);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_CUBE_MAP, m_texHandle);
for(int i = 0; i < 6; ++i)
{
//create image/pixel buffer
TextureLoader tex = TextureLoader(fileNames[i].c_str(), extension);
glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, GL_RGB, tex.GetWidth(), tex.GetHeight(), 0, GL_RGB, GL_UNSIGNED_BYTE, tex.GetBuffer());
}
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
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);
glBindTexture(GL_TEXTURE_CUBE_MAP, 0);
-Инициализация и рендеринг кода
void MeshData::InitializeSkyBox()
{
GLfloat skyboxVertices[] =
{
// Positions
-1.0f, 1.0f, -1.0f,
-1.0f, -1.0f, -1.0f,
1.0f, -1.0f, -1.0f,
1.0f, -1.0f, -1.0f,
1.0f, 1.0f, -1.0f,
-1.0f, 1.0f, -1.0f,
-1.0f, -1.0f, 1.0f,
-1.0f, -1.0f, -1.0f,
-1.0f, 1.0f, -1.0f,
-1.0f, 1.0f, -1.0f,
-1.0f, 1.0f, 1.0f,
-1.0f, -1.0f, 1.0f,
1.0f, -1.0f, -1.0f,
1.0f, -1.0f, 1.0f,
1.0f, 1.0f, 1.0f,
1.0f, 1.0f, 1.0f,
1.0f, 1.0f, -1.0f,
1.0f, -1.0f, -1.0f,
-1.0f, -1.0f, 1.0f,
-1.0f, 1.0f, 1.0f,
1.0f, 1.0f, 1.0f,
1.0f, 1.0f, 1.0f,
1.0f, -1.0f, 1.0f,
-1.0f, -1.0f, 1.0f,
-1.0f, 1.0f, -1.0f,
1.0f, 1.0f, -1.0f,
1.0f, 1.0f, 1.0f,
1.0f, 1.0f, 1.0f,
-1.0f, 1.0f, 1.0f,
-1.0f, 1.0f, -1.0f,
-1.0f, -1.0f, -1.0f,
-1.0f, -1.0f, 1.0f,
1.0f, -1.0f, -1.0f,
1.0f, -1.0f, -1.0f,
-1.0f, -1.0f, 1.0f,
1.0f, -1.0f, 1.0f
};
m_indicieCount = 36;
// Allocate an OpenGL vertex array object.
glGenVertexArrays(1, &m_vertexArrayID);
// Bind the vertex array object to store all the buffers and vertex attributes we create here.
glBindVertexArray(m_vertexArrayID);
// Generate an ID for the vertex buffer.
glGenBuffers(1, &m_vertexBufferID);
// Bind the vertex buffer and load the vertex position data into the vertex buffer.
glBindBuffer(GL_ARRAY_BUFFER, m_vertexBufferID);
glBufferData(GL_ARRAY_BUFFER, m_indicieCount * 3 * sizeof(float), &skyboxVertices[0], GL_STREAM_DRAW);
// Enable the two vertex array attributes.
glEnableVertexAttribArray(0); // Vertex position.
// Specify the location and format of the position portion of the vertex buffer.
glBindBuffer(GL_ARRAY_BUFFER, m_vertexBufferID);
glVertexAttribPointer(0, 3, GL_FLOAT, false, 0, 0);
}
void MeshData::Render()
{
//set cubemap texture for shader
m_shader->SetShaderSampler("shaderTexture", 0, TextureManager::GetInstance()->GetTexture("skyBox"));
glBindVertexArray(m_vertexArrayID);
glBindBuffer(GL_ARRAY_BUFFER, m_vertexBufferID);
glDrawArrays(GL_TRIANGLES, 0, m_indicieCount);
glBindVertexArray(0);
}
Функция SetShaderSampler:
bool Shader::SetShaderSampler(const char* name, int slot, TextureLoader* texture)
{
if(texture == NULL)
{
cout << "Shader::SetShaderSampler setting a null texture" << endl;
return true;
}
int loc = glGetUniformLocation(m_shaderProgram, name);
if(loc >= 0)
{
glActiveTexture(GL_TEXTURE0 + slot);
GLenum type = (texture->GetTextureType() == TextureLoader::CUBE_MAP_TGA) ? GL_TEXTURE_CUBE_MAP : GL_TEXTURE_2D;
glBindTexture(type, texture->GetHandle());
glUniform1i(loc, slot);
}
return true;
}
-Код шейдера
////////////////////////////////////////////////////////////////////////////////
// Filename: cubeMap.vs
////////////////////////////////////////////////////////////////////////////////
#version 400/////////////////////
// INPUT VARIABLES //
/////////////////////
layout(location = 0)in vec3 inputPosition;
//////////////////////
// OUTPUT VARIABLES //
//////////////////////
out vec3 texCoord;
///////////////////////
// UNIFORM VARIABLES //
///////////////////////
uniform mat4 worldMatrix;
uniform mat4 viewMatrix;
uniform mat4 projectionMatrix;////////////////////////////////////////////////////////////////////////////////
// Vertex Shader
////////////////////////////////////////////////////////////////////////////////
void main(void)
{
// Calculate the position of the vertex against the view, and projection matrices.
mat4 mv = projectionMatrix * mat4(mat3(viewMatrix));
gl_Position = mv * vec4(inputPosition, 1.0);
texCoord = inputPosition;
}////////////////////////////////////////////////////////////////////////////////
// Filename: cubeMap.ps
////////////////////////////////////////////////////////////////////////////////
#version 400/////////////////////
// INPUT VARIABLES //
/////////////////////
in vec3 texCoord;//////////////////////
// OUTPUT VARIABLES //
//////////////////////
out vec4 outputColor;///////////////////////
// UNIFORM VARIABLES //
///////////////////////
uniform samplerCube shaderTexture;////////////////////////////////////////////////////////////////////////////////
// Pixel Shader
////////////////////////////////////////////////////////////////////////////////
void main(void)
{
outputColor = texture(shaderTexture, texCoord);
}
-Результаты я получаю
Это единственный набор текстур кубической карты, который мне подходит
Теперь здесь и возникает проблема. Я перепробовал множество различных наборов текстур, и либо он ничего не отображает, либо я получаю проблему ниже.
Это оригинальный набор кубических карт из 6 текстур.
Но когда я играю в игру, отображаются строки вроде этой
Итак, есть ли понимание того, почему это происходит? Я считаю, что я делаю что-то не так, поскольку из большинства текстур, которые я пробовал, работает только одна.
Глупая ошибка с моей стороны, но решение моей проблемы заключалось в том, что у меня был альфа-канал на текстуре. Как только я удалил альфа-канал, он работал правильно!