关键词:
【中文标题】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;} 二、只创建一个... 查看详情