使用着色器 c++ 的立方体贴图黑色
Cube map black using shaders c++
我一直在试图解决这个问题。我正在尝试创建一个天空盒,但出于某种原因,无论我做什么,我的立方体贴图始终是黑色的。在片段着色器中,如果我输入像 vec4(1.0f) 这样的输出颜色值,那么我确实会看到我的立方体变白了。这让我觉得可能是我在加载图像,但我检查了一下,它正在加载图像。我确定我只是愚蠢而遗漏了一些东西。
正在创建立方体贴图
glGenTextures(1, &cube_texture);
glBindTexture(GL_TEXTURE_CUBE_MAP, cube_texture);
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);
LoadCubeMapFace(posX, GL_TEXTURE_CUBE_MAP_POSITIVE_X);
LoadCubeMapFace(negX, GL_TEXTURE_CUBE_MAP_NEGATIVE_X);
LoadCubeMapFace(posY, GL_TEXTURE_CUBE_MAP_POSITIVE_Y);
LoadCubeMapFace(negY, GL_TEXTURE_CUBE_MAP_NEGATIVE_Y);
LoadCubeMapFace(posZ, GL_TEXTURE_CUBE_MAP_POSITIVE_Z);
LoadCubeMapFace(negZ, GL_TEXTURE_CUBE_MAP_NEGATIVE_Z);
正在使用 SDL_image
加载图像
void LoadCubeMapFace(const std::string& filename, GLenum face)
{
SDL_Surface *imageSurface = IMG_Load((TEXTURE_PATH + filename).c_str());
if (!imageSurface){
std::cout << "Can't Load image " << filename << " " << IMG_GetError();
return;
}
GLint nOfColors = imageSurface->format->BytesPerPixel;
GLenum textureFormat = GL_RGB;
GLenum internalFormat = GL_RGB8;
if (nOfColors == 4) // contains an alpha channel
{
if (imageSurface->format->Rmask == 0x000000ff){
textureFormat = GL_RGBA;
internalFormat = GL_RGBA8;
}
else
{
textureFormat = GL_BGRA;
internalFormat = GL_RGBA8;
}
}
else if (nOfColors == 3) // no alpha channel
{
if (imageSurface->format->Rmask == 0x000000ff){
textureFormat = GL_RGB;
internalFormat = GL_RGB8;
}
else
{
textureFormat = GL_BGR;
internalFormat = GL_RGB8;
}
}
else
{
std::cout << "ERROR [SDL_Surface -> Texture]: Image is not True Color" << std::endl;
return;
}
glTexImage2D(face, 0, internalFormat, imageSurface->w, imageSurface->h, 0, textureFormat, GL_UNSIGNED_BYTE, imageSurface->pixels);
SDL_FreeSurface(imageSurface);
}
正在渲染立方体贴图
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_CUBE_MAP, texture->GetTextureMap());
GLint texture_uniform = glGetUniformLocation(Skybox::shader->GetShaderProgram(), "cube_map");
glUniform1i(texture_uniform, 0);
VS 和 FS 着色器
#version 150
in vec3 vertex_position_model;
out vec3 the_uv;
uniform mat4 projection_matrix;
uniform mat4 view_matrix;
void main()
{
the_uv = vertex_position_model;
vec4 v = vec4(vertex_position_model, 1.0f);
gl_Position = projection_matrix * view_matrix * v;
}
#version 150
out vec4 FragColor;
in vec3 the_uv;
uniform samplerCube cube_map;
void main()
{
FragColor = texture(cube_map, the_uv);
}
我不确定问题出在哪里,但显然我使用的图像无法正常工作。用 paint.NET 打开它们,然后将它们保存为 32 位深度图像似乎已经解决了问题。
我一直在试图解决这个问题。我正在尝试创建一个天空盒,但出于某种原因,无论我做什么,我的立方体贴图始终是黑色的。在片段着色器中,如果我输入像 vec4(1.0f) 这样的输出颜色值,那么我确实会看到我的立方体变白了。这让我觉得可能是我在加载图像,但我检查了一下,它正在加载图像。我确定我只是愚蠢而遗漏了一些东西。
正在创建立方体贴图
glGenTextures(1, &cube_texture);
glBindTexture(GL_TEXTURE_CUBE_MAP, cube_texture);
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);
LoadCubeMapFace(posX, GL_TEXTURE_CUBE_MAP_POSITIVE_X);
LoadCubeMapFace(negX, GL_TEXTURE_CUBE_MAP_NEGATIVE_X);
LoadCubeMapFace(posY, GL_TEXTURE_CUBE_MAP_POSITIVE_Y);
LoadCubeMapFace(negY, GL_TEXTURE_CUBE_MAP_NEGATIVE_Y);
LoadCubeMapFace(posZ, GL_TEXTURE_CUBE_MAP_POSITIVE_Z);
LoadCubeMapFace(negZ, GL_TEXTURE_CUBE_MAP_NEGATIVE_Z);
正在使用 SDL_image
加载图像 void LoadCubeMapFace(const std::string& filename, GLenum face)
{
SDL_Surface *imageSurface = IMG_Load((TEXTURE_PATH + filename).c_str());
if (!imageSurface){
std::cout << "Can't Load image " << filename << " " << IMG_GetError();
return;
}
GLint nOfColors = imageSurface->format->BytesPerPixel;
GLenum textureFormat = GL_RGB;
GLenum internalFormat = GL_RGB8;
if (nOfColors == 4) // contains an alpha channel
{
if (imageSurface->format->Rmask == 0x000000ff){
textureFormat = GL_RGBA;
internalFormat = GL_RGBA8;
}
else
{
textureFormat = GL_BGRA;
internalFormat = GL_RGBA8;
}
}
else if (nOfColors == 3) // no alpha channel
{
if (imageSurface->format->Rmask == 0x000000ff){
textureFormat = GL_RGB;
internalFormat = GL_RGB8;
}
else
{
textureFormat = GL_BGR;
internalFormat = GL_RGB8;
}
}
else
{
std::cout << "ERROR [SDL_Surface -> Texture]: Image is not True Color" << std::endl;
return;
}
glTexImage2D(face, 0, internalFormat, imageSurface->w, imageSurface->h, 0, textureFormat, GL_UNSIGNED_BYTE, imageSurface->pixels);
SDL_FreeSurface(imageSurface);
}
正在渲染立方体贴图
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_CUBE_MAP, texture->GetTextureMap());
GLint texture_uniform = glGetUniformLocation(Skybox::shader->GetShaderProgram(), "cube_map");
glUniform1i(texture_uniform, 0);
VS 和 FS 着色器
#version 150
in vec3 vertex_position_model;
out vec3 the_uv;
uniform mat4 projection_matrix;
uniform mat4 view_matrix;
void main()
{
the_uv = vertex_position_model;
vec4 v = vec4(vertex_position_model, 1.0f);
gl_Position = projection_matrix * view_matrix * v;
}
#version 150
out vec4 FragColor;
in vec3 the_uv;
uniform samplerCube cube_map;
void main()
{
FragColor = texture(cube_map, the_uv);
}
我不确定问题出在哪里,但显然我使用的图像无法正常工作。用 paint.NET 打开它们,然后将它们保存为 32 位深度图像似乎已经解决了问题。