Opengl Skybox没有';不渲染

Opengl Skybox没有';不渲染,opengl,textures,freeimage,skybox,Opengl,Textures,Freeimage,Skybox,我尝试在我的场景中渲染skybox,但它渲染黑色,就像没有正确加载纹理一样。我使用FreeImage库加载纹理: #include <FreeImage.h> 和片段着色器: #version 430 core layout (binding = 0) uniform samplerCube tex_cubemap; in VS_OUT { vec3 tc; } fs_in; layout (location = 0) out vec4 color; void

我尝试在我的场景中渲染skybox,但它渲染黑色,就像没有正确加载纹理一样。我使用FreeImage库加载纹理:

#include <FreeImage.h>
和片段着色器:

#version 430 core

layout (binding = 0) uniform samplerCube tex_cubemap;

in VS_OUT
{
    vec3    tc;
} fs_in;

layout (location = 0) out vec4 color;

void main(void)
{
    color = texture(tex_cubemap, fs_in.tc);
}
不幸的是,render()方法仅渲染黑色矩形。如果在片段着色器中硬编码其他颜色,或在顶点着色器中硬编码顶点坐标,则矩形会更改颜色和位置。我也使用着色器和vao辅助对象类来渲染粒子,所以它们可能很好,问题在于纹理加载

最终效果如下所示:

您至少有两个不同的变量名为
cubeEnum
CSkybox
构造函数的函数范围中声明了一个
cubeEnum
: 另一个
cubeEnum
声明在
readTexture(…)
使用的不同范围内: 我怀疑另一个也称为
cubeEnum
的数组未初始化,因此您正在将垃圾传递给
glTexImage2D(…)
。然而,简单的事实是,您首先不需要数组

此特定枚举集是连续的,因此您可以编写以下内容: 并去掉所有您命名的独立变量
cubeEnum
。那么,在不同的作用域中隐藏相同名称的变量就不再重要了


更新: 此外,您正在使用默认纹理缩小过滤器:
GL\u NEAREST\u MIPMAP\u LINEAR
对没有适当MIPMAP LOD集的立方体贴图(默认情况下,GL纹理具有1000LOD,您仅定义LOD0)。在“mipmap complete”纹理上使用该过滤器会导致未定义的行为,这就是黑色纹理的原因。

您至少有两个不同的变量名为
cubeEnum
CSkybox
构造函数的函数范围中声明了一个
cubeEnum
: 另一个
cubeEnum
声明在
readTexture(…)
使用的不同范围内: 我怀疑另一个也称为
cubeEnum
的数组未初始化,因此您正在将垃圾传递给
glTexImage2D(…)
。然而,简单的事实是,您首先不需要数组

此特定枚举集是连续的,因此您可以编写以下内容: 并去掉所有您命名的独立变量
cubeEnum
。那么,在不同的作用域中隐藏相同名称的变量就不再重要了


更新: 此外,您正在使用默认纹理缩小过滤器:
GL\u NEAREST\u MIPMAP\u LINEAR
对没有适当MIPMAP LOD集的立方体贴图(默认情况下,GL纹理具有1000LOD,您仅定义LOD0)。在“mipmap complete”纹理上使用该过滤器会导致未定义的行为,这就是黑色纹理的原因。

您至少有两个不同的变量名为
cubeEnum
CSkybox
构造函数的函数范围中声明了一个
cubeEnum
: 另一个
cubeEnum
声明在
readTexture(…)
使用的不同范围内: 我怀疑另一个也称为
cubeEnum
的数组未初始化,因此您正在将垃圾传递给
glTexImage2D(…)
。然而,简单的事实是,您首先不需要数组

此特定枚举集是连续的,因此您可以编写以下内容: 并去掉所有您命名的独立变量
cubeEnum
。那么,在不同的作用域中隐藏相同名称的变量就不再重要了


更新: 此外,您正在使用默认纹理缩小过滤器:
GL\u NEAREST\u MIPMAP\u LINEAR
对没有适当MIPMAP LOD集的立方体贴图(默认情况下,GL纹理具有1000LOD,您仅定义LOD0)。在“mipmap complete”纹理上使用该过滤器会导致未定义的行为,这就是黑色纹理的原因。

您至少有两个不同的变量名为
cubeEnum
CSkybox
构造函数的函数范围中声明了一个
cubeEnum
: 另一个
cubeEnum
声明在
readTexture(…)
使用的不同范围内: 我怀疑另一个也称为
cubeEnum
的数组未初始化,因此您正在将垃圾传递给
glTexImage2D(…)
。然而,简单的事实是,您首先不需要数组

此特定枚举集是连续的,因此您可以编写以下内容: 并去掉所有您命名的独立变量
cubeEnum
。那么,在不同的作用域中隐藏相同名称的变量就不再重要了


更新:
此外,您正在使用默认纹理缩小过滤器:
GL\u NEAREST\u MIPMAP\u LINEAR
对没有适当MIPMAP LOD集的立方体贴图(默认情况下,GL纹理具有1000LOD,您仅定义LOD0)。在“mipmap complete”纹理上使用该过滤器会导致未定义的行为,这就是黑色纹理的原因。

是否尝试调用
glGetError()
查看是否报告了任何错误?我还没有详细研究你所有的代码。例如,一个约束是用于立方体贴图的图像必须是正方形(宽度==高度)。您使用的图像就是这种情况吗?调用glTexImage2D()会使glGetError()返回1280(GL_INVALID_ENUM),但我仍然不知道这里出了什么问题。纹理文件很好。我在旧的(OpenGL 2)应用程序中使用了它们。图像是正方形的吗?我怀疑这种错误情况:“G
#version 430 core

out VS_OUT
{
    vec3 tc;
} vs_out;

uniform mat4 view_matrix;

void main(void)
{
    vec3[4] vertices = vec3[4](vec3(-1.0, -1.0, 1.0),
                               vec3( 1.0, -1.0, 1.0),
                               vec3(-1.0,  1.0, 1.0),
                               vec3( 1.0,  1.0, 1.0));

    vs_out.tc = mat3(view_matrix) * vertices[gl_VertexID];

    gl_Position = vec4(vertices[gl_VertexID], 1.0);
}
#version 430 core

layout (binding = 0) uniform samplerCube tex_cubemap;

in VS_OUT
{
    vec3    tc;
} fs_in;

layout (location = 0) out vec4 color;

void main(void)
{
    color = texture(tex_cubemap, fs_in.tc);
}
CSkybox::CSkybox(){
    el::Logger* logger = el::Loggers::getLogger("Skybox");

    GLenum  cubeEnum[6] = {  GL_TEXTURE_CUBE_MAP_POSITIVE_X,
        GL_TEXTURE_CUBE_MAP_NEGATIVE_X,
        GL_TEXTURE_CUBE_MAP_POSITIVE_Y,
        GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,
        GL_TEXTURE_CUBE_MAP_POSITIVE_Z,
        GL_TEXTURE_CUBE_MAP_NEGATIVE_Z };
}
glTexImage2D(cubeEnum[i], 0, internalFormat, iWidth, iHeight, 0, format, GL_UNSIGNED_BYTE, bits);
glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, internalFormat, iWidth, iHeight, 0, format, GL_UNSIGNED_BYTE, bits);