OpenGL(十三) 天空盒 的 shader 实现
2017-06-19 15:05
453 查看
天空盒 的使用可以使用户感觉所处一个封闭的世界环境,使得游戏更加真实。本文主要介绍如何通过OpenGL和GLSL来实现天空盒。
GLuint mainTexture = SOIL_load_OGL_cubemap(
"res/image/right.bmp",
"res/image/left.bmp",
"res/image/top.bmp",
"res/image/bottom.bmp",
"res/image/back.bmp",
"res/image/front.bmp",
0, 0, SOIL_FLAG_POWER_OF_TWO);
//Draw
glBindTexture(GL_TEXTURE_CUBE_MAP, mainTexture);
glUniform1i(originalProgram.GetLocation("U_MainTexture"),0);
cube.Bind(originalProgram.GetLocation("pos"), originalProgram.GetLocation("texcoord"), originalProgram.GetLocation("normal"));
cube.Draw();着色器方面,接收传入的值后,将3D采样纹理绘制出即可。实现shader为://vs
attribute vec3 pos;
attribute vec2 texcoord;
attribute vec3 normal;
uniform mat4 M;
uniform mat4 P;
uniform mat4 V;
varying vec3 V_Texcoord;
void main()
{
V_Texcoord=pos;
gl_Position=P*V*M*vec4(pos,1.0);
}
//fs
varying vec3 V_Texcoord;
uniform samplerCube U_MainTexture;
void main()
{
gl_FragColor=textureCube(U_MainTexture,V_Texcoord);
}
关注我的微信公众号,获取更多优质内容
核心原理
天空盒 的核心原理其实并不复杂,它相当于在视线外套上一个盒子。盒子有6个面,分别使用6张可以拼接在一起的图片。从原理上讲,通过比较视线的xyz,可以找到方向,可以计算出应该渲染的与盒子面的交点,进而选出应绘制的面进行渲染。从实现的角度理解,首先将天空盒与摄像机放在同一位置,然后将盒子绘制出来即可。实现
C++代码方面,通过SOIL可以创建一个cubemap,然后将其传入shader,其接方法如下://CreateGLuint mainTexture = SOIL_load_OGL_cubemap(
"res/image/right.bmp",
"res/image/left.bmp",
"res/image/top.bmp",
"res/image/bottom.bmp",
"res/image/back.bmp",
"res/image/front.bmp",
0, 0, SOIL_FLAG_POWER_OF_TWO);
//Draw
glBindTexture(GL_TEXTURE_CUBE_MAP, mainTexture);
glUniform1i(originalProgram.GetLocation("U_MainTexture"),0);
cube.Bind(originalProgram.GetLocation("pos"), originalProgram.GetLocation("texcoord"), originalProgram.GetLocation("normal"));
cube.Draw();着色器方面,接收传入的值后,将3D采样纹理绘制出即可。实现shader为://vs
attribute vec3 pos;
attribute vec2 texcoord;
attribute vec3 normal;
uniform mat4 M;
uniform mat4 P;
uniform mat4 V;
varying vec3 V_Texcoord;
void main()
{
V_Texcoord=pos;
gl_Position=P*V*M*vec4(pos,1.0);
}
//fs
varying vec3 V_Texcoord;
uniform samplerCube U_MainTexture;
void main()
{
gl_FragColor=textureCube(U_MainTexture,V_Texcoord);
}
总结
通过上面的代码即可在OpenGL中实现 天空盒 的效果。关注我的微信公众号,获取更多优质内容
相关文章推荐
- OpenGL12-shader(GLSL)着色语言4-广告版的实现
- 用OpenGL shader 实现将YUV转RGB(直接调用GPU实现)
- Opengl及D3D以及Shader实现的特效
- OpenGL(二十) 投影 的shader实现
- OpenGL(十九) 阴影 通过ShadowMap的shader实现
- 使用OpenGL Shader实现放大镜效果
- 使用OpenGL Shader实现放大镜效果
- OpenGL中shader读取实现
- OpenGL(十四)环境反射 环境折射 的shader实现
- 通过cocos2d-x的CCGLProgram和CCShaderCache的实现来分析OpenGL
- Modern OpenGL用Shader拾取VBO内单一图元的思路和实现(3)
- OpenGL Shader 绘制天空盒_基础 2
- OPENGL光源(shader部分)整体实现思想
- Modern OpenGL用Shader拾取VBO内单一图元的思路和实现(2)
- [OpenGL] 利用Shader实现复杂地形的渲染
- Opengl及D3D以及Shader实现的特效
- Modern OpenGL用Shader拾取VBO内单一图元的思路和实现
- OpenGL(十五)雾效 的 shader 实现
- OpenGL Shader 绘制天空盒_基础
- OpenGL入门笔记(十三)