OpenGL:天空盒放大太多

     2023-02-22     268

关键词:

【中文标题】OpenGL:天空盒放大太多【英文标题】:OpenGL: Skybox magnified too much 【发布时间】:2015-01-24 17:53:35 【问题描述】:

我正在尝试在游戏中实现天空盒。我使用的图片是:

不幸的是,它被极度放大,只显示了纹理的几个像素。它看起来像这样:

这是我创建天空盒的代码:

SkyBox::SkyBox()


    programID = LoadShaders("Resources/Shaders/skybox.vert", "Resources/Shaders/skybox.frag");

    pID = glGetUniformLocation(programID, "P");
    vID = glGetUniformLocation(programID, "V");

    float points[] =
    
        -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
    ;
    glGenBuffers (1, &vbo);
    glBindBuffer (GL_ARRAY_BUFFER, vbo);
    glBufferData (GL_ARRAY_BUFFER, sizeof (points), points, GL_STATIC_DRAW);

    const char *pth = "/Users/uonibr/Documents/Programming/Space Shooter/Space Shooter/Space Shooter/Resources/space.jpg";

    createCubeMap(pth, pth, pth, pth, pth, pth);



bool load_cube_map_side (GLuint texture, GLenum side_target, const char* file_name)

    glBindTexture (GL_TEXTURE_CUBE_MAP, texture);

    int x, y;
    unsigned char*  image_data = SOIL_load_image(file_name, &x, &y, 0, SOIL_LOAD_RGBA);
    if (!image_data) 
        fprintf (stderr, "ERROR: could not load %s\n", file_name);
        return false;
    
    // non-power-of-2 dimensions check
    if ((x & (x - 1)) != 0 || (y & (y - 1)) != 0) 
        fprintf (
                 stderr, "WARNING: image %s is not power-of-2 dimensions\n", file_name
                 );
    

    // copy image data into 'target' side of cube map
    glTexImage2D (
                  side_target,
                  0,
                  GL_RGBA,
                  x,
                  y,
                  0,
                  GL_RGBA,
                  GL_UNSIGNED_BYTE,
                  image_data
                  );
    free (image_data);
    return true;



void SkyBox::createCubeMap ( const char* front, const char* back, const char* top, const char* bottom, const char* left,const char* right)

    // generate a cube-map texture to hold all the sides
    glActiveTexture (GL_TEXTURE0);
    glGenTextures (1, &cubeMap);

    // load each image and copy into a side of the cube-map texture
    assert(load_cube_map_side (cubeMap, GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, front));
    assert(load_cube_map_side (cubeMap, GL_TEXTURE_CUBE_MAP_POSITIVE_Z, back));
    assert(load_cube_map_side (cubeMap, GL_TEXTURE_CUBE_MAP_POSITIVE_Y, top));
    assert(load_cube_map_side (cubeMap, GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, bottom));
    assert(load_cube_map_side (cubeMap, GL_TEXTURE_CUBE_MAP_NEGATIVE_X, left));
    assert(load_cube_map_side (cubeMap, GL_TEXTURE_CUBE_MAP_POSITIVE_X, right));

    // format cube map texture
    glTexParameteri (GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    glTexParameteri (GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexParameteri (GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, 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);

这是天空盒的渲染代码:

void SkyBox::render(const Camera &camera) const

    glDepthMask (GL_FALSE);
    glUseProgram (programID);
    glActiveTexture (GL_TEXTURE0);
    glBindTexture (GL_TEXTURE_CUBE_MAP, cubeMap);
    glUniformMatrix4fv(pID, 1, GL_FALSE, &camera.getProjectionMatrix()[0][0]);
    glm::mat4 view = camera.getRotationMatrix();
    glUniformMatrix4fv(vID, 1, GL_FALSE, &view[0][0]);
    glEnableVertexAttribArray (0);
    // 1st attribute buffer : vertices
    glEnableVertexAttribArray(0);
    glBindBuffer(GL_ARRAY_BUFFER, vbo);
    glVertexAttribPointer(
                          0,                  // attribute. No particular reason for 0, but must match the layout in the shader.
                          3,                  // size
                          GL_FLOAT,           // type
                          GL_FALSE,           // normalized?
                          0,                  // stride
                          (void*)0            // array buffer offset
                          );

    glBindBuffer(GL_ARRAY_BUFFER, vbo);
    glDrawArrays (GL_TRIANGLES, 0, 36);

    glDisableVertexAttribArray(0);
    glDepthMask (GL_TRUE);
    glCullFace(GL_BACK);


片段着色器很简单:

#version 330 core

in vec3 texcoords;
uniform samplerCube cube_texture;
out vec4 frag_color;

void main () 
    frag_color = texture (cube_texture, texcoords);

和顶点着色器一样:

#version 330 core

in vec3 vp;
uniform mat4 P, V;
out vec3 texcoords;

void main () 
    texcoords = vp;
    gl_Position = P * V * vec4 (vp, 1.0);


编辑: 这是我生成投影矩阵的代码:

glm::mat4 Camera::getProjectionMatrix() const

    return glm::perspective(FoV, 4.0f / 3.0f, 0.1f, 100.0f);

这是我的 FoV:

 float FoV = 3.14159 * 65. / 180;

【问题讨论】:

投影矩阵可能有问题。如果您使用 FOV 非常小的截锥体,可能会导致这种行为。 我编辑了我的问题以添加投影矩阵代码的样子 glm::perspective 不是以度数而不是弧度为单位的 FOV 吗?尝试只为您的 FOV 使用 65。 【参考方案1】:

我确定了问题: 当我应该通过度数时,我将弧度传递给 glm::perspective() 函数。因此,正如对该问题的评论,答案是一个小的 FoV

【讨论】:

OpenGL 在延迟渲染器中实现天空盒

】OpenGL在延迟渲染器中实现天空盒【英文标题】:OpenGLimplementingskyboxinadeferredrenderer【发布时间】:2015-12-1922:46:16【问题描述】:我试图弄清楚如何在延迟渲染器中渲染天空盒,以便它可以包含在后期处理效果中,但是我的几何... 查看详情

透明天空盒+透明高度图的OpenGL混合问题

】透明天空盒+透明高度图的OpenGL混合问题【英文标题】:OpenGLBlendingproblemwithtransparentskybox+transparentheightmap【发布时间】:2011-02-2619:54:26【问题描述】:这是我的问题。在我渲染一个带有6个透明多边形(GL_BLEND、源GL_ONE、目标GL_ON... 查看详情

✠opengl-9-天空和背景(代码片段)

目录天空盒天空穹顶实现天空盒从头开始构建天空盒使用OpenGL立方体贴图分析矩阵中值的存储及mat4转mat3原理环境贴图关于reflect函数补充说明天空盒或天空穹顶提供了有效且相对简单的方法,用来生成令人信服的地平线景观... 查看详情

opengl学习脚印:立方体纹理和天空包围盒(cubemapsandskybox)

...我的github下载。本节内容整理自:1.Tutorial25:SkyBox2.www.learnopengl.comCubemaps创建Cubemap 查看详情

GLSL 纹理函数只为天空盒返回黑色

...:我正在尝试通过使用GLSL对四边形进行纹理化来为我的OpenGL场景生成天空盒。但是,当我尝试使用纹理生成天空盒颜色时,天空盒会变成黑色。天空框在我手动设置颜色时起作用,所以我基本上将问题缩小到我设置纹理的方式... 查看详情

基于opengl的基础渲染器

一、项目分工刘星魁:实现所有的功能 二、需求分析参考主流的渲染引擎,实现基本的摄影机,天空盒,模型,贴图,粒子系统,以及漫游功能2.软件需求规格说明书   三、原型设计使用素材:  1.天空盒的上... 查看详情

怎么使用深空盒子材质

Unity中,天空盒是使用天空盒着色器的一种材质。有关可用的天空盒着色器的信息,请参阅天空盒着色器。渲染管线兼容性内置渲染管线和通用渲染管线(URP)都专门使用天空盒来渲染天空。这些天空盒是使用天空盒着色器的材质... 查看详情

Unity 自定义天空盒,如 Unity 天空盒

】Unity自定义天空盒,如Unity天空盒【英文标题】:UnitycustomskyboxlikeUnityskybox【发布时间】:2017-09-1318:29:23【问题描述】:我正在尝试为360图像做一个自定义天空盒,它有2个带有淡入淡出的纹理,我需要它来响应旋转值,如UnitySky... 查看详情

小功能⭐️unity动态更换天空盒旋转天空盒(代码片段)

文章目录🟥Unity动态更换天空盒1️⃣方法12️⃣方法2🟧旋转天空盒🟥Unity动态更换天空盒1️⃣方法11、在摄像头上添加SkyBox组件放到其他地方不管用。2、创建SkyBox类型的的材质球。放入即可。3、通过代码,你便... 查看详情

unity中怎样设置动态天空盒,让天空盒上的云动起来

参考技术A可以使用UniSky插件,百度UniSky入门资料。UniSky可以用代码控制天空盒随游戏时间的变化而变化,设定太阳的颜色等。本回答被提问者采纳 查看详情

OpenGL/GLSL/GLM - Skybox 像第三人称一样旋转

】OpenGL/GLSL/GLM-Skybox像第三人称一样旋转【英文标题】:OpenGL/GLSL/GLM-Skyboxrotatesasifin3rdperson【发布时间】:2012-08-2200:44:09【问题描述】:我刚刚开始使用OpenGL/GLSL和GLM作为我的数学库来实现天空盒。我认为问题与矩阵有关,我无法... 查看详情

androidopengles2.0(十七)——球形天空盒vr效果实现(代码片段)

在3D游戏中通常都会用到天空盒,在3D引擎中也一般会存在天空盒组件,让开发者可以直接使用。那么天空盒是什么?天空盒又是如何实现的呢?本篇博客主要介绍如何在Android中利用OpenGLES绘制一个天空盒,并... 查看详情

2022-02-15u3d全栈班007-制作设置天空盒资源

文章目录前言一、制作设置天空盒资源1.下载资源2.创建材质3.Material赋值贴图4.渲染场景5.渲染组件6.渲染组件总结前言在使用Unity开发游戏的时候,设置天空盒肯定是必不可少的。如果使用3D建模,建出天空盒放在场景中会比较麻... 查看详情

directx11withwindowssdk--23立方体映射:动态天空盒的实现(代码片段)

前言上一章的静态天空盒已经可以满足绝大部分日常使用了。但对于自带反射/折射属性的物体来说,它需要依赖天空盒进行绘制,但静态天空盒并不会记录周边的物体,更不用说正在其周围运动的物体了。因此我们需要在运行... 查看详情

unity5.6.2删除或更换天空盒

点击菜单栏Window-->Lighting-->Settings在弹出的窗口中,设置SkyboxMaterial选项,从原来的默认天空盒更换成别的,或者选择None来删除天空盒。 默认的天空盒会影响到场景中的灯光效果。  查看详情

unity切换天空盒地面倒影

参考技术Amskybox写一个程序性的天空盒子切换天空盒。地面倒影可以用vray平面或者做个带斜面的反光板,这样效果很好,地面材质要有折射在有倒影的物体上面增加反射效果。 查看详情

cesium之天空盒对应方位(代码片段)

下文讲解一下关于Cesium的天空盒具体方位。天空盒对应图一个立方体展开图,相当于一个站在negz的位置,背对电脑屏幕,对应关系如下negz→downposx→rightnegx→leftposy→backposz→upnegy→front分享一个天空盒网址www.custommapmakers.o... 查看详情

关于unity中如何代码动态修改天空盒

在Unity中动态修改天空盒有两种方法:一、为每个Texture建立天空盒材质球,需要更换时直接将对应材质球作为天空盒,缺点是建立的材质球太多 privatevoidChangeSkybox(MaterialnewSkybox){RenderSettings.skybox=newSkybox;} 二、只创建一个... 查看详情